选项卡切换(排他法、轮转法、轮转法之事件委托)

选项卡需求:

tabbar content 两部分的内容一一对应,我们点击某一个tab的时候,该tab的类名设置为on,其他的tab要清除on类名,对应的content的类名要设置为 active ,其他的content清除active类名。

html 复制代码
<!DOCTYPE html>
<html lang="zh-cn">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>选项卡切换</title>
  <style>
 * {
      margin: 0;
      padding: 0;
    }

    ul {
      list-style-type: none;
    }

    html,
    body {
      height: 100%;
    }

    body {
      display: flex;
      justify-content: center;
      align-items: center;
    }

    .wrap {
      display: flex;
      flex-direction: column;
      width: 600px;
      height: 320px;
      box-shadow: 0 0 4px #333;

    }

    .tab {
      display: flex;
      background-color: #666;
    }

    .tab li {
      width: 80px;
      height: 45px;
      line-height: 45px;
      font-size: 20px;
      text-align: center;
      color: #fff;
      background-color: #666;
      border-right: 2px solid orange;
      cursor: pointer;
    }

    .tab li:hover {
      opacity: .8;
    }

    .content {
      position: relative;
    }

    .content li {
      display: none;
      position: absolute;
      width: 100%;
      height: 220px;
      background-color: #368;
      color: #fff;
      font-size: 30px;
    }

    .tab li.on {
      background-color: #fff;
      color: orange;
      font-weight: 700;
    }

    .content li.active {
      display: block;
    }
  </style>
</head>

<body>
  <div class="wrap">
    <ul class="tab">
      <li class="on">图片</li>
      <li>专栏</li>
      <li>热点</li>
    </ul>
    <ul class="content">
      <li class="active">我是图片的内容</li>
      <li>我是专栏的内容</li>
      <li>我是热点的内容</li>
    </ul>
  </div>
  <script>
    var aTab = document.querySelectorAll('.tab li');
    var oTab = document.querySelector('.tab');
    var aCon = document.querySelectorAll('.content li');
   
    // switchTab()

    //方法一:排他法 先把所有选项都重置 然后单独设置某一个
    // function switchTab() {
    //   for (var i = 0, len = aTab.length; i < len; i++) {
    //     (function (i) {
    //       aTab[i].onclick = function () {
    //         for (var j = 0; j < len; j++) {  //循环排他时消耗资源,优化轮转
    //           aTab[j].className = '';
    //           aCon[j].className = '';
    //         }
    //         aTab[i].className = 'on';
    //         aCon[i].className = 'active';
    //       }
    //     })(i)
    //   }
    // }

    //方法二:轮转法
    // function switchTab() {
    //   var index = 0;
    //   for (var i = 0, len = aTab.length; i < len; i++) {
    //     (function (i) {
    //       aTab[i].onclick = function () {    //循环绑定事件耗资源,优化事件委托
    //         aTab[index].className = '';
    //         aCon[index].className = '';
    //         index = i;
    //         aTab[index].className = 'on';
    //         aCon[index].className = 'active';
    //       }
    //     })(i);
    //   }
    // }

    //方法三:轮转法之事件委托优化 通过监听父元素的点击事件,找到点击的子元素下标
    var index = 0;
    oTab.onclick = function (e) {
      // console.log(e.target); //触发事件的DOM目标
      if (e.target.tagName.toLowerCase() === 'li') { //如果触发事件的目标是的标签名称是li的话  e.target.tagName返回的是大写
        oTab.children[index].className = '';
        aCon[index].className = '';
        index = getElementIdx(e.target);
        oTab.children[index].className = 'on';
        aCon[index].className = 'active';
      }
    }
    //获取元素的下标
    function getElementIdx (item) {
      var elements = item.parentNode.children;
      for (var i = 0, len = elements.length; i < len; i++) {
        if (item === elements[i]) {
          return i;
        }
      }
    }
  </script>
</body>
</html>
相关推荐
kyriewen15 分钟前
老板逼我上AI,我偷偷在浏览器里跑LLaMA,省下20万API费
前端·react.js·llm
Beginner x_u25 分钟前
前端八股整理(手写 02)|数组转树、数组扁平化、随机打乱一个数组
前端·数组·数组转树·数组扁平化
KaMeidebaby29 分钟前
卡梅德生物技术快报|禽类成纤维细胞 FISH 实验:鸟类性别染色体基因定位技术实现与数据验证
前端·数据库·其他·百度·新浪微博
天若有情67342 分钟前
前端高阶性能优化:跳出传统懒加载与预加载,基于用户行为做轻量预判加载
前端·性能优化
小小小小宇1 小时前
前端转后端:SQL 是什么
前端
张元清2 小时前
React Observer Hooks:7 种监听 DOM 而不写样板代码的方式
前端·javascript·面试
广州华水科技2 小时前
单北斗GNSS变形监测是什么?主要有怎样的应用与优势?
前端
卷帘依旧2 小时前
【未完待续】React高频面试题
前端
m0_738120722 小时前
ctfshow靶场SSRF部分——基础绕过到协议攻击解题思路与技巧(一)
服务器·前端·网络·安全·php
counterxing2 小时前
AI Agent 做长任务,问题到底 出在哪?
前端·后端·ai编程