javaScript対象者向けトレーナー例——Tabバー切り替え

39113 ワード

HTML部分
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>     Tab</title>
    <link rel="stylesheet" href="./styles/tab.css">
    <link rel="stylesheet" href="./styles/style.css">
</head>

<body>

    <main>
        <h4>
            Js             
        </h4>
        <div class="tabsbox" id="tab">
            <!-- tab    -->
            <nav class="fisrstnav">
                <ul>
                    <li class="liactive"><span>  1</span><span class="iconfont icon-guanbi"></span></li>
                    <li><span>  2</span><span class="iconfont icon-guanbi"></span></li>
                    <li><span>  3</span><span class="iconfont icon-guanbi"></span></li>
                </ul>
                <div class="tabadd">
                    <span>+</span>
                </div>
            </nav>

            <!-- tab    -->
            <div class="tabscon">
                <section class="conactive">  1</section>
                <section>  2</section>
                <section>  3</section>
            </div>
        </div>
    </main>
    
    <script src="js/tab.js"></script>
</body>

</html>
var that;
class Tab {
    constructor(id) {
        that = this;
        //     
        this.main = document.querySelector(id);
        this.add = this.main.querySelector('.tabadd');
        this.ul = this.main.querySelector('.fisrstnav ul:first-child');
        this.psection = this.main.querySelector('.tabscon');
        //    
        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.toggelTab;
            this.remove[i].onclick = this.removeTab;
            this.spans[i].ondblclick = this.editTab;
            this.sections[i].ondblclick = this.editTab;
        }
    }

    //       
    updateNode() {
        this.lis = this.main.querySelectorAll('li')
        this.sections = this.main.querySelectorAll('section')
        this.remove = this.main.querySelectorAll('.icon-guanbi');
        this.spans = this.main.querySelectorAll('.fisrstnav li span:first-child');
    }

    //   
    toggelTab() {
        that.clearClassName();
        this.className = 'liactive';
        that.sections[this.index].className = 'conactive';
    }

    //     
    clearClassName() {
        for(var i = 0; i < this.lis.length; i++) {
            this.lis[i].className = '';
            this.sections[i].className = '';
        }
    }
    //   
    addTab() {
        //     
        that.clearClassName();
        //     
        var li = '
  • '
    ; that.ul.insertAdjacentHTML('beforeend', li); var section = '
    '
    ; that.psection.insertAdjacentHTML('beforeend', section); // that.init() } // removeTab(e) { e.stopPropagation(); var index = this.parentNode.index; that.lis[index].remove(); that.sections[index].remove(); // that.init() // li, if(document.querySelector('.liactive')) { return; } index--; that.lis[index] && that.lis[index].click(); } // editTab() { // window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty(); var tabText = this.innerHTML; this.innerHTML = '' var input = this.children[0]; input.value = tabText; input.select(); // input.onblur = function() { this.parentNode.innerHTML = this.value; } input.onkeyup = function(e) { if(e.keyCode === 13) { this.blur(); } } } } new Tab('#tab')
    Tab.css部分
    * {
        margin: 0;
        padding: 0;
    }
    
    ul li {
        list-style: none;
    }
    
    main {
        width: 960px;
        height: 500px;
        border-radius: 10px;
        margin: 50px auto;
    }
    
    main h4 {
        height: 100px;
        line-height: 100px;
        text-align: center;
    }
    
    .tabsbox {
        width: 900px;
        margin: 0 auto;
        height: 400px;
        border: 1px solid lightsalmon;
        position: relative;
    }
    
    nav ul {
        overflow: hidden;
    }
    
    nav ul li {
        float: left;
        width: 100px;
        height: 50px;
        line-height: 50px;
        text-align: center;
        border-right: 1px solid #ccc;
        position: relative;
    }
    
    nav ul li.liactive {
        border-bottom: 2px solid #fff;
        z-index: 9;
    }
    
    #tab input {
        width: 80%;
        height: 60%;
    }
    
    nav ul li span:last-child {
        position: absolute;
        user-select: none;
        font-size: 12px;
        top: -18px;
        right: 0;
        display: inline-block;
        height: 20px;
    }
    
    .tabadd {
        position: absolute;
        /* width: 100px; */
        top: 0;
        right: 0;
    }
    
    .tabadd span {
        display: block;
        width: 20px;
        height: 20px;
        line-height: 20px;
        text-align: center;
        border: 1px solid #ccc;
        float: right;
        margin: 10px;
        user-select: none;
    }
    
    .tabscon {
        width: 100%;
        height: 300px;
        position: absolute;
        padding: 30px;
        top: 50px;
        left: 0px;
        box-sizing: border-box;
        border-top: 1px solid #ccc;
    }
    
    .tabscon section,
    .tabscon section.conactive {
        display: none;
        width: 100%;
        height: 100%;
    }
    
    .tabscon section.conactive {
        display: block;
    }