Blogger Information
Blog 31
fans 0
comment 0
visits 30264
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
教你做Javascript经典轮播图和选项卡的实现
emy
Original
1559 people have browsed it

一、轮播图的实现:在项目开发中,轮播图是经常会用到的效果。
1)轮播图的样式主要使用定位的方式,是圆点和翻译按钮显示在图片上层。
2)只显示当前图片,隐藏其它图片。
3)用js设置点击事件,以及定时器自动触发翻页点击事件。
4)代码实现:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>轮播图实现</title>
    <style>
      ul,
      li {
        margin: 0;
        padding: 0;
        list-style: none;
      }

      .box {
        /*定位父级*/
        position: relative;
        width: 640px;
        height: 350px;
        margin: 0 auto;
      }

      .box .slider {
        width: 640px;
        height: 350px;
        display: none;
      }

      .box .slider.active {
        display: block;
      }

      .box .point-list {
        position: absolute;
        /*绝对定位的环境下的水平居中方式*/
        left: 50%;
        margin-left: -38px;
        top: 310px;
      }

      .box .point-list .point {
        display: inline-block;
        width: 12px;
        height: 12px;
        margin: 0 5px;
        background-color: white;
        border-radius: 100%;
      }

      .box .point-list .point.active {
        background-color: black;
      }

      .box .point-list .point:hover {
        cursor: pointer;
      }

      .skip {
        position: absolute;
        top: 140px;
        display: inline-block;
        width: 40px;
        height: 80px;
        text-align: center;
        line-height: 80px;
        background-color: lightgray;
        color: white;
        opacity: 0.2;
        font-size: 36px;
      }

      .box .prev {
        left: 0;
      }

      .box .next {
        right: 0;
      }

      .box .skip:hover {
        cursor: pointer;
        opacity: 0.5;
        color: black;
      }
    </style>
  </head>

  <body>
    <div class="box">
      <img src="banner/p1.jpg" alt="" data-index="1" class="slider active" />
      <img src="banner/p2.jpg" alt="" data-index="2" class="slider" />
      <img src="banner/p3.jpg" alt="" data-index="3" class="slider" />
      <img src="banner/p4.jpg" alt="" data-index="4" class="slider" />

      <div class="point-list">
        <!-- <span class="point active" data-index="1"></span>
        <span class="point" data-index="2"></span>
        <span class="point" data-index="3"></span> -->
      </div>

      <span class="skip prev">&lt;</span>
      <span class="skip next">&gt;</span>
    </div>

    <script>
      var cl = console.log.bind(console);
      // 轮播图片组
      var imgs = document.querySelectorAll("img");

      var pointList = document.querySelector(".point-list");

      // 动态生成小圆点
      imgs.forEach(function (img, index) {
        var span = document.createElement("span");
        if (index === 0) span.classList.add("point", "active");
        span.classList.add("point");
        // 将小圆点与当前显示的图片的索引进行关联
        span.dataset.index = img.dataset.index;

        pointList.appendChild(span);
      });

      // 为了正确的设置小圆点高亮, 这里需要获取到所有的小圆点
      var points = document.querySelectorAll(".point");

      // 事件代理/委托: 给小圆点添加点击事件
      pointList.addEventListener(
        "click",
        function (ev) {
          cl(ev.target);
          imgs.forEach(function (img) {
            if (img.dataset.index === ev.target.dataset.index) {
              imgs.forEach(function (img) {
                img.classList.remove("active");
              });
              // 设置当前图片的激活样式
              img.classList.add("active");

              // 公共函数: 设置小圆点当前的高亮, 必须与图片一一对应, 同步
              setPointActive(img.dataset.index);
            }
          });
        },
        false
      );

      // 公共函数:setPointActive
      function setPointActive(imgIndex) {
        // 清除原来的所有的小圆点上的高亮
        points.forEach(function (point) {
          point.classList.remove("active");
        });

        points.forEach(function (point) {
          if (point.dataset.index === imgIndex) point.classList.add("active");
        });
      }

      // 获取翻页按钮
      var skip = document.querySelectorAll(".skip");

      // 添加事件
      skip.item(0).addEventListener("click", skipImg, false);
      skip.item(1).addEventListener("click", skipImg, false);

      // 翻页事件回调skipImg
      function skipImg(ev) {
        // 遍历并找到当前正在显示的图片
        var currentImg = null;
        imgs.forEach(function (img) {
          if (img.classList.contains("active")) currentImg = img;
        });

        // 1. 判断是否是点击了显示前一张?
        if (ev.target.classList.contains("prev")) {
          currentImg.classList.remove("active");
          currentImg = currentImg.previousElementSibling;
          cl(currentImg);

          // 如果存在前一张
          if (currentImg !== null && currentImg.nodeName === "IMG")
            // 将当前图片显示
            currentImg.classList.add("active");
          else {
            //否则就显示最后一张,形成循环
            currentImg = imgs[imgs.length - 1];
            currentImg.classList.add("active");
          }
        }

        // 2. 判断是否是点击了显示下一张?
        if (ev.target.classList.contains("next")) {
          currentImg.classList.remove("active");
          currentImg = currentImg.nextElementSibling;
          cl(currentImg);

          // 如果存在前一张
          if (currentImg !== null && currentImg.nodeName === "IMG")
            // 将当前图片显示
            currentImg.classList.add("active");
          else {
            //否则就显示最后一张,形成循环
            currentImg = imgs[0];
            currentImg.classList.add("active");
          }
        }

        // 公共函数: 设置小圆点当前的高亮, 必须与图片一一对应, 同步
        setPointActive(currentImg.dataset.index);
      }

      var box = document.querySelector(".box");

      var timer = null;

      // 1. 当鼠标移出轮播图区域时, 启动定时器,每2.5秒自动切换图片
      box.addEventListener("mouseout", startTimer, false);
      // 2. 当鼠标移入轮播图区域时,清除定时器,由用户点击操作
      box.addEventListener("mouseover", clearTimer, false);

      // 启动定时器
      function startTimer() {
        var click = new Event("click");
        //setInterval(): 间歇式执行
        setInterval(function () {
          skip.item(1).dispatchEvent(click);
        }, 2500);
      }

      // 清除定时器
      function clearTimer() {
        clearInterval(timer);
      }
    </script>
  </body>
</html>

QQ截图20200607071442.jpg
二、TAB选项卡的实现:
1)主要原理是利用标签的点击事件触发,更改相关标签的样式。
2)通过自定义的data-index属性找到对应的内容块。
3)只显示激活状态的标签,其它隐藏。
4)代码实现:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>选项卡</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      a {
        text-decoration: none;
        color: #555;
      }
      a:hover {
        text-decoration: underline;
        color: red;
      }
      li {
        list-style: none;
      }
      li:hover {
        cursor: default;
      }
      .tabs {
        width: 300px;
        height: 300px;
        margin: 30px;
        background-color: #ddd;

        display: flex;
        flex-direction: column;
      }

      .tab {
        height: 36px;
        display: flex;
      }
      .tab li {
        flex: auto;
        text-align: center;
        line-height: 36px;
        background-color: #fff;        
      }
      .tab li.active {
        background-color: #ddd;
      }

      /* 默认所有选项卡只有一个显示,其它隐藏 */
      .item {
        padding: 20px;
        display: none;font-size: 12px;
      }
      .item.active {
        display: block;
      }
    </style>
  </head>
  <body>
    <div class="tabs">
      <!-- 导航 -->
      <ul class="tab">
        <li class="active" data-index="1">新闻动态</li>
        <li data-index="2">常见问题</li>  
      </ul>

      <!-- 内容1 -->
      <ul class="item active" data-index="1">
        <li><a href="">忘记28年房子现住户已搬家1</a></li>
        <li><a href="">忘记28年房子现住户已搬家2</a></li>
        <li><a href="">忘记28年房子现住户已搬家3</a></li>
      </ul>

      <!-- 内容2 -->
      <ul class="item" data-index="2">
        <li><a href="">轮播图就是实现图片的轮换播放效果?1</a></li>
        <li><a href="">轮播图就是实现图片的轮换播放效果?2</a></li>
        <li><a href="">轮播图就是实现图片的轮换播放效果?3</a></li>
      </ul>

    </div>

    <script>
      var cl = console.log.bind(console);

      // 导航:事件委托
      var tab = document.querySelector(".tab");
      // 列表
      var items = document.querySelectorAll(".item");

      // 给导航绑定点击事件
      tab.addEventListener("click", show, false);

      // 给导航绑定鼠标移动事件
      tab.addEventListener("mouseover", show, false);
      // 事件回调函数
      function show(ev) {
        cl(ev.target);
        // data-index
        // cl(ev.target.dataset.index);
        // 1. 清空导航原有的激活
        ev.target.parentNode.childNodes.forEach(function (item) {
          if (item.nodeType === 1) item.classList.remove("active");
        });

        // 2. 将当前用户正在点击的导航设置为激活
        ev.target.classList.toggle("active");

        // 3. 清空列表的原有激活
        items.forEach(function (item) {
          item.classList.remove("active");
        });

        // 4. 在列表中查询data-index与导航的data-index相等的内容,将它设置为激活
        items.forEach(function (item) {
          if (item.dataset.index === ev.target.dataset.index)
            item.classList.add("active");
        });
      }
    </script>
  </body>
</html>

QQ截图20200607072246.jpg

三、总结:这个轮播图的使用是十分常见,各个浏览器兼容性也是很重要。以前做轮播图都是在网上拿来直接用的多。要完善好这个轮播图鼠标点击小圆点会乱跳的BUG,还要修一下内功。用了这么久的TAB选项卡,今天才知道JS的原理。怎么样才能达到自己全部手写代码,不用仿的?

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:不建议这样集中提交, 学习效果非常不好, 以后要注意
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post