美文网首页后浪 · 正青春
js实现效果:循环轮播图

js实现效果:循环轮播图

作者: 乔一丁_2020强化班 | 来源:发表于2021-02-21 11:55 被阅读0次

效果简介

跟普通的左右切换轮播图类似,但是它看起来是首尾相连的。

注意:要想学习这种轮播图,首先要学会实现基本左右切换轮播图!

代码

//获取所有图片中的第一张图片,目的是为了修改marginLeft属性来实现轮播效果
var firstimg = document.querySelectorAll(".bottom-banner .bottom-banner-inner img")[0];
var bbindex = 0;//必须从零开始,因为需要进行取余计算
var bbindexmax = 3;//不包含进行适配的最后一张
//(最后一张图实际上与第一张相同,就是为了实现循环的效果而添加的)

var st,stcb;//用于清除setTImeout的而保存的数字,setTImeoutChangeBanner
var changeTime = 500;//切换图片的用时(也就是transition设置的时间)
var intervalTime = 2000;//切换间隔时间,

//isNext表示切换到下一张还是上一张
//这个轮播图暂时不支持切换到指定的张数,因为我们的目的是实现循环切换
//如果同时切换多张,可能会导致问题
function changeBanner(isNext){
    clearTimeout(stcb);
    clearTimeout(st);
    stcb = setTimeout(function(){changeBanner(true)},intervalTime);
    if(isNext){
        bbindex++;
    }else{
        bbindex--;
    }
    if(bbindex < 0){
          //此处容易出错,为什么要+1,因为下面的循环是以bbindexmax+1为核心
          //如果此处不加1,会打乱其循环(导致切换的张的序号错乱)
        bbindex += bbindexmax +1;
    }
        //+1是因为这样才可以得出与bbindexmax相同张数的数字循环,即(0~bbindexmax)
    bbindex = bbindex % (bbindexmax+1);

    //下一张要切第一张时
    if(bbindex == 0 && isNext){
        bbindex = bbindexmax+1;
        firstimg.style.transition = "all 0." +changeTime+ "s";
        firstimg.style.marginLeft = -1200*bbindex + 'px';
        bbindex = 0;
        return;
    }
    //下一张要切第二张时
    if(bbindex == 1 && isNext){
        firstimg.style.transition = "none";
        firstimg.style.marginLeft = '-0px';
    }
    //上一张要切最后一张时
    if(bbindex == bbindexmax && !isNext){
        firstimg.style.transition = "none";
        firstimg.style.marginLeft = -1200*(bbindexmax+1) + 'px';
    }
    //为什么一定要延迟执行呢,因为设置的时间太短也会出现某些问题(可以自行去掉setTimeout函数尝试)
    //猜测问题的原因:是因为重绘出现的问题,时间太短,导致重绘未进行完就修改了属性
    setTimeout(function(){
        firstimg.style.transition =  "all 0." +changeTime+ "s";
        firstimg.style.marginLeft = -1200*bbindex + 'px';
    },10);
}
stcb = setTimeout(function(){changeBanner(true)},intervalTime);

首先来讲一下我的思路:
我们要想无缝切换图片,必须要在所有图片的最后添加一张第一张图片,因为要实现从最后一张切换到第一张时有过渡效果;
之后我们要让你处在第一张时,向前向后切换都要进行隐式切换

何为隐式转换?隐式转换就是在你处于第一张图片时,实际上可能处于最后一张(注意,最后一张图片与第一张相同)或者真正的第一张。当进行前后轮播时,我们需要对切换方向进行判断。如果从第一张切换至第二张图,则我们需要从真正的第一张切换过去,此时我们需要将其transition属性设为none,然后切换至第一张图片。因为没有过渡,所以我们什么效果也看不到(两张相同图片之间的切换还没加过渡肯定啥也看不出来的呀),之后再将transition属性设置为正常的过渡,然后再更改marginLeft的数值进行切换,就能实现这种效果了。

另一种思路

我们也可以将所有的轮播图的图片外面套一层div,并设置绝对定位,然后使用父相子绝,来让图片可以相对父元素定位(父元素就是装轮播图的盒子)

父相子绝就是父元素设置相对定位,子元素设置绝对定位,从而让子元素在绝对定位时,可以以父元素为基准定位

之后,只要我们让不该显示的图片定位到盒子范围外的位置(父元素设置overflow:hidden;),在需要切换图片时,我们就把当前图片前后的图片定位到对应位置,然后通过setInterval方法循环改变其位置实现轮播效果。之后更改当前图片的索引即可。

相关文章

  • 简单轮播图(循环播放)

    效果图 原理 布局 样式 JS实现 以上就是用JS实现的自动循环轮播图,我又加上了鼠标移过停留的效果。

  • js轮播图

    什么是轮播图呢?能够实现多张图片循环出现效果的我们称之为轮播图。 html样式 css样式 js样式 这就是我敲出...

  • js实现效果:循环轮播图

    效果简介 跟普通的左右切换轮播图类似,但是它看起来是首尾相连的。 注意:要想学习这种轮播图,首先要学会实现基本左右...

  • 循环当中的匿名函数问题

    前言:从《原生JS实现轮播(上)》中JS实现渐变效果引出的循环中匿名函数的问题。 如果匿名函数里使用了循环变量,或...

  • js原装代码做一个简单的点击切换图片的轮播图

    点击左右按钮会切换图片,可以无限循环的轮播图 代码: HTLM CSS JS 效果图

  • jquery+swiper实现三图轮播效果

    需求为了实现如图所示的轮播图效果: css代码: js代码: 实现demo下载

  • 原生js轮播图

    今天和大家分享的案例是轮播图 简书 由js实现的轮播图效果 代码展示: css部分: HTML部分: script...

  • 任务27 - jquery实战 - 轮播

    代码 实现如下轮播效果 展示、代码 实现上述轮播效果,在一个页面有三个轮播 展示、代码 实现如下无限循环滚动轮播效...

  • javaScript实现焦点轮播图界面效果(一)

    在本篇文章中我们主要通过html+css+js实现焦点轮播图的效果,那么什么是焦点轮播图呢,这里我们就用图说话,先...

  • 轮播图心得

    轮播图 写轮播图之前我们要认识到几个问题:一、什么是轮播图?二、怎么实现轮播效果?三、轮播图还有什么小功能可以实现...

网友评论

    本文标题:js实现效果:循环轮播图

    本文链接:https://www.haomeiwen.com/subject/wwbffltx.html