ES6面向对象版Tab栏切换

主要功能包括

  • tab栏切换
  • 增加删除tab栏
  • 双击可以修改tab栏的文字
  • 双击可以修改文本内容
* {
      margin: 0;
      padding: 0;
    }

    ul li {
      list-style: none;
    }
    input{
      height: 25px;
    }
    .tabsbox {
      width: 800px;
      height: 400px;
      border: 1px solid #000;
      margin: 100px auto;
    }

    .firstnav {
      width: 100%;
      height: 50px;
      border-bottom: 1px solid #696969;
      position: relative;
    }

    .firstnav ul li {
      float: left;
      width: 60px;
      height: 100%;
      text-align: center;
      line-height: 50px;
      border-right: 1px solid #696969;
      position: relative;
      cursor: pointer;
      font-size: 13px;
    }

    .liactive {
      background-color: red;

    }

    .tabadd span {
      width: 20px;
      height: 20px;
      border: 1px solid #999;
      text-align: center;
      line-height: 20px;
      position: absolute;
      right: 8px;
      top: 15px;
      cursor: pointer;
    }

    .iconfont {
      width: 15px;
      height: 15px;
      background-color: aqua;
      border-radius: 0px 0px 0px 15px;
      display: inline-block;
      position: absolute;
      top: 0;
      right: 0;
    }

    .tabson {
      width: 100%;
      height: 350px;
      /* overflow: hidden; */
    }

    .conactive {
      width: 100%;
      height: 350px;
      background-color: rebeccapurple;
      display: block !important;
    }

    .tabson section {
      display: none;
    }
<div class="tabsbox" id="tab">
    <nav class="firstnav">
      <ul>
        <li class="liactive"><span>测试1</span><span class="iconfont"></span></li>
        <li><span>测试2</span><span class="iconfont"></span></li>
        <li><span>测试3</span><span class="iconfont"></span></li>
      </ul>
      <div class="tabadd">
        <span>+</span>
      </div>
    </nav>

    <div class="tabson">
      <section class="conactive">测试1</section>
      <section>测试2</section>
      <section>测试3</section>
    </div>
  </div>
 var that;
    class Tab {
      constructor(id) {
        that = this;
        //获取元素
        this.main = document.querySelector(id);
        //获取加号
        this.add = this.main.querySelector('.tabadd');

        //获取li的父元素
        this.ul = this.main.querySelector('.firstnav ul:first-child');
        //获取section父元素
        this.fsection = this.main.querySelector('.tabson')

        this.init();
      }

      //初始化操作 让相关的元素绑定事件
      init() {
        this.updateNode();
        this.add.onclick = this.addTab;
        for (var i = 0; i < this.lis.length; i++) {
          this.lis[i].index = i;
          this.lis[i].onclick = this.toggleTab;
          this.remove[i].onclick = this.removeTab;
          this.spans[i].ondblclick=this.editTab;
          this.sections[i].ondblclick=this.editTab;
        }
      }
      //获取所有的小li和section
      updateNode() {
        //获取所有的小li
        this.lis = this.main.querySelectorAll('li');
        //获取所哟肚饿section
        this.sections = this.main.querySelectorAll('section');
        //获取×号
        this.remove = this.main.querySelectorAll('.iconfont');
        //获取span
        this.spans=this.main.querySelectorAll('.firstnav li span:first-child');
      }
      //1,切换功能
      toggleTab() {
        that.clearClass();
        this.className = 'liactive';
        that.sections[this.index].className = 'conactive';
      }
      clearClass() {
        for (var i = 0; i < this.lis.length; i++) {
          this.lis[i].className = '';
          this.sections[i].className = '';
        }
      }
      //2,添加功能
      addTab() {
        that.clearClass();
        //创建li元素
        var li = '<li class="liactive"><span>新选项</span><span class="iconfont"></span></li>';
        var section = '<section class="conactive">测试1</section>'
        //把这两个元素追加到对应的父元素里面
        that.ul.insertAdjacentHTML('beforeend', li);
        that.fsection.insertAdjacentHTML('beforeend', section);
        that.init();
      }
      //3,删除功能
      removeTab(e) {
        e.stopPropagation(); //阻止冒泡
        var index = this.parentNode.index;
        console.log(index);
        //根据索引号删除对应的小li和section
        that.lis[index].remove();
        that.sections[index].remove();
        that.init();
        //当我们删除的不是选中d的 原来的保持不变
        if(document.querySelector('.liactive')) return;
        //当我们删除了选中状态的li的时候  让他的前一个li处于选中状态
        index--;
        that.lis[index]&&that.lis[index].click();
      }
      //4,修改功能
      editTab() {
        var str=this.innerHTML;
        //双击禁止选中文字
        window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
        
        this.innerHTML='<input type="text"/>'
        var input=this.children[0];
        input.value=str;
        input.select();//文本框处于选中
        input.onblur=function(){
          this.parentNode.innerHTML =this.value
        };
        input.onkeyup=function(e){
          if(e.keyCode===13){
            this.blur();
          }
        }
      }
    }

    new Tab('#tab');
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值