用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>Document</title>
    <link rel="stylesheet" href="tab.css">
</head>

<body>
    <div class="box" id="main">
        <div class="head">
            <ul>
                <li class="head_click"><span>选项卡</span><button><img src="../img/叉号.png" alt=""></button></li>
                <!-- 这个叉号是阿里云小图标下载的 -->
                <li><span>选项卡</span><button><img src="../img/叉号.png" alt=""></button></li>
                <li><span>选项卡</span><button><img src="../img/叉号.png" alt=""></button></li>
            </ul>
            <div class="Add">
                <span>+</span>
            </div>
        </div>
        <div class="body_html">
            <section class="body_click">1</section>
            <section>2</section>
            <section>3</section>
        </div>
    </div>
    <script src="tab.js"></script>
</body>


</html>

上面是HTML文件,里面的叉号是阿里云小图标下载的

img {
    width: 10px;
    height: 10px;
}

button {
    position: absolute;
    top: 1px;
    right: 1px;
    background-color: white;
    border: none;
}

.box {
    position: relative;
    margin: 50px auto;
    width: 600px;
    height: 500px;
    border: 1px solid black;
}

.head ul {
    position: absolute;
    top: -18px;
    left: -40px;
    /* border-bottom: 1px solid black; */
    width: 560px;
    height: 50px;
    list-style: none;
}

.head ul li {
    position: relative;
    text-align: center;
    line-height: 50px;
    border: 1px solid black;
    float: left;
    width: 100px;
    height: 50px;
}

.Add {
    position: absolute;
    right: 5px;
    top: 15px;
}

.Add span {
    display: inline-block;
    border: 1px solid black;
    width: 20px;
    height: 20px;
    text-align: center;
    line-height: 20px;
}

.body_html {
    position: absolute;
    top: 100px;
    left: 0px;
}

.body_html section {
    width: 600px;
    height: 300px;
    display: none;
}

.body_html .body_click {
    display: block;
}

.head .head_click {
    border-bottom: none;
}

.head input {
    width: 40px;
    height: 20px;
}

.body_html input {
    width: 500px;
    height: 300px;
    border: none;
}

结合HTML文件看

var that
class Tab {
    constructor(id) {
        that = this
        this.main = document.querySelector(id)
        this.Add = this.main.querySelector('.Add')
        this.ul = this.main.querySelector('ul')
        this.body_js = this.main.querySelector('.body_html')
        this.initializationTab()
    }
    cleanTab() {
        //清除其他未选定的选项卡的样式
        for (var i = 0; i < this.lis.length; i++) {
            this.lis[i].className = ''
            this.sections[i].className = ''
        }
    }
    getTab() {
        //获取改变的元素节点
        this.lis = this.main.querySelectorAll("li")
        this.sections = this.main.querySelectorAll("section")
        this.btns = this.main.querySelectorAll("button")
        this.spans = this.main.querySelectorAll(".head ul li span:first-child")
    }
    initializationTab() {
        //初始化样式,和点击事件
        this.getTab();
        this.Add.onclick = this.addTab;
        for (var i = 0; i < this.lis.length; i++) {
            this.lis[i].index = i;
            this.lis[i].onclick = this.cutTab;
            this.btns[i].onclick = this.removeTab;
            this.spans[i].ondblclick = this.modificationTab;
            this.sections[i].ondblclick = this.modificationTab;
        }
    }
    cutTab() {
        //点击切换选项卡
        that.cleanTab();
        this.className = 'head_click'
            //因为调用这个切换函数的是被点击的小li,所以没有section节点,此处应该用that
        that.sections[this.index].className = 'body_click'
    }
    addTab() {
        //添加选项卡
        that.cleanTab();
        var num = Math.random(); //这就是用JS的math方法弄一个随机数,看到变化
        var li = '<li class="head_click"><span>新选项卡</span><button><img src="../img/叉号.png" alt=""></button></li>'
        var section = '<section class="body_click">' + num + '</section>'
        that.ul.insertAdjacentHTML("beforeend", li)
        that.body_js.insertAdjacentHTML("beforeend", section)
        that.initializationTab();
    }
    removeTab(e) {
        //删除选项卡
        that.initializationTab();
        e.stopPropagation();
        var index = this.parentNode.index;
        that.ul.removeChild(that.lis[index])
        that.body_js.removeChild(that.sections[index])
        that.cleanTab();
        index--;
        that.lis[index] && that.lis[index].click();
    }
    modificationTab() {
        //修改选项卡
        window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
        var inp = '<input type="text" autofocus=""autofocus value=' + this.innerHTML + '>'
        this.innerHTML = inp;
        this.childNodes[0].onblur = function() {
            var str = this.value
            this.parentNode.innerHTML = str
        }
    }
}
new Tab('#main')

JS代码,备注写的很清楚

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值