<!doctype html>
<html>
<head>
<title>tweets-slide</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<style type="text/css">
ul, li {margin:0; padding:0;list-style:none}
body {
margin: 0;
height: 100%;
background: #333;
}
.wp {
position: relative;
width: 800px;
height: 400px;
overflow: hidden;
margin: 20px auto;
border: 4px solid #121212;
background: #fff;
}
.slider {
position: absolute;
width: 760px;
padding: 0 20px;
left:0;
top: 0;
}
.fl {float:left}
.slider img {display:block; padding: 2px; border: 1px solid #ccc}
.slider div {padding: 20px 0; border-bottom: 1px dashed #ccc;overflow:hidden;width:100%}
.slider p {font-size: 12px;margin:0;padding-left:68px;color:#333;line-height:20px;}
</style>
<script type="text/javascript">
var slider = function () {
//实例化该函数 参数已数组的形式传递 o {id: '', at: '', o:''}
function init (o) {
this.id = o.id;//要滚动的父元素id
this.at = o.auto ? o.auto : 2;//是否自动滚动 滚动的时间 3秒
this.o = 0;//开始的高度
this.pos();// 设置相对位置
}
/**
*通过prototype对象来定义函数
*
*/
init.prototype = {
//初始化位置 清除定时器
pos : function () {
clearInterval(this.__b);
this.o = 0;
var el = document.getElementById(this.id);//获取父容器对象
var li = el.getElementsByTagName('div');//获取对象内的滚动元素
var l = li.length;//滚动元素个数
var _t = li[l-1].offsetHeight;//获取最后一个滚动元素的高度_t
var cl = li[l-1].cloneNode(true);//把最后一个元素拷贝一份到cl中
cl.style.opacity = 0;//设置元素的滤镜为透明的
cl.style.filter = 'alpha(opacity=0)';
el.insertBefore(cl, el.firstChild);//把该元素添加到容器的最上方
el.style.top = -_t + 'px';//设置相对容器的高度为负值
this.anim();//开始动画
},
//调用setInterval 为了平滑设为20毫秒调用一次
anim : function () {
var _this = this;
this.__a = setInterval(function(){_this.animH()}, 20);
},
//移动的方法
animH : function () {
var _t = parseInt(document.getElementById(this.id).style.top);//获取ul的top高度值
var _this = this;
if (_t >= -1) {//如果高度大于-1 则清除定时器 设置top为零 调用下一个滚动方法anim0()
clearInterval(this.__a);
document.getElementById(this.id).style.top = 0;
var list = document.getElementById(this.id).getElementsByClassName('divlist');
document.getElementById(this.id).removeChild(list[list.length-1]);
this.__c = setInterval(function(){_this.animO()}, 20);
//this.auto();
}else {//设置高度和滤镜为不透明的
var __t = Math.abs(_t) - Math.ceil(Math.abs(_t)*.07);
document.getElementById(this.id).style.top = -__t + 'px';
}
},
//滚动设置滤镜透明值
animO : function () {
this.o += 2;
if (this.o == 100) {
clearInterval(this.__c);
document.getElementById(this.id).getElementsByClassName('divlist')[0].style.opacity = 1;
document.getElementById(this.id).getElementsByClassName('divlist')[0].style.filter = 'alpha(opacity=100)';
this.auto();
}else {
document.getElementById(this.id).getElementsByClassName('divlist')[0].style.opacity = this.o/100;
document.getElementById(this.id).getElementsByClassName('divlist')[0].style.filter = 'alpha(opacity='+this.o+')';
}
},
//开始定时器 循环调用
auto : function () {
var _this = this;
this.__b = setInterval(function(){_this.pos()}, this.at*1000);
},
stop : function () {
var _this = this;
clearInterval(this.__b);
clearInterval(this.__c);
}
}
return init;
}();
</script>
</head>
<body>
<div class="wp">
<div id="slider" class="slider" onmouseover = "gundong.stop()" onmouseout = "gundong.auto()">
<div class="divlist">
<a class="fl" href="javascript:;"><img src="http://pic.cnblogs.com/face/u160412.jpg" alt="" /></a>
<p>滚动的原理:1.css的相对定位 2.setinterval的循环移动 3. 透明滤镜</p>
</div>
<div class="divlist"><a class="fl" href="javascript:;"><img src="http://pic.cnblogs.com/face/u160412.jpg" alt="" /></a>
<p>滚动就是这样的简单 原理明白就可以了<br/>
和激光焊接刚看了就空间
和激光焊接刚看了就空间<br/>
和激光焊接刚看了就空间。
和激光焊接刚看了就空间
安得与君相诀绝,免教生死作相思。</p>
</div>
<div class="divlist"><a class="fl" href="javascript:;"><img src="http://pic.cnblogs.com/face/u160412.jpg" alt="" /></a>
<p>setinterval函数和settimeout函数用法<br/>
</p>
</div>
<div class="divlist"><a class="fl" href="javascript:;"><img src="http://pic.cnblogs.com/face/u160412.jpg" alt="" /></a>
<p>设置多长时间后把该方法加入到js的执行队列中,不一定立即执行
</p>
</div>
</div>
</div>
<script type="text/javascript">
var gundong = new slider({id:'slider'})
</script>
</body>
</html>