首页 > 其他分享 >面向对象的轮播实现

面向对象的轮播实现

时间:2022-08-20 18:46:44浏览次数:57  
标签:index ol 轮播 实现 element 面向对象 length li banner

class Rotation {
    constructor(element) {
        this.banner = element.querySelector('.banner')
        this.length = this.banner.children.length
        this.element = element
        this.prevBtn = element.querySelector('.prev')
        this.nextBtn = element.querySelector('.next')
        this.focusList = this.init()
        this.index = 0
        this.autoMove()
        //调用对应的事件监听
        this.handlerChange()
        this.handlerFocusClick()
        this.handlerMouseBox()
    }
    init() {
        let ol = document.createElement('ol')
        //根据对应的个数生成
        for (var i = 0; i < this.length; i++) {
            if (i == 0) {
                ol.innerHTML += `<li class="selected"></li>`
            } else {
                ol.innerHTML += `<li></li>`
            }
        }
        //添加进去
        this.element.appendChild(ol)
        //给ul的后面再添加第一个li
        //克隆第一个
        var clone = this.banner.children[0].cloneNode(true)
        this.banner.appendChild(clone)
        //返回所有添加的li
        return ol.children
    }
    changePosition(isRight = true) {
        if (isRight) {
            this.index++
            if (this.index == this.banner.children.length) {
                //强行设置对应的为第一个
                this.banner.style.left = '0px'
                //控制对应的下标为0
                this.index = 0
            }
        } else {
            this.index--
            //如果到第一个应该切到最后一个
            if (this.index == -1) {
                //强行设置对应的最后一个
                this.banner.style.left = this.length * -1 * this.element.clientWidth + 'px'
                this.index = this.length - 1
            }
        }
        this.setFocus(this.index)
        // move('.banner').set('left', -1*liWidth * index + 'px').end()
        // move('.banner').to(-liWidth * index, 0).end()
        move(this.banner, {
            left: -1 * (this.element.clientWidth) * this.index
        }, true)
    }
    autoMove() {
        this.timer = setInterval(() => {
            this.changePosition()
        }, 2000);
    }
    setFocus(i) {
        //超出范围等于0
        if (i > this.length - 1) {
            i = 0
        }
        //小于0 等于最大下标
        if (i < 0) {
            i = this.length - 1
        }
        //排他
        //先把所有的全部清除 再给自己设置
        // 获取所有的ol里面的li
        Array.from(this.focusList).forEach((li) => {
            li.className = ''
        })
        this.focusList[i].className = 'selected'
    }
    //焦点点击事件
    handlerFocusClick() {
        //事件委托机制
        this.focusList[0].parentElement.onclick =  (e) => {
            e = e || window.event
            clearInterval(this.timer)
            if (e.target.nodeName == 'LI') {
                var i = Array.from(this.focusList).findIndex((li) => {
                    return li == e.target
                })
                //移动到对应的位置
                move(this.banner, {
                    left: -this.element.clientWidth * i
                }, true)
                //将i赋值给index
                this.index = i
                //切焦点
                this.setFocus(i)
                // this.autoMove() 导致多一个定时器无法清除
            }
        }
    }
    //移动动盒子上面
    handlerMouseBox() {
        this.banner.parentElement.onmouseenter = () => {
            //控制俩个div显示
            this.nextBtn.style.display = 'block'
            this.prevBtn.style.display = 'block'
            //清除动画
            clearInterval(this.timer)
        }
        this.banner.parentElement.onmouseleave = () => {
            //控制俩个div隐藏
            this.nextBtn.style.display = 'none'
            this.prevBtn.style.display = 'none'
            //开始动画
            this.autoMove()
        }
    }
    //左右切换处理
    handlerChange() {
        //左边的事件
        this.prevBtn.onclick = () => {
            this.changePosition(false)
        }
        //右边的事件
        this.nextBtn.onclick =  () => {
            this.changePosition()
        }
    }
}
//调用
var box = document.querySelector('.box')
new Rotation(box)

标签:index,ol,轮播,实现,element,面向对象,length,li,banner
From: https://www.cnblogs.com/gujmnlk/p/16608370.html

相关文章

  • 放大镜效果的简单实现
    classMagnifier{constructor(smallBox,bigBox){this.smallBox=smallBoxthis.bigBox=bigBoxthis.move=smallBox.querySelector(......
  • 6.tomcat实现多虚拟主机
    6.tomcat实现多虚拟主机 实验前准备[root@CentOS8~]#systemctlstarttomcat[root@CentOS8~]#systemctlstatustomcat[root@CentOS8~]#hostnamectlset-hostn......
  • jQuery实现简单弹窗遮罩效果
    https://www.jb51.net/article/106880.htm效果图:图(1)初始图图(2)点击按钮后代码如下:1234567891011121314151617181920212223242526......
  • 面向对象的回顾以及原型讲解
    面向对象回顾核心概念:万物皆对象(顶层对象Object)抽取行为作为方法抽取名词作为属性俩种构建对象的方式构造函数构建es6的形式classclassPerson{constructor(......
  • 基于NFS实现pod数据持久化
    一、nfs-server服务端:挂载一块新磁盘1.1、格式化并挂载parted/dev/vdbmklablexfsparted/dev/vdbprimay0%100%mkfs.xfs/dev/vdb1 echo"/dev/vdb1/nfs_sharex......
  • C#中通过Command模式实现Redo/Undo方案
    原文网址:https://www.jb51.net/article/252018.htm一个比较常见的改进用户体验的方案是用Redo/Undo来取代确认对话框,由于这个功能比较常用,本文简单的给了一个在C#中通过C......
  • 实现a标签中的各种点击(onclick)事件的方法
    https://www.cnblogs.com/pengfei25/p/6018237.html 我们常用的在a标签中有点击事件:1.ahref="javascript:js_method();"这是我们平台上常用的方法,但是这种方法在传......
  • 7-17 汉诺塔的非递归实现
    借助堆栈以非递归(循环)方式求解汉诺塔的问题(n,a,b,c),即将N个盘子从起始柱(标记为“a”)通过借助柱(标记为“b”)移动到目标柱(标记为“c”),并保证每个移动符合汉诺塔问题的要求......
  • MybatisPlus核心功能——实现CRUD增删改查操作 (包含条件构造器)
    CRUD官方文档:https://baomidou.com/(建议多看看官方文档,每种功能里面都有讲解)【本文章使用的mybatisplus版本为3.5.2】条件构造器一般都是用service层的方法,因为比ma......
  • AJAX概念和AJAX实现_原生JS方式
    AJAX概念:概念:ASynchronousJavaScriptAndXML异步的JavaScript和XMLAJAX是一种在无需重新加载整个网页的情况下能够更新部分网页的技术。通过在后台于服务器进行少量......