DOM操作跑马灯轮播图特效

113 阅读1分钟

image.png

总的来说,就是每一次点击按钮,就改变ul.style.left的值。

当点击下一张,图片的轮播到最后一张后,ul.style.left的值要变回0,也就是从第一张开始。

同理,当点击上一张,图片轮播到第一张的时候,要从最后一张开始轮播,也就是要把 ul.style.left的值设置为最后一张时候的值。

解决函数节流的问题:不能鼠标每一次点击按钮,都生效一次点击的逻辑,可以设置一个状态,默认为false,(var lock = false)当开始执行的时候,把状态设置为true,这时候,点击鼠标也不会生效。

使用settimeout来设置什么时候把lock又设置为false

在两张图片切换的时候,配合过渡属性来操作。

ul.style.transition="left 0.5s ease 0

具体代码和注释如下:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      .carousel {
        width: 650px;
        height: 360px;
        border: 1px solid #000;
        margin: 50px auto;
        position: relative;
        /* 超出设置宽度的部分就会隐藏 */
        /* overflow: hidden; */
      }
      .carousel ul {
        list-style: none;
        width: 6000px;
        position: relative;
        left: 0px;
        /* left发生变化的时候,设置过渡效果, */
        transition: left 0.5s ease 0s;
      }
      .carousel ul li {
        float: left;
      }
      .carousel .leftbtn {
        position: absolute;
        left: 20px;
        top: 50%;
        margin-top: -25px;
        width: 50px;
        height: 50px;
        background-color: rgb(28, 180, 226);
        border-radius: 50%;
      }
      .carousel .rightbtn {
        position: absolute;
        right: 20px;
        top: 50%;
        margin-top: -25px;
        width: 50px;
        height: 50px;
        background-color: rgb(28, 180, 226);
        border-radius: 50%;
      }
    </style>
  </head>
  <body>
    <div class="carousel">
      <ul id="list">
        <li><img src="images/beijing/0.jpg" alt="" /></li>
        <li><img src="images/beijing/1.jpg" alt="" /></li>
        <li><img src="images/beijing/2.jpg" alt="" /></li>
        <li><img src="images/beijing/3.jpg" alt="" /></li>
        <li><img src="images/beijing/4.jpg" alt="" /></li>
        <li><img src="images/beijing/0.jpg" alt="" /></li>
      </ul>
      <a href="javascript:;" class="leftbtn" id="leftbtn"></a>
      <a href="javascript:;" class="rightbtn" id="rightbtn"></a>
    </div>
    <script>
      // 要做的 ul;
      var ulObj = document.getElementById("list");
      // 点击了右边按钮,ul的left的left值就发生改变,left减少了一张图片的值
      //   左边按钮
      var buttonLeft = document.getElementById("leftbtn");
      //   右边按钮
      var buttonRight = document.getElementById("rightbtn");
      // 点按钮的时候,不能每次点都执行点击的逻辑,要一张图片跑完,点击才生效
      // 先设置一个状态,默认false
      var lock = false;
      //   定义一个变量,下面要用这个变量来赋值ulObj.style.left
      var currentPostion = 0;
      // 开始写点击右侧按钮
      buttonRight.onclick = function () {
        if (lock) {
          return;
        }
        // 如果能到这一步,就先上锁,上锁的状态下,不能操作这个函数(也就是点击了无效)
        lock = true;
        // 不会一直一直往左边跑,当跑完5张图片的距离的时候,又回到0
        if (currentPostion === -(650 * 5)) {
          currentPostion = 0;
          //  回到原来位置的时候, 把过渡属性关掉,
          ulObj.style.transition = "none";
        }

        // 上面下面都用到了transition,所以把下面的放到异步函数settimeout里面
        setTimeout(() => {
          // 点击一次,left就少650,(往左边跑650)
          currentPostion -= 650;
          // 跑的时候,需要加过渡属性
          ulObj.style.transition = "left 0.5s ease 0s";
          ulObj.style.left = currentPostion + "px";
        }, 0);

        // 因为设置的过渡属性是0.5秒,所以0.5秒,第一次点击执行完了,可以解锁了
        setTimeout(() => {
          lock = false;
        }, 500);
      };
      //   右侧按钮逻辑结束

      // 开始写左侧按钮,左侧按钮是跑到上一张
      buttonLeft.onclick = function () {
        if (lock) {
          return;
        }
        lock = true;
        // 如果跑到了最左边了,再点上一张就不行了,需要改当前的位置
        if (currentPostion === 0) {
          // 到最左边,需要把当前的图片拉到最后一张
          currentPostion = -650 * 5;
          ulObj.style.transition = "none";
        }
        // 为什么要把这个写在异步执行函数里面,因为上面下面都用到了过渡属性
        setTimeout(() => {
          // 每点击一次,ulObj的left值就加650
          currentPostion += 650;
          ulObj.style.transition = "left 0.5s ease 0s";
          ulObj.style.left = currentPostion + "px";
        }, 0);
        setTimeout(() => {
          lock = false;
        }, 500);
      };
    </script>
  </body>
</html>