js - 面向对象 - 小案例:轮播图随机点名选项卡鼠标拖拽

Posted 九九柒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js - 面向对象 - 小案例:轮播图随机点名选项卡鼠标拖拽相关的知识,希望对你有一定的参考价值。

面向对象

对象 : (黑盒子)不了解内部结构, 知道表面的各种操作.

面向对象 : 不了解原理的情况下 会使用功能 .

面向对象是一种通用思想,并非编程中能用,任何事情都能用.

编程语言的面向对象的特点:

? 封装 : 看不到里面的东西 , 用好表面功能.

? 继承 : 从父类继承一些方法 , 属性 , 子类又有一些新的特性.

? 多态

? 抽象 : 抽取一个功能里面多个核心的功能模块。

? 思想: 高内聚、低耦合

? 低耦合 :每个功能模块之间耦合度要低

? 高内聚 :模块内部要紧密相连

面向对象的风格 都是 从 new 开始的
js对象的分类:

宿主对象、内置对象 (Math)、内部对象( new )

构造函数: 通过 new 调用的

对象是通过构造函数构建出来的,对象用来存储数据

构造函数 -> 对象 -> 存储数据

为了区分构造函数与普通函数: 构造函数的首字母 大写
构造函数 与 普通函数的区别
  • 普通函数如果内部没有return的时候 , 返回的是undefined

  • 构造函数内部没有return返回值的时候,返回的构造出来的对象。

  • 构造函数内部的this指向,指向的是当前对象。

    总结:构造函数在new的时候构建对象,会在内部自动返回一个this 指向构造的对象。

面向对象实现流程:

1. 全局变量作为属性

2. 把对象的方法放在prototype

3. new实例化对象

4. this指向


    function  构造函数名称 首字母大写(){
            this.属性 = 属性值

            //调用初始化方法
            this.init();
        }
        构造函数名称 首字母大写 .prototype = {
            //初始化方法 : 整合各个功能模块
            init : function(){
                //调用绑定事件模块
                this.eventBind();
            },
            fn1 : function(){

            },
            fn2 : function(){

            },
            eventBind : function(){

            }
        }
        new 构造函数名称 首字母大写 ();

面向对象实现简版轮播图
分析:
功能模块拆分
1: 图片移动
2:下一张的功能
3:上一张的功能
4:事件绑定模块    

    // 构造Banner函数
    function Banner(){
        this.oimgbox = document.querySelector('.imgbox'),
        this.oimg = document.querySelectorAll('img'),
        this.obtn = document.querySelectorAll('span'),
        this.distance = this.oimg[0].offsetWidth,
        this.count = 0 ;
        //调用初始化模块
        this.init();
       }
    //
       Banner.prototype = {
           //初始化模块
           init : function(){
            this.oimgbox.style.width = this.oimg.length * this.distance + 'px';
            this.eventBind();
           },
          //图片移动模块
           toimg : function(){
            move(this.oimgbox,{'left': -this.distance * this.count})
            
           },
          //下一张
           next : function(){
            if(this.count >= this.oimg.length - 1){
               this.count = 0;
           }else{
               this.count++;
           }
           this.toimg();
           },
          //上一张
           pre : function(){
            if(this.count <= 0 ){
               this.count = this.oimg.length - 1;
           }else{
               this.count--;
           }
           this.toimg();
           },
          //事件绑定模块
           eventBind : function(){
            addEventListener(this.obtn[1],'click',this.next.bind(this));
            addEventListener(this.obtn[0],'click',this.pre.bind(this));
           }
       }
       new Banner();
面向对象实现选项卡效果
  function Tab(){
            this.obtn = document.querySelectorAll('span');
            this.oarticle = document.querySelectorAll('article');
            this.init();
        }
        Tab.prototype = {
            init : function(){
                this.eventBind();
            },
           // 清除类名
            clearClass : function(){
              for(let i = 0 ,k = this.obtn.length; i < k; i++){
                this.obtn[i].className  =  '';
                this.oarticle[i].className = '';
               }
              } ,
              addClass :function(index){
                this.clearClass();
                this.obtn[index].className = 'active';
                this.oarticle[index].className ='show';
                  
            },
            eventBind : function(){
                for(let i = 0, k = this.obtn.length; i<k; i++){
                   // this.obtn[i].addEventListener('click',this.addClass.bind(this,i));
                   this.obtn[i].addEventListener('click',this.addClass.bind(this,i));

                }
            }  
        }
        new Tab();
随机点名
<div class="box">随机点名</div>
   <span class="btn">开始</span>
           1.初始化
           2.文字变化 定时器 
           3.开始
           4.结束
           5.判断什么时候开始,什么时候结束 
           6.控制flag
           6.事件绑定


<script>
        var arr =['黄子韬','白敬亭','范世錡','黄景瑜','秦霄贤','彭昱畅','汪苏泷','侯明昊','秦凯旋'];
       function RandomName(){
            this.box = document.querySelector('.box');
            this.btn = document.querySelector('.btn');
            this.flag = false;
            this.init();
        }
        RandomName.prototype = {
            init : function(){
                this.eventBind();
            },
            textChange : function(){
                var _this = this;
                clearInterval(this.timer);
                this.timer = setInterval(function(){
                    //每隔一段事件生成一个下标
                    let num = parseInt(Math.random() * arr.length);
                    //根据随机的下标 取到名字 然后交给 box;
                    _this.box.innerhtml = arr[num];
                    //添加随机颜色
                    _this.box.style.color = randomColor();
                },100)
            },
            //开始
            startTxt : function(){
                this.btn.innerHTML = '开始';
            },
            //暂停
            stopTxt : function(){
                this.btn.innerHTML = '暂停';
            },
            //判断是否开始
            isStart : function(){
                if(this.flag){
                    this.textChange();
                    this.stopTxt();
                }else{
                    clearInterval(this.timer);
                    this.startTxt();
                }
            },
            //控制flag
            controlFlag : function(){
                this.flag = this.flag ? false : true;
                //用flag控制 开始  或 暂停
                this.isStart();
            },
            //evntBind:
            eventBind : function(){
                this.btn.addEventListener('click',this.controlFlag.bind(this));
            }

        }
        new RandomName();
    </script>
鼠标拖拽
  function Drag(){
            this.div = document.querySelector('div');
        //定义一个空变量
            this.fn = null;
            this.init();
        }
        Drag.prototype ={
            init : function(){
                this.eventBind();
            },
            //鼠标按下 获取位置
            Down : function(e){
                e = e || window.event;
                this.x = e.offsetX;
                this.y = e.offsetY;

                //绑定鼠标移动事件 fn 调用 move()
                document.addEventListener('mousemove',this.fn = this.Move.bind(this));
                document.addEventListener('mouseup',this.Up.bind(this));
            },
            //鼠标移动 
            Move : function(e){
                e = e || window.event;
                let 
                    l = e.clientX - this.x,
                    t = e.clientY - this.y;

                this.div.style.left = l +'px';
                this.div.style.top = t + 'px';
            },
            //鼠标抬起 绑定事件不移动
            Up : function(){
                document.removeEventListener('mousemove',this.fn);
            },
            eventBind : function(){
                //鼠标按下 
                this.div.addEventListener('mousedown',this.Down.bind(this));

            }
        }
        new Drag();
面向对象实现完整版轮播图
    <script>
            function Banner(){
                this.oimgbox = document.querySelector('.imgbox');
                this.oimg = document.getElementsByTagName('img');
                this.obtn = document.querySelectorAll('span');
                this.ocricle = document.querySelector('.circlebox');
                this.osection = document.querySelector('section');
                this.timer = null;
                this.distance = this.oimg[0].offsetWidth;
                this.count = 0;

                this.init();
            }
            Banner.prototype = {
                //初始化 
                init : function(){
                    this.clone();
                    this.autoplay();
                    this.setWidth();
                    this.addLi();
                    this.addClass();
                    this.eventBind();
                },
                setWidth : function(){
                    this.oimgbox.style.width = this.oimg.length * this.distance +'px';
                },
                //克隆图片
                clone : function(){
                    this.firstimg = this.oimg[0].cloneNode();
                    this.oimgbox.appendChild(this.firstimg);
                },
                // 图片移动
                toImg : function(){
                   move(this.oimgbox,{'left' : -this.distance * this.count});
                },
                //下一张
                next : function(){
                    if(this.count >= this.oimg.length -1){
                        this.oimgbox.style.left = 0;
                        this.count = 1;
                    }else{
                        this.count++;
                    }
                    this.toImg();
                    this.clearClass();
                    this.oli[this.count >= this.oimg.length -1 ? 0:this.count].className = 'active';
                   
                },
                //上一张
               pre : function(){
                   if(this.count <= 0){
                       this.oimgbox.style.left = -this.distance *(this.oimg.length - 1) + 'px';
                       this.count = this.oimg.length -2;
                   }else{
                       this.count--;
                   }
                    this.toImg();
                    this.clearClass();
                    this.oli[this.count].className = 'active';
                },
                //定时器
                autoplay : function(){
                    var _this = this;
                    clearInterval(this.timer);
                    this.timer = setInterval(() => {
                        _this.next();
                    }, 3000);
                },

                //清除定时器
                clearTimer : function(){
                    clearInterval(this.timer);
                },

                //添加圆点
                 addLi : function(){
                    for(let i = 0 ;i < this.oimg.length -1; i++){
                        this.createLi = document.createElement('li');
                        this.ocricle.appendChild(this.createLi);
                    }

                    this.oli = document.getElementsByTagName('li');
                    this.oli[0].className  = 'active';
                 },
                 //清除类名
                 clearClass : function(){
                    for(let i = 0 ,k = this.oli.length;i<k;i++){
                        this.oli[i].className = '';
                    }
                 },
                 addClass : function(){
                    for(let i = 0,k = this.oli.length;i<k;i++){
                        addEventListener(this.oli[i],'mouseover',()=>{
                            this.clearClass();
                            this.oli[i].className = 'active';
                            this.count = i;
                            this.toImg();
                        })
                    }
                 },
                 //事件调用
                eventBind : function(){
                  addEventListener(this.obtn[0],'click',this.next.bind(this));
                  addEventListener(this.obtn[1],'click',this.pre.bind(this));
                  addEventListener(this.osection,'mouseover',this.clearTimer.bind(this));
                  addEventListener(this.osection,'mouseout',this.autoplay.bind(this));
                }
            }
            new Banner();
     </script>

以上是关于js - 面向对象 - 小案例:轮播图随机点名选项卡鼠标拖拽的主要内容,如果未能解决你的问题,请参考以下文章

原生js简单轮播图 代码

案例:网页轮播图

案例:网页轮播图

JS---案例:简单轮播图

原生js实现的3个小特效(时钟轮播图选项卡)

web前端设计必备网页特效案例 - 轮播图