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

选项卡需求:

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>
相关推荐
benbenAItalk1 小时前
数字人口播视频的批量生产实践:素材规范、任务编排与质量验收
java·前端·音视频
2601_962885721 小时前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
西瓜太郎12342 小时前
Claude Code、Codex CLI、Gemini CLI 能否共用一枚 Key?先看协议选择矩阵
前端·api 网关·claude code·gemini cli·codex cli
多加点辣也没关系2 小时前
JavaScript|第31章:表单与控件
开发语言·javascript·ecmascript
陈随易4 小时前
在Finch用了62亿词元,我认为这是新一代Agent工具之神
前端·人工智能·后端
水域安全老周4 小时前
水趣钓鱼救生衣专利拆解:两级锁紧如何解决落水人衣分离
java·前端·网络
计算机魔术师5 小时前
Anthropic CEO突然喊踩刹车,OpenAI罕见力挺:AI这辆车不能只踩油门了
前端
wing985 小时前
从codex转战workbuddy使用一周的感受
前端·人工智能·后端
Highcharts.js5 小时前
常见报错排雷指南2:导出失败的官方解法
javascript·react.js·ecmascript·highcharts·可视化图表·导出模块失败·导出服务
EatFan5 小时前
Java接入支付宝 JSAPI 支付保姆教程(二):流程讲解与前后端代码讲解
前端·spring boot·后端·微信小程序·小程序·uni-app