js焦点轮播图
汇集网上焦点轮播图的实现方式,自己试了下,不过鼠标悬浮停止动画和鼠标离开动画播放好像没生效,不太明白,最后两行代码中,为什么可以直接写stop和play。不用加括号调用函数么?求懂的大神指点!
所用知识点:
1.DOM操作
2.定时器
3.事件运用
4.Js动画
5.函数递归
6.无限滚动大法(可以用js实现一个假图的制作。不过说实话一直理解不了假图的作用原理)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | <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>
<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>
分类:
javascript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南