pc端弹出层滚动外层也滚动问题

当PC端网页的弹出层可滚动时,滚动到边界会导致底层body页面跟随滚动。通过禁用body的滚动条并处理样式可以解决此问题。滑轮滚动会触发mousewheel和scroll事件,键盘滚动只触发scroll事件。scroll事件无法阻止冒泡,而mousewheel事件可以阻止。测试代码显示了事件的执行顺序。

问题现象:
在网页上,写了一个弹出层,弹出层可以滚动,在弹出层滚动到最上方或最下方时,接着再往上(下)滚动,则底层的主体(body)页面跟着滚动。
这里写图片描述

解决:
本来是想通过滚动监听来控制,但后来发现各种阻止无效。
最后是用在弹出层出来时禁用掉body的滚动条[ $(‘body’).css(‘overflow-y’,’hidden’); ]的方式,但需要处理下body滚动条的样式。

关于滚动scroll整理如下:
滚动分为两种滑轮和键盘。
滑轮滚动又会触发mousewheel和scroll事件。
键盘滚动只触发scroll事件。

在实践中,发现 :
scroll 事件既不能 event.stopPropagation 也不能 event.preventDefault ;
mousewheel 事件不能 event.stopPropagation 可以 event.preventDefault ;
查了些资料,感觉最靠谱的是这个:
“为什么scroll不能阻止冒泡,这个我在MDN上找到了答案:上面说,scroll只冒泡到document.defaultView,而且不能cancel掉。”

如下,是测试代码:

    $('#user-list ul').on('mousewheel',function(e){
        alert('ul mousewheel');
    });
    $('#user-list ul').on('scroll',function(e){
        alert('ul scroll');
    });
    document.addEventListener('mousewheel', function(){
        alert('document mousewheel');
    });
    document.addEventListener('scroll', function(){
        alert('document scroll');
    });
    window.addEventListener('mousewheel', function(){
        alert('window mousewheel');
    });
    window.addEventListener('scroll', function(){
        alert('window scroll');
    });

    window.addEventListener('keydown', function(e){
        if(37 <= e.keyCode && e.keyCode <= 40 || e.keyCode == 32){
            alert('keydown ' + e.keyCode);
        }
    });

滑轮滚动后:
执行顺序:
ul mousewheel –> document mousewheel –> window mousewheel –> ul scroll –> document scroll –> window scroll

在展开弹出层时,如果用键盘(上下箭头)滚动:
执行顺序:
document scroll –> window scroll

受启发较多的帖子:
https://segmentfault.com/a/1190000003849952
https://segmentfault.com/a/1190000003849952

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值