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>

原文地址:https://www.cnblogs.com/zhaoxinran997/p/12189337.html

时间: 2024-09-29 23:10:06

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

原生JS面向对象思想封装轮播图组件

原生JS面向对象思想封装轮播图组件 在前端页面开发过程中,页面中的轮播图特效很常见,因此我就想封装一个自己的原生JS的轮播图组件.有了这个需求就开始着手准备了,代码当然是以简洁为目标,轮播图的各个功能实现都分别分为不同的模块.目前我封装的这个版本还不适配移动端,只适配PC端. 主要的功能有:自动轮播,点击某一张图片对应的小圆点就跳转到指定图片,有前后切换按钮.使用的时候只需要传入图片的路径以及每张图片分别所对应的跳转路径还有目标盒子ID就可以了,还可以自定义每张图轮播的延时,不过延时参数不是必须

图解微信小程序---轮播图

图解微信小程序---轮播图 第一步:在页面创建swiper组件 第二步:编写js页面 注意事项:wx:for渲染我们js中的图片数组,item默认写法,获取我们的图片数组中的图片,可通过增加wx:for-item="it"来改变默认的item名 优化 原文地址:https://www.cnblogs.com/cainiao-chuanqi/p/11604314.html

js面向对象实现图片轮播插件

这个demo的学习过程很值得记录下来. 前言:学习了一遍js的面向对象,想找点东西练练手,就上网找了个用js面向对象实现图片轮播插件: http://www.codefans.net/jscss/code/3327.shtml 功能:新建一个实例就是一个图片轮播,可以新建多个,但是实例与实例之间是干扰的. 过程:看视频教程说,第一次搞面向对象,把面向过程改头换面就可以了.自己就死磕地先写了原生,再改为面向对象. 写原生的时候,遇到的问题: 不知道怎么样停止计时器:clearInterval.cl

JS原生带小白点轮播图

咱们刚刚说了js原生轮播图,现在给他加上可以随着一起走动的小圆点吧! css代码: *{ margin:0px; padding: 0px; } ul{ width: 2500px; height: 300px; position: absolute; } li{ float: left; list-style: none; } img{ width: 500px; height: 300px; } div{ width: 500px; height: 300px; margin: 50px a

原生js面向对象实现简单轮播

平时中我习惯用jquery写轮播效果,实现过程不是很难,也很方便,为了加深对js面向对象的理解,我打算用面向对象实现一个简单的轮播,这里采用了字面量的方式实现.为了实现这个过程,我们要自己动手封装一个运动函数animate,在这里我采用的是匀速运动的方式,这种方式可能体验不是很好,后面分析js代码我在详细解释.废话不多说,先上代码.页面布局可以根据自己的习惯来. html代码: <head> <meta charset="UTF-8"> <meta nam

js+html+css实现轮播图

首先先把轮播图的结构搭建起来(html),代码如下:  结构可自行搭建,结构搭建完接着就是用css去进行修饰美化   此时的ul是没有给它设置固定的宽和高的,高可以先设置,宽不能,等下让图片一张接一张一的动起来,实际上是改变了ul的left值,ul的宽可以通过图片(li)的宽 乘以 图片数量即可得到,但是不能写死,所以ul的宽我们用js去获取设置,一起看下现在的效果 好了,结构已经搭建完了,现在只是静态的,我们需要用js去让它动起来,我们先获取html中需要用到的元素并把它存给变量,这里我事先存

移动端原生js,css3实现轮播图

一.功能需求 1.自动播放2.滑动切换3.点击切换 二.思路分析 html代码: <div class="container"> <ul class="list clearfix"> <li class="item fl item5">图5</li> <li class="item fl item1">图1</li> <li class="

js写的简单轮播图

这个轮播图代码是从网上找来的,专门找了个写法简单的,只是作为一个小练习,大概原理如下: 1.首先是图片切换2.自动播放3.调用自动播放4.移动到容器上边停止播放,离开自动播放5.移动到导航上停止播放,离开自动播放6.移动到导航上,切换相对应的导航 然后贴代码: <!doctype html><html lang="en"><head> <meta charset="UTF-8"> <title>Docume

js功能实现top轮播图

作用:向左滚动的轮播图 参数:主容器的id 调用方式:直接拷贝调用方法 function autoPlay(id){ var scroll=document.getElementById(id); var ul=scroll.children[0] var num=0 var timer=null; timer=setInterval(autoGoing,20); //滚动轴方法 function autoGoing(){ num--; num<=-1200 ? num=0:num; ul.st