美文网首页
无缝轮播图(详细代码)

无缝轮播图(详细代码)

作者: Christoles | 来源:发表于2019-03-17 12:06 被阅读0次

1. 效果

image.png

2. 原理

  • 定时器;
  • 过渡动画;
  • 位移距离;
  • 根据图片张数动态设置分页器(小圆点)个数;
  • 根据图片张数,动态添加第一张到追后一张图片后面;添加最后一张图片到第一张图片前面;
  • 当图片位移到左右边界时,瞬间跳转至第一张图片or最后一张图片

3. 代码

html

<div class="swiper">
    <!--图片区域-->
    <ul class="imgBox">
        <li><img src="img/1.jpg" alt="" /></li>
        <li><img src="img/2.jpg" alt="" /></li>
        <li><img src="img/4.jpg" alt="" /></li>
    </ul>
    <!--左右按钮-->
    <div class="btn pre">&lt;</div>
    <div class="btn next">&gt;</div>
    <!--小圆点-->
    <ul class="item">
        <!--动态生成-->
        <!--<li class="active"></li>
        <li></li>
        <li></li>-->
    </ul>
</div>

css

*{
    margin: 0;
    padding: 0;
    list-style: none;
    text-decoration: none;
    box-sizing: border-box;
}
.swiper{
    width: 520px;
    height: 280px;
    margin: 50px auto;
    position: relative;
    overflow: hidden;
}
.swiper ul{
    width: 9999px;
    overflow: hidden;
    /*清除浮动*/
    /*transition: 1s;*/
}
.swiper li{
    float: left;
    /*width: 520px;*/
}
/*按钮*/
.btn{
    position: absolute;
    top: 50%;
    left: -4px;
    width: 30px;
    height: 30px;
    
    margin-top: -15px;
    text-align: center;
    line-height: 27px;
    border-radius: 50%;
    font-size: 26px;
    color: #fff;
    background: #666;
    opacity: .5;
    cursor: pointer;
    -webkit-user-select: none;
    -ms-user-select: none;
}
.next{
    left: 494px;
}
.transi{
    transition: 500ms;
}
/*小圆点*/
ul.item{
    width: 48px;
    position: absolute;
    bottom: 20px;
    left: 50%;
    transform: translateX(-50%);
    /*清除浮动*/
    overflow: hidden;
    z-index: 1000;
}
.item li{
    float: left;
    width: 10px;
    height: 10px;
    border: 1px solid #fff;
    background: #fff;
    border-radius: 50%;
    margin: 0 3px;
    cursor: pointer;
}
li.active{
    background: gray;
}

js

window.onload=function(){
//获取元素对象
    let swiper = document.querySelector(".swiper"),
        pre = swiper.querySelector(".pre"),
        next = swiper.querySelector(".next"),
        _ul = swiper.querySelector(".imgBox"),//图片ul
        ali = _ul.querySelectorAll('li'),
        aImg = swiper.querySelectorAll("li img"),
        imgW = aImg[0].offsetWidth,//需要window.onload
        index = 1,//计算滚动到哪张图片
        isTransitioned = true,//判断动画是否已完成
        item = swiper.querySelector('.item');
    
    //克隆第一张图片,添加到图片队列的最后面
    let cloneLi = ali[0].cloneNode(true);
    _ul.appendChild(cloneLi);
    //克隆最后一张图片,添加到图片队列的最前面
    let cloneLastLi = ali[ali.length-1].cloneNode(true);
    _ul.prepend(cloneLastLi);
    
    //定时器
    var timer = setInterval(function(){
            _ul.classList.add("transi");
            index++;
            _ul.style.transform="translateX("+(-imgW*index)+"px)";
            fenyeqi(index);//分页器跟随函数
        },2500);
    _ul.addEventListener("mouseover",()=>{
        clearInterval(timer);//清除定时器
    })
    _ul.addEventListener("mouseout",()=>{
        timer = setInterval(function(){
            _ul.classList.add("transi");
            index++;
            _ul.style.transform="translateX("+(-imgW*index)+"px)";
            fenyeqi(index);//分页器跟随函数
        },2500);
    })
    
    
    //点击右边按钮
    pre.addEventListener("click",()=>{
        clearInterval(timer);//清除定时器
        if(isTransitioned){
            _ul.classList.add("transi");
            index++;//先++再设置
            _ul.style.transform="translateX("+(-imgW*index)+"px)";
            isTransitioned = false;
            fenyeqi(index);//分页器跟随函数
        }
    })
    
    
    //初始化图片队列:
    _ul.style.transform="translateX("+(-imgW*index)+"px)";
    //点击左边按钮
    next.addEventListener("click",()=>{
        clearInterval(timer);//清除定时器
        if(isTransitioned){
            _ul.classList.add("transi");
            index--;
            _ul.style.transform="translateX("+(-imgW*index)+"px)";
            isTransitioned = false;
            fenyeqi(index);//分页器跟随函数
        }
    })
    
    //监听动画结束 ***
    _ul.addEventListener("transitionend",()=>{//给ul加了transi
        if(index == aImg.length+1){//边界判断
            index = 1;
            _ul.classList.toggle("transi");//移除ul的transi
            _ul.style.transform="translateX("+(-imgW*index)+"px)";//瞬间变回第一张
        }
        if(index==0){
            index=aImg.length;
            _ul.classList.toggle("transi");//移除ul的transi
            _ul.style.transform="translateX("+(-imgW*index)+"px)";//瞬间变回第一张
        }
        isTransitioned = true;//每次动画结束都判断
    })
    
    //分页器
    //根据图片的张数生成分页器
/**/for(let i=0;i<aImg.length;i++){//根据aImg的数量
        var newLi = document.createElement('li');
        item.appendChild(newLi);
    }
    item.children[0].classList.add("active");
    //点击小圆点变色和换照片
    for(let j=0;j<item.children.length;j++){
        item.children[j].addEventListener("click",function(){
            clearInterval(timer);//清除定时器
            for(let k=0;k<item.children.length;k++){
                item.children[k].classList.remove("active")
            }
            item.children[j].classList.add("active");
            index=j+1;//将j和index联系起来
            _ul.classList.add("transi");
            _ul.style.transform="translateX("+(-imgW*index)+"px)";
        })
    }
    //点击左右按钮,分页器跟随 ***
    function fenyeqi(index){
        for(let k=0;k<item.children.length;k++){
            item.children[k].classList.remove("active")
        }
        index = index-1;//因为index 的初始值为1
        index = index==item.children.length?0:index;//左边按钮边界
        index = index<0?item.children.length-1:index;//右边按钮边界  这里的index变了  比如第一次是1-- => 0; index=0-1=-1 ;=>index=item.children.length-1=2; ...
        item.children[index].classList.add("active");
    }
    
}

相关文章

  • 无缝轮播图(详细代码)

    1. 效果 2. 原理 定时器; 过渡动画; 位移距离; 根据图片张数动态设置分页器(小圆点)个数; 根据图片张数...

  • 2018-11-10排他思想做轮播图

    这个轮播图没包括无缝滚动 html代码 css代码 js代码

  • JS中常见的几种轮播

    轮播图 1.无缝不停轮播 ​ 1. body布局: ​ 2. css样式: 3. JS代码: 2.无缝停顿...

  • 无缝轮播

    无缝细解过程 html css js 无缝轮播js切换动画 css代码 JS代码 循环无缝轮播 CSS js1.首...

  • 无标题文章

    轮播图分为:传统轮播图、间歇轮播图、呼吸轮播图、无缝滚动轮播图等。它们各具特色,各有用处。 1.传统轮播图 第一步...

  • 轮播图

    轮播图分为:传统轮播图、间歇轮播图、呼吸轮播图、无缝滚动轮播图等。 1.传统轮播图 第一步,得到元素 第二步,设置...

  • jQuery实现轮播图无缝(无回滚)滚动切换效果

    HTML 无缝切换轮播图