class类

作者: 似朝朝我心 | 来源:发表于2020-09-13 23:31 被阅读0次
    新建一个脚本文件。

    在index.html里面引入。


    在menu.js脚本里编写代码。

    首先写个class关键字定义class类。



    constructor定义一个构造构造函数。



    参数id对应html里面的样式。

    init定义初始方法和调用



    在方法里面输出控制台语句,为后面实例的创建作检验。

    回到index.html里面new(创建)一个实例对象来使用我们在脚本里面定义的class类。

    逻辑对应关系

    控制台查看到输出,检验到初始化方法是可用的,证明class类定义的整个流程都能跑通了,能将class引进来且生效了。

    下面实现是功能实现


    我们想获取盒子(box)下面ul和li标签,和二级菜单下的class样式


    回到menu.js脚本,那怎么在class类中获取到DOM?



    我们要实现一个类似京东网站的鼠标滑动功能。

    可以看到这样一个二级菜单效果,首先有一个延迟效果(计时器的实现),鼠标移入移出事件,鼠标可以斜着锚点,不同于:hover的曲线救国方式。
    我们来看下曲线救国方式:css样式中:hover伪类,虽然可以实现,但还是有点不同。鼠标不能斜着移动,会跳到其他二级菜单取,体验并不好。

    两种方式对比路径。



    我的表达可能不太清晰哈,大家可以去京东网站,手动体验下。
    以上就是我们想要实现的一个效果。

    我们回到脚本编辑页面。接下来我们在init中设计逻辑功能,所谓的功能都是为了增强用户的交互体验。



    给所有li标签绑定一个监听事件



    去掉箭头函数的原型是这样的:

    语法分析:


    HTML DOM addEventListener() 方法,类似遍历的关系
    JavaScript forEach() 方法

    续上



    我们只想要target,我们输出console.log(event),在控制台找到它。



    然后打印

    看看e.target又是啥。



    接下来我们检验鼠标移出移入是否成功


    没有问题,已经生效了。
    接下来声明一个定时器

    延迟200ms后去控制.active

    我们来看下效果:


    效果:
    可以看到每次鼠标移出去,二级菜单都会关闭。鼠标一进来,打开二级菜单。

    我们迅速滑动鼠标,这行代码就是只触发鼠标最后一次停留的,中间掠过的不算。(防抖操作)

    我们看下原来的效果先。

    清除了计时器后(做了防抖操作后的效果)。
    只触发鼠标最后一次停留的,中间掠过的不算。

    这个代码避免了曲线救国的尴尬(可以斜着拉鼠标到二级菜单,而不是在:hover伪类下走7字的路径)(同样是防抖)

    class Menu {
        constructor(id) {
            this.box = document.querySelector(id)
            this.ul = this.box.querySelector('ul')
            this.lis = this.box.querySelectorAll('li')
            this.subMenuEles = this.box.querySelectorAll('.sub-menu')
            this.timer1 = null;
            this.timer2 = null;
    
            this.init()
        }
       
        init () {
            //console.log('menu');
            this.lis.forEach(item => {
                item.addEventListener("mouseenter", e=> {
                    let li = e.target
                    console.log("mouseenter")
                    
                    if (this.timer1 != null) {
                        clearTimeout(this.timer1)
                    }
                   
                    this.timer1 = setTimeout(() => {
                        this.subMenuEles.forEach((item) => {
                            item.classList.remove("active")
                        })
                        li.children[1].classList.add("active")
                    },200)
                })
            });
    
            this.lis.forEach(item => {
                item.addEventListener("mouseleave", e=> {
                    let li = e.target
                    console.log("mouseleave")
                    
                    if (this.timer2 != null) {
                        clearTimeout(this.timer2)
                    }
                    
                    this.timer2 = setTimeout(() => {
                        this.subMenuEles.forEach((item) => {
                            li.children[1].classList.remove("active")
                        })
                    },200)
                })
            });
    
    
        }
    }
    
    

    相关文章

      网友评论

          本文标题:class类

          本文链接:https://www.haomeiwen.com/subject/fsdoektx.html