博客
关于我
web移动端浮层滚动阻止window窗体滚动JS/CSS处理
阅读量:388 次
发布时间:2019-03-05

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

移动端滚动行为处理:CSS与JavaScript结合方案

随着移动端应用的普及,滚动行为的处理变得越来越重要。尤其是在浮层或弹出窗口中,如何阻止页面滚动而不影响内部滚动,成为开发者面临的一个常见挑战。本文将详细介绍一种结合CSS和JavaScript的解决方案。

一、初识问题

在PC端开发时,我们通过设置overflow:hidden和JavaScript的preventDefault()方法,轻松实现无滚动效果的处理。但在移动端,尤其是iOS设备的Safari浏览器中,情况却有所不同。直接使用上述方法可能会导致整体页面滚动被禁止,但这并非我们想要的效果。

二、双管齐下的解决方案

为了实现在浮层中保持内部滚动自由,同时阻止页面整体滚动,我们采用了双重策略:CSS和JavaScript结合。

1. CSS层面的处理

首先,在HTML标签上添加一个类名noscroll,并在CSS中进行如下设置:

.noscroll, .noscroll body {
overflow: hidden;
}
.noscroll body {
position: relative;
}

这样可以在大多数浏览器中禁止窗体滚动。

2. JavaScript的灵活处理

当浮层显示时,我们需要动态地禁用滚动行为。通过JavaScript可以更精准地控制滚动行为:

$('html').addClass('noscroll');

当浮层隐藏时,再次恢复滚动:

$('html').removeClass('noscroll');

然而,Safari等浏览器可能会对这种方式产生疑虑。因此,我们需要在浮层的touchmove事件中,进一步阻止默认滚动行为:

$('aside').on('touchmove', function(event) {
event.preventDefault();
});

这种方法兼容性强,且能有效避免整体滚动。但需要注意,如果浮层自身包含滚动区域,这种方法会导致内部滚动也无法触发。因此,我们需要更细致地判断触发滚动的元素。

三、精准滚动控制

为了避免对内部滚动造成影响,我们需要区分触发滚动的元素类型。具体来说:

  • 非滚动容器:如果手指在非滚动元素上触发滚动(如标题或按钮),则阻止默认行为。
  • 滚动容器:如果手指在滚动区域触发,则允许滚动,但需防止整体滚动。
  • 基于上述原理,我们开发了一个名为$.smartScroll()的方法,接受两个参数:containerselectorScrollablecontainer指定处理的浮层容器,selectorScrollable指定内部滚动区域。

    代码示例

    $.smartScroll(container, selectorScrollable);

    注意事项

    在实际应用中,避免将container设置为$(document)$(document.body),因为这可能导致浏览器抛出错误提示。具体错误如下:

    Unable to preventDefault inside passive event listener due to target being treated as passive.

    此外,确保selectorScrollable精准匹配内部滚动区域,以避免误阻止。

    四、实际应用中的经验总结

    通过实践,我们发现该方法在95%以上的场景中表现良好。然而,在某些Android设备上可能会出现细微滚动延迟。这种情况可以通过边缘判断优化,但我们认为这是可接受的妥协,毕竟不可能在所有设备上实现完美效果。

    五、总结

    移动端滚动行为的处理需要结合CSS和JavaScript,灵活应对不同浏览器的特性。通过精准的事件处理和条件判断,我们可以在保证用户体验的同时,实现高效的滚动控制。

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

    你可能感兴趣的文章
    Netty工作笔记0050---Netty核心模块1
    查看>>
    Netty工作笔记0057---Netty群聊系统服务端
    查看>>
    Netty工作笔记0060---Tcp长连接和短连接_Http长连接和短连接_UDP长连接和短连接
    查看>>
    Netty工作笔记0063---WebSocket长连接开发2
    查看>>
    Netty工作笔记0070---Protobuf使用案例Codec使用
    查看>>
    Netty工作笔记0077---handler链调用机制实例4
    查看>>
    Netty工作笔记0084---通过自定义协议解决粘包拆包问题2
    查看>>
    Netty工作笔记0085---TCP粘包拆包内容梳理
    查看>>
    Netty常用组件一
    查看>>
    Netty常见组件二
    查看>>
    netty底层源码探究:启动流程;EventLoop中的selector、线程、任务队列;监听处理accept、read事件流程;
    查看>>
    Netty心跳检测机制
    查看>>
    Netty核心模块组件
    查看>>
    Netty框架内的宝藏:ByteBuf
    查看>>
    Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
    查看>>
    Netty源码—2.Reactor线程模型一
    查看>>
    Netty源码—3.Reactor线程模型三
    查看>>
    Netty源码—4.客户端接入流程一
    查看>>
    Netty源码—4.客户端接入流程二
    查看>>
    Netty源码—5.Pipeline和Handler一
    查看>>