DOM制作呼吸轮播图特效

88 阅读1分钟

image.png

总的来说,就是修改透明度。liArray[0].style.opacity = "0"或者1.

透明度为0,隐藏。透明度为1,显示。

在写点击事件的时候,当前的透明度为0,(完全隐藏),下一张的透明度为1(显示)。

使用document.querrySelectAll()找到所有的元素,这时候是一个数组。要用下标来操作里面的元素。

函数节:首先定义一个状态,默认是false,var lock = false,在写点击的逻辑的时候,先让lock = true. 看设置的过渡属性里面的时间,根据时间来修改lock的状态,使用settimeout()。

点击上一张按钮也是同理。当点击上一张已经是第一张了,再点数组的下标就是-1了,这时候需要把下标设置为最后一张的下标。

<!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;
      }
      .carousel ul {
        list-style: none;
      }
      .carousel ul li {
        position: absolute;
        top: 0;
        left: 0;
        /* 透明度都是0 */
        opacity: 0;
        transition: opacity 1s ease 0s;
      }
      /* 只有第一张透明度是1 */
      .carousel ul li:first-child {
        opacity: 1;
      }
      .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>
      </ul>
      <a href="javascript:;" class="leftbtn" id="leftbtn"></a>
      <a href="javascript:;" class="rightbtn" id="rightbtn"></a>
    </div>
    <script>
      // 先定义一个变量,用来调整数组的下标
      var currentNumber = 0;
      /* 透明度为1,完全显示,透明度为0,完全隐藏 */
      // 点击的时候,当前隐藏(透明度为0),下一张显示,透明图为1,
      // 找到ul下面所有的li,找到的是一个数组。如果操作里面其中一张,需要用数组的方式
      var liArr = document.querySelectorAll("li");
      var leftButton = document.getElementById("leftbtn");
      var rightButton = document.getElementById("rightbtn");
      var lock = false;
      //   开始写右侧按钮的点击逻辑
      //   所有的内容都写在这个逻辑里面
      rightButton.onclick = function () {
        if (lock) {
          return false;
        }
        lock = true;
        // 当currentNumber的值为5的时候,又要从第一张开始
        if (currentNumber === 5) {
          currentNumber = 0;
        }

        liArr[currentNumber].style.opacity = "0";
        // 点击一次,当前值就自增
        currentNumber++;
        // li显示,也就是透明度为1
        liArr[currentNumber].style.opacity = "1";
        // 因为过度属性设置的是1秒,所以1秒以后解锁
        setTimeout(() => {
          lock = false;
        }, 1000);
      };
      //   右侧按钮点击事件结束
      // 左侧按钮的点击逻辑
      leftButton.onclick = function () {
        if (lock) {
          return;
        }
        lock = false;
        liArr[currentNumber].style.opacity = "0";
        currentNumber--;
        // 到一直点上一张回到第一张了,再点就是-1了,就不能再点了,所以如果点了数组的下标是-1,需要把当前的数字变成最后一张
        if (currentNumber === -1) {
          currentNumber = 4;
        }
        liArr[currentNumber].style.opacity = "1";

        setTimeout(() => {
          lock = false;
        }, 1000);
      };
    </script>
  </body>
</html>