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

本文共 1585 字,大约阅读时间需要 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/

    你可能感兴趣的文章
    nodejs npm常用命令
    查看>>
    nodejs 运行CMD命令
    查看>>
    nodejs-mime类型
    查看>>
    nodejs中Express 路由统一设置缓存的小技巧
    查看>>
    nodejs包管理工具对比:npm、Yarn、cnpm、npx
    查看>>
    NodeJs单元测试之 API性能测试
    查看>>
    nodejs图片转换字节保存
    查看>>
    NodeJs学习笔记001--npm换源
    查看>>
    Nodejs教程09:实现一个带接口请求的简单服务器
    查看>>
    nodejs端口被占用原因及解决方案
    查看>>
    Nodejs简介以及Windows上安装Nodejs
    查看>>
    nodejs系列之express
    查看>>
    nodejs系列之Koa2
    查看>>
    Nodejs连接mysql
    查看>>
    nodejs连接mysql
    查看>>
    NodeJs连接Oracle数据库
    查看>>
    nodejs配置express服务器,运行自动打开浏览器
    查看>>
    node不是内部命令时配置node环境变量
    查看>>
    node中fs模块之文件操作
    查看>>
    Node中的Http模块和Url模块的使用
    查看>>