html5图片无限循环播放,原生js实现无限循环轮播图效果

本文详细介绍了如何使用HTML5和原生JavaScript实现图片无限循环轮播的效果,包括通过偏移距离判断跳转、图片圆点高亮、动画滚动和响应式点击事件。此外,还讲解了自动播放功能的实现,以及如何添加鼠标悬停暂停和移开继续播放的效果。通过这段代码,读者可以理解轮播图的基本工作原理,并应用于自己的项目中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

知识要点

1.实现无限循环的原理:

以偏移的距离来判断是否跳回第一张和最后一张

也可以利用循环判断图片的当前索引值

var newLeft=parseInt(list.style.left)+offset;//当前的偏移量+下一次的偏移量=新的偏移量

list.style.left=newLeft+"px";//当前的偏移值=新的偏移值

//以偏移的距离来判断是否跳回第一张和最后一张

if(newLeft>-600){

list.style.left=-3000+"px";

}

if (newLeft

list.style.left=-600+"px";

}

2.当前图片轮播的圆点变色显示:

因为每次点击index+1 所以当前的index-1就是button的索引

//添加on前先清空on

for(var i=0;i

if(buttons[i].className=="on"){

buttons[i].className="";

break;

}

}

buttons[index-1].className="on";

3.实现动画滚动效果:

原理就是把每次的偏移量分为多次完成比如一次600px那就分为10次每次偏移60px

就要用到setTimeout(go,10);//10毫秒再次调用go函数,一直到不满足条件就停

var newLeft=parseInt(list.style.left)+offset;//当前的偏移量+下一次的偏移量=新的偏移量

var time=300;//位移总时间

var interval=10;//位移间隔时间

//动画效果自定义公式: 每次位移的距离=单次偏移距离/位移次数

var speed=offset/(time/interval);

//递归函数 直到不满足条件(跳到辅助图)

//递归就是把600偏移量分为多次完成偏移

function go(){

//speed<0 并且 当前偏移量>下一次偏移量 就是向左偏移 || 反之向右偏移

if ((speed<0 &&parseInt(list.style.left)>newLeft) || (speed>0 &&parseInt(list.style.left)

list.style.left=parseInt(list.style.left)+speed+"px";//每次位移的值

setTimeout(go,interval);//10毫秒再次调用go函数

}else{

animated=false;

list.style.left=newLeft+"px";//当前的偏移值=新的偏移值

if(newLeft>-600){

list.style.left=-3000+"px";

}

if (newLeft

list.style.left=-600+"px";

}

}

}

4.点击圆点按钮执行动画:

原理获取当前的按钮位置再获取要点击的按钮的位置

用(点击的——当前的)*-600=需要跳转的正负距离(向左或向右)

for(var i=0;i

buttons[i].onclick=function(){

if(this.className=="on"){

return;

}

//要点击的index属性的值 转换为整数

var myIndex=parseInt(this.getAttribute("index"));

//偏移量=-600*(要点击的位置-当前所在的位置),当前的位置就是index循环所得

var os=-600*(myIndex-index);

//切换完成后,把点击的index位置变成当前的index位置

index=myIndex;

showButton();

if(!animated){

animate(os);

}

}

}

5.自动播放:

给外层容器加个onmouseover事件再调用setInterval方法

//给方法定义全局变量是因为停止的时候要使用

function play(){

timer=setInterval(function(){

next.onclick();

},3000);

}

clearInterval(timer)

完整代码

注:图片链接本地替换一下

demo

body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend,button,input,textarea,th,td{margin:0;padding:0;}

h1,h2,h3,h4,h5,h6{font-size:100%;}

address,cite,dfn,em,var{font-style:normal;}

code,kbd,pre,samp{font-family:courier new,courier,monospace;}

ul,ol{list-style:none;}

a{text-decoration:none;}

a:hover{text-decoration:none;}

sup{vertical-align:text-top;}

sub{vertical-align:text-bottom;}

legend{color:#000;}

fieldset,img{border:0;}

button,input,select,textarea{font-size:100%;}

table{border-collapse:collapse;border-spacing:0;}

.clear{clear: both;float: none;height: 0;overflow: hidden;}

#container{width: 600px; height: 400px; overflow: hidden; position: relative; }

#list{width: 4200px; height: 400px; position: absolute; z-index: 1;}

#list img{float: left;}

#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;}

//在页面加载完后立即执行多个函数方案。

function addloadEvent(func){

var oldonload=window.onload;

if(typeof window.onload !="function"){

window.onload=func;

}

else{

window.onload=function(){

if(oldonload){

oldonload();

}

func();

}

}

}

//在页面加载完后立即执行多个函数方案结束。

addloadEvent(lbt);

//轮播图动画切换原理

function lbt(){

var container=document.getElementById("container");

var prev=document.getElementById("prev");

var next=document.getElementById("next");

var list=document.getElementById("list");

var buttons=document.getElementById("buttons").getElementsByTagName("span");

var imgs=list.getElementsByTagName("img");

var index=1;

var animated=false;

var timer;

//当前图片轮播的圆点变色显示,原理:index数值是跟随list滑动次数递增的,第一次index=1,所以第一个button的索引值就是0。

//for循环是添加on样式之前要清空之前的on。

function showButton(){

for(var i=0;i

if(buttons[i].className=="on"){

buttons[i].className="";

break;

}

}

buttons[index-1].className="on";

}

//圆点变色显示 结束。

function animate(offset){

animated=true;

var newLeft=parseInt(list.style.left)+offset;//当前的偏移量+下一次的偏移量=新的偏移量

var time=300;//位移总时间

var interval=10;//位移间隔时间

//动画效果自定义公式: 每次位移的距离=单次偏移距离/位移次数

var speed=offset/(time/interval);

//递归函数 直到不满足条件(跳到辅助图)

//递归就是把600偏移量分为多次完成偏移

function go(){

//speed<0 并且 当前偏移量>下一次偏移量 就是向左偏移 || 反之向右偏移

if ((speed<0 &&parseInt(list.style.left)>newLeft) || (speed>0 &&parseInt(list.style.left)

list.style.left=parseInt(list.style.left)+speed+"px";//每次位移的值

setTimeout(go,interval);//10毫秒再次调用go函数

}else{

animated=false;

list.style.left=newLeft+"px";//当前的偏移值=新的偏移值

if(newLeft>-600){

list.style.left=-3000+"px";

}

if (newLeft

list.style.left=-600+"px";

}

}

}

go();

}

//自动播放3秒执行一次next.onclick

function play(){

timer=setInterval(function(){

next.onclick();

},3000);

}

function stop(){

clearInterval(timer);

}

//执行所有函数

next.onclick=function(){

if(index==5){

index=1;

}else{

index+=1;

}

showButton();

if(!animated){

animate(-600);

}

}

//执行所有函数

prev.onclick=function(){

if(index==1){

index=5;

}else{

index-=1;

}

showButton();

if(!animated){

animate(600);

}

}

//点击圆点按钮 偏移

for(var i=0;i

buttons[i].onclick=function(){

if(this.className=="on"){

return;

}

//要点击的index属性的值 转换为整数

var myIndex=parseInt(this.getAttribute("index"));

//偏移量=-600*(要点击的位置-当前所在的位置),当前的位置就是index循环所得

var os=-600*(myIndex-index);

//切换完成后,把点击的index位置变成当前的index位置

index=myIndex;

showButton();

if(!animated){

animate(os);

}

}

}

container.onmouseover=stop;

container.onmouseout=play;

play();

}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值