js无缝轮播,细致讲解,让你代码路上不迷路

324 阅读4分钟

哪里做的不好,欢迎指导,更希望我的讲解能够帮助到你

CSEEN}0Y}X23C1OBYXE$Q)4.jpg

首先向大家展示一下效果图 注意第六张图和第一张图的切换

无缝录播展示.gif

因为布局部分太过容易就不做细致讲解了,直接发出来供大家参考

CSS代码部分

  /* 主体部分 */

  * {
    margin: 0;
    padding: 0;
    list-style: none;
  }

  #slider {
    position: relative;
    width: 680px;
    height: 340px;
    margin: 100px auto;
    /* outline: 2px solid red; */
    overflow: hidden;
  }

  .slider-list {
    display: flex;
    position: relative;
    left: 0px;
    width: 100%;
    height: 100%;
    transition: all 1s;
  }

  .slider-list li {
    flex-shrink: 0;
    width: 680px;
    height: 340px;
  }

  /* 小点部分 */
  .dot-list {
    position: absolute;
    bottom: 10px;
    left: 50%;
    transform: translateX(-50%);
    padding: 2px 10px;
    border-radius: 12px;
    border-color: rgba(255, 255, 255, 0.3);
  }

  .dot-list .dot {
    display: inline-block;
    width: 10px;
    height: 10px;
    border-radius: 50%;
    background-color: white;
  }

  .dot-list .dot.cur {
    background-color: red;
  }

  /* 左右按钮布局 */
  .arraw {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    width: 30px;
    height: 60px;
    background-color: rgba(0, 0, 0, 0.795);
    display: none;
  }

  .prev {
    left: 0;
  }

  .next {
    right: 0;
  }

  .arraw span {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(50%, 50%);
    width: 10px;
    height: 10px;
    border-bottom: 2px solid white;
    border-left: 2px solid white;
  }

  .prev span {
    transform: translate(-50%, -50%) rotate(45deg);
  }

  .next span {
    transform: translate(-50%, -50%) rotate(-135deg);
  }

  #slider:hover .arraw {
    display: block;
    }

HTML代码部分

<div id="slider">
  <!-- 图片部分 -->
  <ul class="slider-list">
    <!-- <li><a href="#"><img src="./img/5.jpg"></a></li> -->
    <li style="background: #453a94">1</li>
    <li style="background: #fff1eb">2</li>
    <li style="background: #4facfe">3</li>
    <li style="background: #96e6a1">4</li>
    <li style="background: #fda085">5</li>
    <li style="background: #a18cd1">6</li>
  </ul>
  <!-- 小点部分 -->
  <div class="dot-list">
    <span class="dot cur"></span>
    <span class="dot"></span>
    <span class="dot"></span>
    <span class="dot"></span>
    <span class="dot"></span>
  </div>
  <!--箭头布分 -->
  <a href="#" class="arraw prev" id="left">
    <span></span>
  </a>
  <a href="#" class="arraw next" id="right">
    <span></span>
  </a>
</div>

JS代码部分

首先我们要先获取所有需要用到的元素

  var slid = document.getElementById("slider");//轮播图盒子
  var slidLis = slid.getElementsByTagName("ul")[0];
  var slidLi = slidLis.getElementsByTagName("li");//轮播图里的所有图片
  var lef = document.getElementById("left");//左侧按钮
  var righ = document.getElementById("right");//右侧按钮

然后定义一个用来存储点击或者划入暂停时的下标,避免轮播图乱跳

  var index = 0;

封装一个定义轮播图轮播的函数,便于划入点击时调用,减少代码量。这块的难点是: 我们切换的并不是图片,而是第一个图片的位置(也可以说是整个存放轮播图的ul),每次轮播我们都要给第一个盒子的位置向左偏移一个Li的宽度,公式就是向左偏移的宽度等于(当前下标*一个Li宽度),还有就是记得添加以后动画效果,这样会显得有视觉的欺骗效果。如果到最后一张图,我们就让下标直接变成0,回到第一张图,重新进行循环。还要注意变到到第一张图的位置时,去除动画效果,避免跟第一张的动画效果冲突

  function lun() {
    index++;
    circe();

    // 每次增加更换图片,更改的是第一张图的位置(当前下标*底图盒子的宽度)
    slidLis.style.left = index * -680 + "px";

    // 添加动画渐渐划过效果,并添加动画时间
    slidLis.style.transition = "all 1s";

    // 如果到最后一张图,我们就让下标直接变成0,回到第一张图,重新循环
    if (index === 5) {
      index = 0;
      setTimeout(function () {
        // 修改到第一张图的位置,并且去除动画效果,避免跟第一张的动画效果冲突
        slidLis.style.left = 0;
        slidLis.style.transition = "none";
      }, 1000);
    }
    circe();
  }

点击左右侧按钮,调用我们封装好的轮播图函数:调用点击右边很简单,就是调用下函数就OK,点击左侧按钮的时候会相对麻烦,首先改变下标,就是用当前下标减一,然后向上面的公式一样改变盒子距离左边的距离,然后进行判断,下标减到负一的时候就会跳到最后一张图片

  righ.addEventListener("click", lun);
  lef.addEventListener("click", function () {
    index--;
    if (index === -1) {
      slidLis.style.left = 5 * -680 + "px";
      slidLis.style.transition = "none";
      index = 4;
      setTimeout(function () {
        slidLis.style.left = index * -680 + "px";
        slidLis.style.transition = "all 1s";
      }, 0);
    } else {
      slidLis.style.left = index * -680 + "px";
    }
    circe();
  });

封装一个定时器,调用函数进行自动轮播

  //  自动轮播
  var autoplay = setInterval(lun, 2000);

鼠标划入时的调用,清除自动轮播的定时器

  slid.addEventListener("mouseenter", function () {
    clearInterval(autoplay);
  });
  

鼠标划出时的调用,先清除定时器,并给定时器重新调用赋值

  slid.addEventListener("mouseleave", function () {
    clearInterval;
    autoplay = setInterval(lun, 2000);
  });
  

定义函数焦点对应修改图片,并在上面各个修改轮播的位置调用

  //首先获取到所有的焦点
  var dotList = document.getElementsByTagName("span");

  //封装函数更新焦点位置
  function circe() {
    for (var i = 0; i < dotList.length; i++) {
      if (i === index) {
        dotList[i].classList.add("cur");
      } else {
        dotList[i].classList.remove("cur");
      }
    }
  }