博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在全屏滚动页面下实现鼠标滚轮的子级交互
阅读量:6910 次
发布时间:2019-06-27

本文共 2587 字,大约阅读时间需要 8 分钟。

需求分析

刚进公司产品提出一个需求:在全屏页面中滚动鼠标滚轮更新文本,回滚再恢复原文本,同时不影响全屏页面的正常切换:

  • 初始状态

state1

  • 向下滚动鼠标后出现新文本

state2

看似一个非常简单的需求,但因为这是一个使用了的全屏滚动页面,默认情况下滚动鼠标滚轮整个全屏页面也会随之滚动,因此解决起来还是费了一番功夫。


解决思路

引入jQuery 鼠标滚轮插件 mousewheel

因为Firefox在鼠标滚轮滚动事件上使用的API是DOMMouseScroll而非其他主流浏览器使用的onmousewheel,因此首先引入一个jQuery插件以添加跨浏览器鼠标滚动事件的支持。

原始思路

一开始想到的方法是:当页面滚动到某一个页面时,先屏蔽fullPage.js的默认滚动触发,即把setAllowScrolling设置为false;每次手指滚动鼠标滚轮,结合文本显示的具体状态和鼠标滚轮滚动的方向再更改setAllowScrolling的值恢复整个页面的滚动。例如,当页面滚动到如上图1所示的页面时,文本是默认文本,此时应实现向上滚动切换到上一页,向下滚动切换文字;当处于上图2所示的页面时,应实现向上滚动切回原文字,向下滚动切换到下一页。可以通过自定义变量isDefaultPara纪录每次滚动鼠标后,文本处于何种状态。这种思路逻辑上是行的通的,但是存在两个问题:一是没有一个API可以反映用户“滚动了一次滚轮”,通过mousewheel插件我们可以获取的数据仅仅只有滚动的方向及滚动角度大小;二是setAllowScrolling不能选择性地屏蔽某一方向的滚动而只能全面禁止页面滚动,因此无论如何都无法实现上述例子所要达到的效果。

改进思路

查阅fullPage.js的官方文档之后,发现该插件提供了一个moveTo(section, slide)的方法函数,通过这个方法可以手动将屏幕滚动到某个section或者slide。由此,我们可以完全屏蔽fullPage.js的默认滚动触发,改用moveTo方法控制全屏滚动,解除了全屏滚动与鼠标滚轮事件的强耦合。此外,通过定时器延时1秒设置isDefaultPara的值,将用户的鼠标滚轮操作强制分为两步,最终实现了目的。

具体代码

//在fullpage()方法中添加以下两个回调函数        afterRender: function(){            //页面载入后,禁止默认的鼠标滚轮滚动行为            $.fn.fullpage.setAllowScrolling(false);        },        afterLoad: function(anchorLink, index){            //此处只写出滚动到第3屏的代码,其他屏同理            if (index == 3) {                //判定默认文档显示状态并存入isDefaultPara变量                var isDefaultPara = $('.default-para').is(':visible');                $('.section').eq(2).mousewheel(function(event, delta, deltaX, deltaY){                    switch (true) {                        case delta<0 && isDefaultPara:                            $('.default-para').hide().removeClass('bounceInRight');                            $('.post-para').show().addClass('bounceInLeft');                            //当文本出现的动画显示完全(1s后)才能进行下一步操作                            setTimeout(function(){                                defaultPara = false;                            },1000);                            break;                        case delta>0 && isDefaultPara:                            $.fn.fullpage.moveTo(2);                            break;                        case delta<0 && !isDefaultPara:                            $.fn.fullpage.moveTo(4);                            break;                        case delta>0 && !isDefaultPara:                            $('.post-para').hide().removeClass('bounceInLeft');                            $('.default-para').show().addClass('bounceInRight');                            setTimeout(function(){                                firstPara = true;                            },1000);                        default:                            return false;          }

转载地址:http://qrfcl.baihongyu.com/

你可能感兴趣的文章
HTML+CSS-如何定义让两个div横向排列
查看>>
Matlab画柱状和折线对照图
查看>>
javascript时间戳和日期字符串相互转换
查看>>
链接详解--静态库
查看>>
从0开始学java——JUnit4 复习,其实基本思想还是那些,不过采用了新的注释格式的语法...
查看>>
GNU M4 - GNU Project - 免费软件基金会(FSF)
查看>>
jsp中将后台传递过来的json格式的list数据绑定到下拉菜单select
查看>>
Project Euler 85 :Counting rectangles 数长方形
查看>>
MYSQL查询某字段中以逗号分隔的字符串的方法
查看>>
Excel设置下拉菜单并隐藏下拉菜单来源单元格内容
查看>>
Java8初体验(二)Stream语法详解
查看>>
微服务架构——不是免费的午餐
查看>>
基于HTML5的Web SCADA工控移动应用
查看>>
VS 2015相当不错的功能:C#交互窗口
查看>>
hive复杂类型与java类型的对应
查看>>
[Ubuntu] ubuntu10.04系统维护之Wine的安装
查看>>
iOS获取UIView上某点的颜色值
查看>>
cocos2d-x 3.0 android mk文件 之 自己主动遍历*.cpp文件
查看>>
python数字图像处理(7):图像的形变与缩放
查看>>
设计模式-观察者模式(上)<转>
查看>>