JS原生实现图片轮播切换效果

8 篇文章 0 订阅

首先来分析一下轮播图效果的实现原理:

1、父元素作为显示窗口,大小固定超出部分隐藏,即设置overflow:hidden;

2、子元素存放图片列表用ul,ul固定定位,参照为父元素,即父元素position:relative;ul元素position:absolute;

3、一个li即一张图片的宽度为父元素的显示宽度

4、初始时,ul的left为0,这时第一张图片即第一个li显示

5、点击下一张按钮,将整个ul左移,使第二个li对齐父元素的左边框,此时ul的left为负的一个li的宽度

6、点击上一张按钮,将整个ul右移

7、对特殊情况进行处理,即第一张图时点上一张,最后一张图时点下一张

第一张图时点上一张,我们滚动到最后一张图,整个ul左移,即把left值改为负的n-1张图的宽度;

最后一张图时点下一张,我们滚到第一张图的位置,整个ul右移,即把left值改为0

用一张图来帮助理解:

修改ul元素的left值很简单ul.style.left=设定值,就可以了,但我们想有一个滑动的效果,那我们需要用setInterval来实现

最后的效果如下:(文章最后有封装好的方法)

动图不能录制太大CSDN有2M的限制_(:зゝ∠)_

下面放代码

 

关于上一页下一页按钮点击过快出现的bug想到了两种解决方法:

首先说一下出现bug的原因:问题出在goRoll方法里,停止定时器的条件是图片到达目标位置,快速点击导致这个位置判断存在问题。

解决方法1:点击按钮后将按钮隐藏,图片滚动完成再显示按钮

解决方法2:把prev.style.display="none"这种设置改成prev.οnclick=修改,这种需要把之前的onclick方法拿出来感觉写起来比方法1麻烦我就不写了

 

思路就是,当进入goRoll方法里,给两个按钮的点击方法清空,当轮播完成再给两个按钮加上图片滚动的正确方法

最后放上封装的方法:(采用解决方法1)

 

var nav=document.getElementById("nav").getElementsByTagName("li");
        var img=document.getElementById("imgList");//ul父元素
        var prev=document.getElementById("prev");//上一张
        var next=document.getElementById("next");//下一张

        imgRoll(img,prev,next,-10,870,3,0);
       //封装图片轮播方法
         //ulObj=ul元素,prvObj=上一张按钮,nextObj=下一张按钮,speed=速度(负值,比如-10),
       // imgWidth=一张li的宽度(轮播元素的宽度),imgNum=li个数(轮播图片的个数),curIndex(当前图片序列号,0是从第一张图片开始),flag目前还没有用处可以忽略不传
       //按钮点击后隐藏
       
function imgRoll(ulObj,prvObj,nextObj,speed,imgWidth,imgNum,curIndex,flag){  if(imgNum<=1){//如果只有一张图片不用轮播不显示上一页和下一页按钮  prvObj.style.display="none";  nextObj.style.display="none";  }else{  prvObj.style.display="block";  nextObj.style.display="block";  }  var index=curIndex;//当前图片序列号  var endIndex=imgNum-1;//最后一张图片序列号  ulObj.style.left=-index*imgWidth+'px';  var timer;//定时器名字  var iSpeed=speed;//滚动的速度  function goRoll(){  prvObj.style.display="none";  nextObj.style.display="none";  timer=setInterval(function () {  ulObj.style.left=ulObj.offsetLeft+iSpeed+'px';  var stop=-index*imgWidth+'px';//当达到目标位置时停止定时器  if(ulObj.style.left==stop){  iSpeed=speed;  clearInterval(timer);  if(index!=0){  prvObj.style.display="block";  }  if(index!=imgNum-1){  nextObj.style.display="block";  }  }  },10)  }  if(index==0){  prvObj.style.display="none";  }else if(index==endIndex){  nextObj.style.display="none";  }else{  prvObj.style.display="block";  nextObj.style.display="block";  }  //上一张和下一张点击效果  prvObj.onclick= function () {  index--;  iSpeed=-speed;  goRoll();  };  nextObj.onclick= function () {  index++;  iSpeed=speed;  goRoll();  }; }

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辣姐什么鬼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值