首页 > 技术文章 > js轮播图代码

ndh074512 2020-11-15 15:31 原文

window.addEventListener("load", function () {
  // 1、获取元素
  var arrow_l = document.querySelector(".arrow-l");
  var arrow_r = document.querySelector(".arrow-r");
  var focus = document.querySelector(".focus");
  //   轮播图的宽度  计算移动的位置要用
  var focusWidth = focus.offsetWidth;
  //   2、鼠标经过focus就显示隐藏左右按钮
  //   2.1鼠标经过显示左右按钮  用mouseenter时因为可以避免冒泡
  focus.addEventListener("mouseenter", function () {
    arrow_l.style.display = "block";
    arrow_r.style.display = "block";
    clearInterval(timer);
    timer = null; //清除定时器变量
  });
  //   2.2鼠标离开隐藏左右按钮
  focus.addEventListener("mouseleave", function () {
    arrow_l.style.display = "none";
    arrow_r.style.display = "none";
    timer = setInterval(function () {
      // 手动调用点击事件
      arrow_r.click();
    }, 2000);
  });
  //   3、动态生成小圆圈,有几张图片生成几个小圆圈
  //   3.1先获取元素(限定范围)
  var ul = focus.querySelector("ul");
  var ol = focus.querySelector(".circle");
  //   3.2利用 for循环动态生成li
  for (i = 0; i < ul.children.length; i++) {
    // 3.3创建节点li
    var li = document.createElement("li");
    // 生成小圆点的同时 自定义一个索引号属性
    li.setAttribute("index", i);
    // 3.4将li插入ol中
    ol.appendChild(li);
    li.addEventListener("click", function () {
      // 3.5 利用for循环和排他思想设置ol中小圆点点击后的样式
      //    干掉其他人
      for (i = 0; i < ol.children.length; i++) {
        ol.children[i].className = "";
      }
      //   留下我自己
      this.className = "current";
      //   拿到索引号  为了后面计算动画移动距离
      var index = this.getAttribute("index");
      //   在点击小圆点的时候把拿到的索引号给num和 circle 让大家都同步
      num = index;
      circle = index;
      //   调用动画函数
      animate(ul, -index * focusWidth);
    });
  }
  // 把ol里面的第一个小li设置类名为 current
  ol.children[0].className = "current";
  // 生成小圆点的同时,绑定注册事件
  // 无缝滚动需要深克隆ul的第一个li  放在小圆点生成的后面 也就是for循环的外面
  var first = ul.children[0].cloneNode(true);
  ul.appendChild(first);

  //   4、右侧按钮
  //   定义一个全局变量num,点击一次,自增1,让num乘以图片的宽度就是ul移动的距离
  var num = 0;
  //   再定义一个全局变量circle  每点击一次右侧按钮,自增1 小圆点跟着一起走
  var circle = 0; // circle 控制小圆圈的播放
  var flag = true; // flag 节流阀
  arrow_r.addEventListener("click", function () {
    if (flag) {
      flag = false; // 关闭节流阀
      //   因为要无缝滚动,所以多了一张图片,当图片滚动到最后一张克隆的图片时,让ul快速回到最左边,即left值为0,同时num的值也设置为0,这样 加1后 新开始滚动
      if (num == ul.children.length - 1) {
        ul.style.left = 0;
        num = 0;
      }
      num++;
      animate(ul, -num * focusWidth, function () {
        flag = true; // 打开节流阀
      });

      circle++;
      // 当点击按钮走到最后一张图片的时候,也就是隐藏的那个小圆点时,小圆点变成第一个
      if (circle == ol.children.length) {
        circle = 0;
      }
      // 干掉其他人
      for (i = 0; i < ol.children.length; i++) {
        ol.children[i].className = "";
      }
      // 保留我自己
      ol.children[circle].className = "current";
    }
  });

  //   5、左侧按钮
  arrow_l.addEventListener("click", function () {
    if (flag) {
      flag = false; // 关闭节流阀
      //   当处于第一张图片的时候 ,也就是num=0的时候,num是最后一张图片
      if (num == 0) {
        num = ul.children.length - 1;
        ul.style.left = -num * focusWidth + "px";
      }
      num--;
      animate(ul, -num * focusWidth, function () {
        flag = true; // 打开节流阀
      });

      circle--;
      // 当小于第一张图片的时候,小圆点显示最后一个
      if (circle < 0) {
        circle = ol.children.length - 1;
      }
      // 干掉其他人
      for (i = 0; i < ol.children.length; i++) {
        ol.children[i].className = "";
      }
      // 保留我自己
      ol.children[circle].className = "current";
    }
  });

  //   6、自动播放
  var timer = setInterval(function () {
    arrow_r.click();
  }, 2000);
});

 

推荐阅读