定时器的应用(二):无缝滚动
2016-02-02 00:37
621 查看
定时器的应用(二):无缝滚动
所谓的“无缝滚动”,其实就是我们在网页上经常看到的广告滚动条,主要是用到开启实施定时器和关闭实时定时器的知识。(一)首先,我们需要用HTML来搭建一个框架。
<!doctype html> <html> <head> <meta charset="utf-8"> <title>无缝滚动</title> <style> *{margin:0;padding:0;} #div1{width:712px; height:108px; margin:100px auto; position:relative; background:red;} #div1 ul{position:absolute; left:0; top:0; } #div1 ul li{list-style:none; float:left; width:178px; height:108px;} #btn1{margin:20px auto;} #btn2{margin:20px auto;} </style> </head> <body> <center> <input type="button" id="btn1" value="向左走"/> <input type="button" id="btn2" value="向右走"/> </center> <div id="div1"> <ul> <li><img src="img2/1.jpg"/></li> <li><img src="img2/2.jpg"/></li> <li><img src="img2/3.jpg"/></li> <li><img src="img2/4.jpg"/></li> </ul> </div> </body> </html>(需要提醒大家的是:想要看该功能的效果的话,需要自己找四张图片来替代我在demo中用到的图片,然后再运行最后的demo)
需要做一下解释的地方是:
①总的div框架使用的是相对定位(relative),而ul使用的是绝对定位(absolute)。目的是:在滚动过程中,滚动的是ul整体(四张图片一起滚动),而不是一张张的图片。而且在绝对定位中我们可以使用left,top这两个属性,在JavaScript中我们是通过改变left的属性值来使图片滚动起来的。
②在div的样式中最好设置背景颜色,方便在JavaScript中查看问题。
(二)接下来,我们添加JavaScript语句,并一步一步完成功能:
首先我们需要提取HTML文件中有用的信息。window.onload=function() { var oDiv=document.getElementById("div1"); var oUl=oDiv.getElementsByTagName("ul")[0]; var aLi=oDiv.getElementsByTagName("li"); var aBtn=document.getElementsByTagName("input"); }
功能①:使用实时定时器 setInterval,使图片滚动起来。
var timer=null; timer=setInterval(function(){oUl.style.left=oUl.offsetLeft-2+'px';},30);//向左滚动出现的问题是:当滚动完四张图片后,就只剩下背景红色区域。我们自然而然的就会想到要增加图片(将div区域内图片赋值翻倍使用)。
功能②:复制div区域内容。
oUl.innerHTML=oUl.innerHTML+oUl.innerHTML; oUl.style.width=aLi[0].offsetWidth*aLi.length+'px';问题是:翻倍的图片先是以两行的形式出现,后成一行,等图片滚动完后仍然只是剩下红色背景区域。
功能③:当向左移动的距离达到八张图片总宽度一般是,就将图片快速抽回,重新开始滚动(即将oUl.style.left设置成零)
if(oUl.offsetLeft<-oUl.offsetWidth/2) { oUl.style.left=0; }需要注意的是:向左移动时,offsetLeft值为负数,(offsetLeft:向左偏移的距离)。而oUl.offsetWidth值为正数,(oUl.offsetWidth:滚动区域的总宽度),所以,负号是不能够丢弃的。这样我们就实现了无缝滚动(向左滚动)。
为了使效果更好一些,我们需要在div的属性中添加一句:overflow:hidden;
其次,如果想要实现向右滚动,我们只需要对功能①③做些改动即可。
timer=setInterval(function(){oUl.style.left=oUl.offsetLeft+2+'px';},30);//向右滚动
if(oUl.offsetLeft>0) { oUl.style.left=-oUl.offsetWidth/2+'px'; }下面是完整代码,希望对大家有帮助。(我是当做了一些改动,添加了两个按钮,默认状态是:向左滚动,点击“向右走”按钮,图片就会向右无缝滚动,点击“向左走”按钮,图片就会向左滚动。)
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>无缝滚动</title>
<style>
*{margin:0;padding:0;}
#div1{width:712px; height:108px; margin:100px auto; position:relative; background:red; overflow:hidden;}
#div1 ul{position:absolute; left:0; top:0; }
#div1 ul li{list-style:none; float:left; width:178px; height:108px;}
#btn1{margin:20px auto;}
#btn2{margin:20px auto;}
</style>
<script>
window.onload=function()
{
var oDiv=document.getElementById("div1");
var oUl=oDiv.getElementsByTagName("ul")[0];
var aLi=oDiv.getElementsByTagName("li");
var speed=-2;
var aBtn=document.getElementsByTagName("input");
oUl.innerHTML=oUl.innerHTML+oUl.innerHTML; oUl.style.width=aLi[0].offsetWidth*aLi.length+'px';
function move(){
if(oUl.offsetLeft<-oUl.offsetWidth/2) { oUl.style.left=0; }
//oUl.style.left=oUl.offsetLeft-2+'px'; //向左滚动
//向右滚动:
if(oUl.offsetLeft>0) { oUl.style.left=-oUl.offsetWidth/2+'px'; }
aBtn[0].onclick=function(){speed=-2;};
aBtn[1].onclick=function(){speed=2;};
oUl.style.left=oUl.offsetLeft+speed+'px';
}
setInterval(move,30);
};
</script>
</head>
<body>
<center>
<input type="button" id="btn1" value="向左走"/>
<input type="button" id="btn2" value="向右走"/>
</center>
<div id="div1">
<ul>
<li><img src="img2/1.jpg"/></li>
<li><img src="img2/2.jpg"/></li>
<li><img src="img2/3.jpg"/></li>
<li><img src="img2/4.jpg"/></li>
</ul>
</div>
</body>
</html>
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- Redux系列02:一个炒鸡简单的react+redux例子
- JavaScript 各种遍历方式详解
- call/apply/bind 的理解与实例分享
- 如何创建对象以及jQuery中创建对象的方式
- 数组方法汇总