vue与原生js,手风琴效果代码

核心:排他思想

vue写法:

html:

<div class="d-flex">
 <div class="slider_menu">
   <ul id="nav-pills" class="nav-pills">
     <li class="anchor"></li>
     <li class="pageTitle anchorActive">全部</li>
     <li class="pageTitle">示例1</li>
     <li class="pageTitle">示例2</li>
     <li class="pageTitle">示例3.0</li>
   </ul>
  </div>
</div>

css,使用了less预处理器:

动画效果,在移动元素中添加以下两行代码:

-webkit-transition: .35s;
transition: .35s;

.d-flex {
  margin-left: 12px;
  margin-top: 12px;
  display: flex;
  .slider_menu {
    position: relative;
    background: rgba(0,0,0,.1);
    border-radius: 50px;
    border: 3px solid transparent;
    overflow: hidden;
    -webkit-transform: rotate(0deg);
    -ms-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  .nav-pills {
    display: flex;
    position: relative;
  }
  .anchor {
    background: #f1404b;
    border-radius: 100px;
    position: absolute;
    width: 58px;
    height: 28px;
    left: 0px;
    opacity: 1;
    -webkit-transition: .35s;
    transition: .35s;
  }
  .pageTitle {
    cursor: pointer;
    height: 28px;
    line-height: 28px;
    padding: 0 12px;
    z-index: 99;
    color: #888;
  }
  .anchorActive {
    color: #fff;
  }
}

js部分:

      前提:vue, data中变量:
      navList: {
        active: 1,
        navWidth: 58,
        navLeft:0
      }

      // 导航栏_手风琴效果
      onNavLevel1() {
        let ulList = document.getElementById('nav-pills');
        let ul_li = ulList.getElementsByTagName('li');
        console.log(ulList);
        for (let i = 0; i < ul_li.length; i++) {
          ul_li[i].index = i;
          let that = this
          ul_li[i].onmouseover = function () {
            that.setli(ul_li, this.index, this.offsetWidth, this.offsetLeft)
            console.log(this.offsetWidth);
          }
          ul_li[i].onclick = function () {
            // 保存点击后元素状态
            that.navList.active = this.index
            that.navList.navWidth = this.offsetWidth
            that.navList.navLeft = this.offsetLeft
          }
        }
        ulList.onmouseout = () => {
          this.setli(ul_li, this.navList.active, this.navList.navWidth, this.navList.navLeft)
        }
      },
      // 手风琴效果,状态改变
      setli(ul_li, active, navWidth, navLeft){
          // offsetWidth 自身宽度 offsetLeft 与已定位父元素左侧距离 `` es6模板字符串
          ul_li[0].style = `position: absolute; width: ${navWidth}px; height: 28px; left: ${navLeft}px; opacity: 1;`
          ul_li[active].classList.add('anchorActive')
          // 除去当前元素,其他兄弟元素状态清空 俗称:排他思想
          for(let j = 0; j<ul_li.length; j++){
            if(j != active){
              ul_li[j].classList.remove('anchorActive')
            }
          }
      }

原生js写法:

<!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>导航栏手风琴效果</title>
    <style>
      * {
        margin: 0;
        padding: 0;
        list-style: none;
      }
      .d-flex {
        margin-left: 12px;
        margin-top: 12px;
        display: flex;
      }
      .d-flex .slider_menu {
        position: relative;
        background: rgba(0, 0, 0, 0.1);
        border-radius: 50px;
        border: 3px solid transparent;
        overflow: hidden;
        -webkit-transform: rotate(0deg);
        -ms-transform: rotate(0deg);
        transform: rotate(0deg);
      }
      .d-flex .nav-pills {
        display: flex;
        position: relative;
      }
      .d-flex .anchor {
        background: #f1404b;
        border-radius: 100px;
        position: absolute;
        width: 58px;
        height: 28px;
        left: 0px;
        opacity: 1;
        -webkit-transition: 0.35s;
        transition: 0.35s;
      }
      .d-flex .pageTitle {
        cursor: pointer;
        height: 28px;
        line-height: 28px;
        padding: 0 12px;
        z-index: 99;
        color: #888;
      }
      .d-flex .anchorActive {
        color: #fff;
      }
    </style>
  </head>
  <body>
    <div class="d-flex">
      <div class="slider_menu">
        <ul id="nav-pills" class="nav-pills">
          <li class="anchor"></li>
          <li class="pageTitle anchorActive">全部</li>
          <li class="pageTitle">示例1</li>
          <li class="pageTitle">示例2</li>
          <li class="pageTitle">示例3.0</li>
        </ul>
      </div>
    </div>
    <script>
      let ulList = document.getElementById("nav-pills");
      let ul_li = ulList.getElementsByTagName("li");
      //   中间变量
      let navList = {
        active: 1,
        navWidth: 50,
        navLeft: 0,
      };
      for (let i = 0; i < ul_li.length; i++) {
        ul_li[i].index = i;
        let that = this;
        ul_li[i].onmouseover = function () {
          that.setli(ul_li, this.index, this.offsetWidth, this.offsetLeft);
        };
        ul_li[i].onclick = function () {
          // 保存点击后元素状态
          navList.active = this.index;
          navList.navWidth = this.offsetWidth;
          navList.navLeft = this.offsetLeft;
        };
      }
      ulList.onmouseout = () => {
        this.setli(ul_li, navList.active, navList.navWidth, navList.navLeft);
      };
      function setli(ul_li, active, navWidth, navLeft) {
        // offsetWidth 自身宽度 offsetLeft 与已定位父元素左侧距离 `` es6模板字符串
        ul_li[0].style = `position: absolute; width: ${navWidth}px; height: 28px; left: ${navLeft}px; opacity: 1;`;
        ul_li[active].classList.add("anchorActive");
        // 除去当前元素,其他兄弟元素状态清空 俗称:排他思想
        for (let j = 0; j < ul_li.length; j++) {
          if (j != active) {
            ul_li[j].classList.remove("anchorActive");
          }
        }
      }
    </script>
  </body>
</html>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值