汇集网上焦点轮播图的实现方式,自己试了下,不过鼠标悬浮停止动画和鼠标离开动画播放好像没生效,不太明白,最后两行代码中,为什么可以直接写stop和play。不用加括号调用函数么?求懂的大神指点!
所用知识点:
1.DOM操作
2.定时器
3.事件运用
4.Js动画
5.函数递归
6.无限滚动大法(可以用js实现一个假图的制作。不过说实话一直理解不了假图的作用原理)
<style> * { margin: 0; padding: 0; } a { text-decoration: none; } body { padding: 20px; } #container { width: 600px; /*这里600x400是图片的宽高*/ height: 400px; border: 3px solid #333; overflow: hidden; /*隐藏溢出的图片,因为图片左浮动,总宽度为4200*/ position: relative; } #list { width: 4200px; /*这里设置7张图片总宽度*/ height: 400px; position: absolute; /*基于父容器container进行定位*/ z-index: 1; } #list img { float: left; width:610px; } #buttons { position: absolute; height: 10px; width: 100px; z-index: 2; /*按钮在图片的上面*/ bottom: 20px; left: 250px; } #buttons span { cursor: pointer; float: left; border: 1px solid #fff; width: 10px; height: 10px; border-radius: 50%; background: #333; margin-right: 5px; } #buttons .on { background: orangered; /*选中的按钮样式*/ } .arrow { cursor: pointer; display: none; /*左右切换按钮默认先隐藏*/ line-height: 39px; text-align: center; font-size: 36px; font-weight: bold; width: 40px; height: 40px; position: absolute; z-index: 2; top: 180px; background-color: RGBA(0, 0, 0, .3); color: #fff; } .arrow:hover { background-color: RGBA(0, 0, 0, .7); } #container:hover .arrow { display: block; /*当鼠标放上去容器上面就显示左右切换按钮*/ } #prev { left: 20px; } #next { right: 20px; } </style>
<div id="container"> <div id="list" style="left: -600px;"> <img src="5.jpg" alt="1"/> <img src="1.jpg" alt="1"/> <img src="2.jpg" alt="2"/> <img src="3.jpg" alt="3"/> <img src="4.jpg" alt="4"/> <img src="5.jpg" alt="5"/> <img src="1.jpg" alt="5"/> </div> <div id="buttons"> <span index="1" class="on"></span> <span index="2"></span> <span index="3"></span> <span index="4"></span> <span index="5"></span> </div> <a href="javascript:void(0);" id="prev" class="arrow"><</a> <a href="javascript:void(0);" id="next" class="arrow">></a></div>
<script> window.onload = function(){ var container=document.getElementById('container'); var list=document.getElementById('list'); var buttons=document.getElementById('buttons').getElementsByTagName('span'); var next=document.getElementById('next'); var prev=document.getElementById('prev'); var index=1; var len=5;//图片的数量 var animated=false;//用于判断切换是否进行 var interval=3000; //自动播放定时器的秒数,3秒 var timer; //定时器 // 切换动画 function animate(offset){ animated=true; //切换进行中 var time=300; //位移总时间 var inteval=10; //位移间隔时间 var speed=offset/(time/inteval); //每次位移量 var newLeft=parseInt(list.style.left)+offset; var go=function(){ if((speed<0&&parseInt(list.style.left)>newLeft)||(speed>0&&parseInt(list.style.left)>newLeft)){ list.style.left=parseInt(list.style.left)+speed+'px'; setTimeout(go,inteval); }else{ animated=false; list.style.left=newLeft+'px'; if(newLeft<-3000){ list.style.left=-600+'px'; } if(newLeft>-600){ list.style.left=-3000+'px'; } } } go(); /*var newLeft=parseInt(list.style.left)+offset; list.style.left=newLeft+'px'; if(newLeft<-3000){ list.style.left=-600+'px'; } if(newLeft>-600){ list.style.left=-3000+'px'; }*/ } // 为按钮添加样式 function showButton(){ for(var i=0;i<buttons.length;i++){ if(buttons[i].className=='on'){ buttons[i].className=''; break; } } buttons[index-1].className='on'; } next.onclick=function(){ if(animated){ return; } if(index==5){ index=1; }else{ index+=1; } animate(-600); showButton(); } prev.onclick=function(){ if(animated){ return; } if(index==1){ index=5; }else{ index-=1; } animate(600); showButton(); } // 通过循环为按钮添加点击事件 for(var i=0;i<buttons.length;i++){ buttons[i].onclick=function(){ if(animated){ return; } // 当继续点击当前按钮的时候,不进行切换 if(this.className == 'on'){ return; } // 通过获取按钮标签的自定义属性Index 得到索引值,再计算差值 var myIndex = parseInt(this.getAttribute('index')); //真正的偏移量 var offset = -600*(myIndex-index); animate(offset); index=myIndex; showButton(); } // 自动播放 function play(){ timer=setTimeout(function(){ next.onclick(); play(); },interval) } function stop(){ clearTimeout(timer); } container.onmouseover=stop; container.onmouseout=play; play(); } } </script>