博客
关于我
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/

    你可能感兴趣的文章
    Objective-C实现binomial distribution二项分布算法(附完整源码)
    查看>>
    Objective-C实现bisection二分法算法(附完整源码)
    查看>>
    Objective-C实现bisection二等分算法(附完整源码)
    查看>>
    Objective-C实现BitMap算法(附完整源码)
    查看>>
    Objective-C实现bitmask位掩码算法(附完整源码)
    查看>>
    Objective-C实现bitonic sort双调排序算法(附完整源码)
    查看>>
    Objective-C实现BloomFilter布隆过滤器的算法(附完整源码)
    查看>>
    Objective-C实现BMP图像旋转180度(附完整源码)
    查看>>
    Objective-C实现bogo sort排序算法(附完整源码)
    查看>>
    Objective-C实现boruvka博鲁夫卡算法(附完整源码)
    查看>>
    Objective-C实现Boyer-Moore字符串搜索算法(附完整源码)
    查看>>
    Objective-C实现BP误差逆传播算法(附完整源码)
    查看>>
    Objective-C实现breadth First Search广度优先搜索算法(附完整源码))
    查看>>
    Objective-C实现BreadthFirstSearch广度优先搜索算法(附完整源码)
    查看>>
    Objective-C实现BreadthFirstShortestPath广度优先最短路径算法(附完整源码)
    查看>>
    Objective-C实现bubble sort冒泡排序算法(附完整源码)
    查看>>
    Objective-C实现bucket sort桶排序算法(附完整源码)
    查看>>
    Objective-C实现Burke 抖动算法(附完整源码)
    查看>>
    Objective-C实现Burrows-Wheeler 算法(附完整源码)
    查看>>
    Objective-C实现CaesarsCiphe凯撒密码算法(附完整源码)
    查看>>