我是靠谱客的博主 明理菠萝,最近开发中收集的这篇文章主要介绍JS鼠标滚轮事件mousewheel实现翻页(记录)整体思路(趁还能看懂自己的代码),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

JS鼠标滚轮事件mousewheel实现翻页(PPT?)

  • 整体思路(趁还能看懂自己的代码)
    • 1、我想模拟那些不用滚动条,像PPT一样滚动的页面,于是乎想到了mousewheel事件
    • 2、我又想再页面右边加上像轮播图一样的圆点点
    • 3、我还想让切换模式为淡入淡出(还想有位移动画,呼之欲出了)
    • 4、动画函数搞定了我寻思着咋的也该写事件函数了8
    • 5、然后呢,让小圆点点也主动一次8
    • 6、最后勉勉强强达到的效果
    • 7、之后要把section里面塞点东西,再加个位移动画配合透明度动画。。。

别看,看了脑仁疼,别怪我没说
标题都起不明白,还学什么JS
逼自己用原生JS,咱也不知道为啥
好消息是实现了,坏消息是为什么我想不到更好的方法
久仰mousewheel兼容乱套的大名,但是我秉着????不平何以平天下的原则,先把chrome弄明白,别的浏览器先稍稍

整体思路(趁还能看懂自己的代码)

1、我想模拟那些不用滚动条,像PPT一样滚动的页面,于是乎想到了mousewheel事件

我想要在哪滚动都行,所以把事件给了window,事件函数待会再说

window.addEventListener('mousewheel', mouseWheelEvent)

2、我又想再页面右边加上像轮播图一样的圆点点

所以我根据section的数量(我想把section用来包裹小页面),总之镶上了圆点点们,捎带脚给它们装了index属性,方便以后跟section的索引值挂钩

//i为控制页面索引号的变量,顺便同步小圆点点
var i  = 0
for (let j = 0; j < section.length; j++) {
        var li = document.createElement('li')
        li.setAttribute('index', j)
        ul.appendChild(li)
    }
    //获取li
    var li = ul.querySelectorAll('li')
    //给相应的li添加类名
    li[i].className = 'current'

3、我还想让切换模式为淡入淡出(还想有位移动画,呼之欲出了)

也不知道该怎么整,于是就有了这个别管怎么写的反正我实现了函数,只不过终点永远是 -0.21.2,是浮点数精度的问题吗?

function fadeOut(obj, callback) {
    clearInterval(obj.timer)
    var opa = 1
    clearInterval(obj.timer)
    obj.timer = setInterval(function(){
        if (opa <= 0) {
            clearInterval(obj.timer)
            callback && callback()
        }
        opa -= 0.1
        obj.style.opacity = opa
    }, 25)
}

其实还有个fadeIn()函数,就是把 1 换成 0 , - 换成 +

4、动画函数搞定了我寻思着咋的也该写事件函数了8

这一写不要紧
当时我寻思:

  • 可以用事件对象的wheelDelta判断是往下滚还是往上滚
  • 我用的是 i 作为section的索引值,所以 i 打死得在 [0, section.length - 1]里
  • 所以要给 i 加限制,滚到第一个或最后一个跳出函数,i 不能再增减了
  • 我想要当前section先缓出fadeOut,然后下一个再缓入,所以缓入动画得在缓出动画的回调函数里(不然就一跨堆执行了)
  • 滚的时候小圆点点也得跟着滚呐,“把他们,也算上!”
  • 还有最重要的,得等我缓出缓入一个来回都滚完了,你才能让我滚下一个,动画期间是要禁止函数被再次执行的,不然就鬼畜了,那就来个节流阀8,调用函数后立马关闭,缓入动画执行完再开启
  • 我寻思也差不多了
var canWheel = true
function mouseWheelEvent(e) {
        if (canWheel) {
        	//节流阀
            canWheel = false
            var flag = e.wheelDelta < 0 ? 1 : 0
            //如果往下滚
            if (flag) {
                //如果还能往下滚
                if (i < section.length - 1) {
                    fadeOut(section[i], function(){
                        for (let j = 0; j < section.length; j++) {
                            section[j].style.display = 'none'
                            section[j].style.opacity = 0
                        } 
                        //先显示,再全透明,再缓入
                        section[++i].style.display = 'block'
                        fadeIn(section[i], function() {
                            //这里是整个函数时间上最末尾
                            canWheel = true
                        })
                        //滚动时,小圆圈同步
                        for (let j = 0; j < li.length; j++) {
                            li[j].className = ''
                            li[i].className = 'current'
                        }
                    })
                } else {
                    //如果不能往下滚,给个true,防止再也进不来
                    canWheel = true
                    return false
                }
            //如果往上滚
            } else {       
                if (i > 0) {
                    fadeOut(section[i], function(){
                        for (let j = 0; j < section.length; j++) {
                            section[j].style.display = 'none'
                            section[j].style.opacity = 0
                        } 
                        section[--i].style.display = 'block'
                        fadeIn(section[i], function() {
                            canWheel = true
                        })
                        for (let j = 0; j < li.length; j++) {
                            li[j].className = ''
                            li[i].className = 'current'
                        }
                    })
                }
                else {
                    canWheel = true
                    return false
                }
            }
        }
    }

5、然后呢,让小圆点点也主动一次8

于是我就接着寻思嗷

  • 圆点点像控制section容易,就是得让点击圆点点和鼠标滚轮互相认识认识,俩人得唠一套嗑
  • index是长在 li 身体里的,i 是间接跟section走的,那就让 i 听 index 的8
//小圆圈section绑定
for (let j = 0; j < li.length; j++) {
    li[j].addEventListener('click', function(){
        //获取index
        var index = this.getAttribute('index')
        //排它
        for (let j = 0; j < li.length; j++) {
            li[j].className = ''
            this.className = 'current'
        }
        //准备同步section
        fadeOut(section[i], function(){
            i = index
            //同步section
            for (let j = 0; j < section.length; j++) {
                section[j].style.display = 'none'
                section[j].style.opacity = 0
            }
            section[i].style.display = 'block'
            fadeIn(section[i])
        })  
    })
}

6、最后勉勉强强达到的效果

在这里插入图片描述

7、之后要把section里面塞点东西,再加个位移动画配合透明度动画。。。

最后发现一个问题:我用PPT不好吗?

最后

以上就是明理菠萝为你收集整理的JS鼠标滚轮事件mousewheel实现翻页(记录)整体思路(趁还能看懂自己的代码)的全部内容,希望文章能够帮你解决JS鼠标滚轮事件mousewheel实现翻页(记录)整体思路(趁还能看懂自己的代码)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部