JS封装功能方式Class&混合模式

2019-03-01  本文已影响0人  Gino_Li

两种方式封装,第一种是自定义对象里的混合模式(原型模式和构造函数模式结合),第二种是CLASS类定义对象。

以封装选项卡功能为例

👇HTML和CSS部分

    <style>
        * {
            margin: 0;
            padding: 0;
            list-style: none;
        }
        
        #tab {
            width: 500px;
            height: 500px;
            border: 1px solid black;
            margin: 0 auto;
            text-align: center;
        }
        
        #tab .btns {
            display: flex;
            justify-content: space-between;
            text-align: center;
        }
        
        .btns li {
            width: 33%;
            height: 80px;
            line-height: 80px;
            background: black;
            color: white;
            cursor: pointer;
        }
        
        .btns li:hover {
            opacity: 0.3;
        }
        
        .content {
            margin-top: 50px;
            font-size: 40px;
        }
        
        .content li:not(:first-of-type) {
            display: none;
        }
    </style>

    <body>
        <div id="tab">
            <ul class="btns">
                <li>首页</li>
                <li>新闻</li>
                <li>关于我们</li>
            </ul>
            <ul class="content">
                <li>我是首页内容</li>
                <li>我是新闻内容</li>
                <li>我是关于我们内容</li>
            </ul>
        </div>
        </body>

混合模式

            function Tab(el){
                //获取到选项卡最大的容器
                this.el=document.querySelector(el);
                //获取所有按钮
                this.btns= this.el.querySelector('.btns').children;
                //获取内容
                this.content = this.el.querySelector('.content').children;
            }
            Tab.prototype.init=function(){
                var leng = this.btns.length;
                var that = this;
                for(var i=0;i<leng;i++){
                    this.btns[i].index=i;
                    this.btns[i].addEventListener('click',function(){
                        for(var j=0;j<leng;j++){
                            that.content[j].style.display='none';
                        }
                        that.content[this.index].style.display='block';
                    })
                }
            }
            var tab = new Tab('#tab');
            tab.init();
            console.log(tab);

class定义对象(ES6语法,推荐!)

            class Tab{
                init(){
                    var leng = this.btns.length;
                    //因为下面的点击事件里的this会指向btns,所以要用that变量捕获this,让this指向实例化对象
                    var that = this;
                    //循环第一次获取到每个选项卡按钮
                    for(var i = 0; i < leng; i++) {
                        //储存btns的下标值
                        this.btns[i].index = i;
                        //添加点击事件
                        this.btns[i].addEventListener('click', function() {
                            //循环第二次获取到每个选项卡内容
                            for(var j = 0; j < leng; j++) {
                                //将所有内容的display设置为none
                                that.content[j].style.display = 'none';
                            }
                            //根据上面获取到选项卡按钮下标值显示相应的内容
                            that.content[this.index].style.display = 'block';
                        })
                    }
                }
            }
            class Tabchild extends Tab{
                constructor(el){
                    super();
                    //获取最大的盒子
                    this.el = document.querySelector(el);
                    //获取按钮,.btns是按钮的爸爸,加上.children就是指向按钮
                    this.btns = this.el.querySelector('.btns').children;
                    //获取内容
                    this.content = this.el.querySelector('.content').children;
                }
            }
            var tab = new Tabchild('#tab');
            tab.init();
            
上一篇下一篇

猜你喜欢

热点阅读