Skip to content
html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    .tab-bar {
      margin: 30px auto;
      width: 500px;
    }

    .tab-bar .tab {
      position: relative;
      top: 1px;
    }

    .tab-bar .tab li{
      float: left;
      list-style-type: none;
      height: 35px;
      font-size: 14px;
      padding: 0 10px;
      margin-right: 10px;
      border: 1px solid black;
      line-height: 35px;
      background-color: #ddd;
    }

    .tab-bar div {
      box-sizing: border-box;
      width: 500px;
      height: 150px;
      border: 1px solid black;
      padding: 10px 10px;
      float: left;
      display: none;
    }

    .tab-bar .tab li.active {
      background-color: #fff;
      border-bottom: 1px solid transparent;
    }

    .tab-bar div.active {
      display: block;
    }
  </style>
</head>
<body>
  <section class="tab-bar" id="tab-bar">
    <ul class="tab">
      <li index='0' class="active">编程</li>
      <li index='1'>读书</li>
      <li index='2'>运动</li>
    </ul>
    <div class='active'>编程</div>
    <div >读书</div>
    <div >运动</div>
  </section>

  <script>
    const lis = document.querySelectorAll('.tab-bar .tab li')
    const boxs = document.querySelectorAll('div')
    // 默认上一项是0
    let prev = 0

    // let 本质是块级私有作用域+闭包
    // for (let i = 0; i < lis.length; i++) {
    //   lis[i].onclick = function () {
    //     // 如果当前点击的和上一次点击的是同一项,不做处理
    //     if (prev === i) return

    //     // 不是同一项,清除上一项的active
    //     lis[prev].className = ''
    //     boxs[prev].className = ''

    //     // 这一项设置active
    //     lis[i].className = 'active'
    //     boxs[i].className = 'active'

    //     // 设置这一项为下次点击时的上一项
    //     prev = i
    //   }
    // }
    
    // 闭包
    // for (var i = 0; i < lis.length; i++) {
    //   lis[i].onclick = (function (i) {
    //     // 自执行函数返回结果被占用了,形成闭包

    //     return function () {
    //       // 如果当前点击的和上一次点击的是同一项,不做处理
    //       if (prev === i) return

    //       // 不是同一项,清除上一项的active
    //       lis[prev].className = ''
    //       boxs[prev].className = ''

    //       // 这一项设置active
    //       lis[i].className = 'active'
    //       boxs[i].className = 'active'

    //       // 设置这一项为下次点击时的上一项
    //       prev = i
    //     }
    //   })(i)
    // }

    // 闭包
    // for (var i = 0; i < lis.length; i++) {
    //   (function (i) {
    //     // 小函数被占用了,形成闭包

    //     lis[i].onclick = function () {
    //       // 如果当前点击的和上一次点击的是同一项,不做处理
    //       if (prev === i) return

    //       // 不是同一项,清除上一项的active
    //       lis[prev].className = ''
    //       boxs[prev].className = ''

    //       // 这一项设置active
    //       lis[i].className = 'active'
    //       boxs[i].className = 'active'

    //       // 设置这一项为下次点击时的上一项
    //       prev = i
    //     }
    //   })(i)
    // }

    // 闭包
    // lis.forEach((item, i) => {
    //   // 小函数被占用,形成闭包

    //   item.onclick = function () {
    //     // 如果当前点击的和上一次点击的是同一项,不做处理
    //     if (prev === i) return

    //     // 不是同一项,清除上一项的active
    //     lis[prev].className = ''
    //     boxs[prev].className = ''

    //     // 这一项设置active
    //     lis[i].className = 'active'
    //     boxs[i].className = 'active'

    //     // 设置这一项为下次点击时的上一项
    //     prev = i
    //   }
    // })

    // 自定义属性 推荐
    // for (let i = 0; i < lis.length; i++) {
    //   lis[i].myIndex = i

    //   lis[i].onclick = function () {
    //     // 如果当前点击的和上一次点击的是同一项,不做处理
    //     if (prev === this.myIndex) return

    //     // 不是同一项,清除上一项的active
    //     lis[prev].className = ''
    //     boxs[prev].className = ''

    //     // 这一项设置active
    //     lis[this.myIndex].className = 'active'
    //     boxs[this.myIndex].className = 'active'

    //     // 设置这一项为下次点击时的上一项
    //     prev = this.myIndex
    //   }
    // }

    // 事件委托 最推荐
    const tabBar = document.getElementById("tab-bar")
    const tab = document.querySelector('.tab')

    tabBar.onclick = function (event) {
      if (event.target.tagName === 'LI') {
        // 标签内手动设置index
        // let i = +event.target.getAttribute('index')
        // 计算出index
        let i = Array.prototype.indexOf.call(tab.children, event.target)

        if (prev === i) return

        // 不是同一项,清除上一项的active
        lis[prev].className = ''
        boxs[prev].className = ''

        // 这一项设置active
        lis[i].className = 'active'
        boxs[i].className = 'active'

        // 设置这一项为下次点击时的上一项
        prev = i
      }
    }

    // function changeTab (n) {
    //   // 清除所有选中样式,鼠标滑过谁再给谁样式
    //   for (let i = 0; i < lis.length; i++) {
    //     lis[i].className = ''
    //     boxs[i].className = ''
    //   }

    //   lis[n].className = 'active'
    //   boxs[n].className = 'active'
    // }

    // for (let i = 0; i < lis.length; i++) {
    //   lis[i].onmouseover = function () {
    //     changeTab(i)
    //   }
    // }
  </script>
</body>
</html>