【Pink老师es6】JavaScript 面向对象tab栏案例

目录

 HTML代码:

 CSS代码:

         1、切换功能 

         2、添加功能

         3、删除功能

         4、修改功能

整体的JavaScript代码:


利用面向对象对tab栏进行切换功能、添加功能、删除功能和修改功能

 

 

 HTML代码:

<body>
    <main>
        <h4>
            JS 面向对象 动态添加标签
        </h4>
        <div class="tabbox" id="tab">
            <!-- 头部 -->
            <nav class="firstnav">
                <ul>
                    <li class="liactive"><span>测试1</span><span class="close"><i>+</i></span></li>
                    <li><span>测试2</span><span class="close"><i>+</i></span></li>
                    <li><span>测试3</span><span class="close"><i>+</i></span></li>
                </ul>
                <div class="tabadd">
                    <span>+</span>
                </div>
            </nav>
            <!-- body -->
            <div class="tabscon">
                <section class="conactive">测试1</section>
                <section>测试2</section>
                <section>测试3</section>
            </div>
        </div>
    </main>
</body>

CSS代码:

* {
    margin: 0;
    padding: 0;
}

li {
    list-style: none;
}

main {
    margin: 100px auto;
}

h4 {
    font-size: 20px;
    text-align: center;
}

.tabbox {
    position: relative;
    margin: 40px auto;
    width: 900px;
    border: 1px solid orangered;
}

.firstnav {
    position: relative;
    height: 50px;
    padding: 0;
}

.firstnav ul {
    position: absolute;
    top: 0;
    left: 0;
}

.firstnav ul li {
    position: relative;
    float: left;
    width: 80px;
    height: 50px;
    padding: 0 10px;
    font-size: 16px;
    text-align: center;
    list-style: none;
    border-right: 1px solid #999;
}

.firstnav ul li span:first-child {
    position: absolute;
    top: 10px;
    left: 10px;
    width: 80px;
    height: 30px;
    line-height: 30px;
}

.firstnav ul li span:first-child input {
    padding: 0 2px;
    width: 72px;
    height: 30px;
    border: 2px solid skyblue;
    outline-color: skyblue;
}

.firstnav .liactive {
    border-bottom: 1px solid #fff;
}

.firstnav ul li .close {
    position: absolute;
    top: 0;
    right: 0;
    width: 10px;
    height: 10px;
    line-height: 8px;
    font-size: 8px;
    color: #fff;
    background-color: #000;
    border-bottom-left-radius: 10px;
    cursor: pointer;
}

.firstnav ul li .close i {
    display: block;
    font-style: normal;
    transform: rotate(45deg);
}

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

.tabadd span {
    display: block;
    width: 15px;
    height: 15px;
    color: #666;
    line-height: 12px;
}

.tabscon {
    height: 300px;
    padding: 20px;
    border-top: 1px solid #999;
}

.tabscon section {
    height: 300px;
    display: none;
}

.tabscon .conactive {
    display: block;
}

.tabscon section input {
    box-sizing: border-box;
    padding: 10px;
    width: 860px;
    height: 300px;
    border: 2px solid skyblue;
    outline-color: skyblue;
}

1、切换功能 

利用排他思想,清除其他li的样式,点击当前li会切换成选定状态

 //1、切换功能   注意:toggleTab里边的this指向的是li
    toggleTab() {
        that.clearClass();
        this.className = "liactive";
        that.sections[this.index].className = "conactive";
    }
   

2、添加功能

在这里没用使用老师创建选定状态li和section的方法,所以前边没有调用清除样式的功能

 

 addTab() {
        //(1)创建li元素和section元素
        var li = '<li><span>新选项卡</span><span class="close icon-guanbi"><i>+</i></span></li>';
        var section = '<section>新内容</section>';
        //(2)把这两个元素追加到对应的父元素里边
        that.ul.insertAdjacentHTML("beforeend", li);
        that.fsection.insertAdjacentHTML("beforeend", section);
        that.init();
    }

 3、删除功能

在这里添加了一个老师没有补充的bug,就是当删除索引号为0的选定状态的li时,tab栏将没有选定状态的li

removeTab(e) {
        e.stopPropagation();    //阻止冒泡,防止触发li的点击切换事件
        var index = this.parentNode.index;
        //根据索引号删除对应的li和section
        that.lis[index].remove();
        that.sections[index].remove();
        that.init();
        //当删除的不是选定状态的li时,那么原来选定状态的li保持不变
        if (document.querySelector(".liactive")) return;
        //当删除了选定状态索引号为0的li时,让后一个元素变为选定状态
        if (index == 0) {
            that.lis[index].click();
        }
        //当删除了选定状态的li时,让前一个li变为选定状态
        index--;
        //自动调用点击事件,不需要鼠标点击触发
        that.lis[index] && that.lis[index].click();

    }

 4、修改功能

这里可能会出现input表单过长问题,需要在CSS里边提前添加好需要的input表单的样式

editTab() {
        var str = this.innerHTML;
        //双击禁止选定文字
        window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
        //生成input表单
        this.innerHTML = '<input type= "text" />';
        var input = this.children[0];
        input.value = str;
        input.select();    //文本框里的文字处于选定状态
        //当鼠标离开文本框时,就把文本框里的内容赋值给span
        input.onblur = function () {
            this.parentNode.innerHTML = this.value;
        }
        //按下回车也可以把文本框里的内容给span
        input.onkeyup = function (e) {
            if (e.keyCode === 13) {
                this.blur();
            }
        }
    }

 整体的JavaScript代码:

var that;
class Tab {
    constructor(id) {
        that = this;
        //获取元素
        this.main = document.querySelector(id);
        this.add = this.main.querySelector(".tabadd");
        this.ul = this.main.querySelector(".firstnav ul:first-child");
        this.fsection = this.main.querySelector(".tabscon");
        this.init();
    }
    init() {
        this.updateNode();
        //init 初始化操作,让相关的元素绑定事件
        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.closes[i].onclick = this.removeTab;
            this.spans[i].ondblclick = this.editTab;    //ondblclick 双击事件
            this.sections[i].ondblclick = this.editTab;
        }
    }
    //动态获取所有的li和section
    updateNode() {
        this.lis = this.main.querySelectorAll("li");
        this.sections = this.main.querySelectorAll("section");
        this.closes = this.main.querySelectorAll(".close");
        this.spans = this.main.querySelectorAll(".firstnav li span:first-child");
    }
    //1、切换功能   注意:toggleTab里边的this指向的是li
    toggleTab() {
        that.clearClass();
        this.className = "liactive";
        that.sections[this.index].className = "conactive";
    }
    //清除其他样式,显示当前样式     注意:clearClass是用that来调用的,所以里边的this指向没问题
    clearClass() {
        for (var i = 0; i < this.lis.length; i++) {
            this.lis[i].className = "";
            this.sections[i].className = "";
        }
    }
    //2、添加功能
    addTab() {
        //(1)创建li元素和section元素
        var li = '<li><span>新选项卡</span><span class="close icon-guanbi"><i>+</i></span></li>';
        var section = '<section>新内容</section>';
        //(2)把这两个元素追加到对应的父元素里边
        that.ul.insertAdjacentHTML("beforeend", li);
        that.fsection.insertAdjacentHTML("beforeend", section);
        that.init();
    }
    //3、删除功能
    removeTab(e) {
        e.stopPropagation();    //阻止冒泡,防止触发li的点击切换事件
        var index = this.parentNode.index;
        //根据索引号删除对应的li和section
        that.lis[index].remove();
        that.sections[index].remove();
        that.init();
        //当删除的不是选定状态的li时,那么原来选定状态的li保持不变
        if (document.querySelector(".liactive")) return;
        //当删除了选定状态索引号为0的li时,让后一个元素变为选定状态
        if (index == 0) {
            that.lis[index].click();
        }
        //当删除了选定状态的li时,让前一个li变为选定状态
        index--;
        //自动调用点击事件,不需要鼠标点击触发
        that.lis[index] && that.lis[index].click();

    }
    //4、修改功能
    editTab() {
        var str = this.innerHTML;
        //双击禁止选定文字
        window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
        //生成input表单
        this.innerHTML = '<input type= "text" />';
        var input = this.children[0];
        input.value = str;
        input.select();    //文本框里的文字处于选定状态
        //当鼠标离开文本框时,就把文本框里的内容赋值给span
        input.onblur = function () {
            this.parentNode.innerHTML = this.value;
        }
        //按下回车也可以把文本框里的内容给span
        input.onkeyup = function (e) {
            if (e.keyCode === 13) {
                this.blur();
            }
        }
    }
}
new Tab("#tab");

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奶油味的泡芙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值