h5 穿透滚动
引子
h5 页面有弹窗浮层时,浮层之下若产生了滚动,滑动浮层时会让其产生滚动。这是示例页面,移动端访问如下:

原因
找到的信息里面有两种说法:
- 使用了
-webkit-overflow-scrolling: touch,另外这个不是标准属性。 - 浮层也是页面的一个元素,浮层的展示正常,页面中的其它元素按照本来的方式展示运作。也就是说这是一个正常的现象,只不过是我们不想要这种效果。
针对第一种说法,进行测试验证,这是示例页面,移动端访问如下:

发现:跟 -webkit-overflow-scrolling: touch 无关。
处理方法
在网上找到的资料,主要有两种思路:
- 阻止 touch 相关的事件。
- 弹出浮层时,禁止元素滚动,浮层消失时,恢复滚动。
第一种思路在很多资料中提到有明显的缺陷:
- 弹出层的滚动会有问题。
- 会锁死滚动区域。
- 弹出层的事件处理可能会产生影响。
较多采用第二种思路,但也有对应的问题:
- 元素滚动的状态切换,会丢失滚动的位置。
针对滚动位置丢失问题,采用动态记录滚动位置的方式可以解决。
示例代码
// 以下方法使用的前提是产生滚动元素为 body
function fixedEle() {
var scrollEle = document.body;
// 有可能出现浮层内切换的情况,已经设置了就不用重复设置了。
if (scrollEle.style.position !== 'fixed') {
var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
scrollEle.style.cssText += 'position:fixed;top:-'+scrollTop+'px;';
}
}
function recoverEle() {
var scrollEle = document.body;
var top = scrollEle.style.top;
scrollEle.style.position = '';
scrollEle.style.top = '';
document.body.scrollTop = document.documentElement.scrollTop = -parseInt(top);
}
这是示例页面,移动端访问如下:

参考资料
- overflow-scrolling MDN
- iOS - css/js - Overlay scroll but prevent body scroll
- Prevent body scrolling on mobile device
- Prevent Page Scrolling When a Modal is Open
- 移动端滚动穿透问题
- github body-scroll-lock
- iOS 10 Safari: Prevent scrolling behind a fixed overlay and maintain scroll position
h5 穿透滚动的更多相关文章
- H5中滚动到底部的事件
问题:在H5中,我们有这样的需求:例如有列表的时候,滚动到底部时,需要加载更多. 解决方案:可以采用window的滚动事件进行处理 分析:如果滚动是针对整个屏幕而言的(不针对于某个界面小块),那么这个 ...
- 【H5】滚动事件(jq)
$(function(){ console.log($('html,body').scrollTop()); //记录滚动高度(滚动前) }) $('html,body').scroll(funct ...
- vue使用H5实现滚动到页面底部时加载数据
使用原生vue实现瀑布流,发现无法实现小程序那种滚动到地步触发加载效果,只能自己研究了 实现效果: 实现代码: 首先添加监听滚动事件 mounted() { window.addEventListen ...
- H5横向滚动提示
<marquee>啦啦啦,Hello World</marquee>
- H5中滚动卡顿的问题
加入-webkit-overflow-scrolling: touch;即可
- h5页面列表滚动加载数据
h5列表滚动加载数据很常见,以下分享下今天做的案例: 前言 这个效果实现需要知道三个参数 1. scrollTop -- 滚动条距离顶部的高度 2. scrollHeight -- 当前页面的总高度( ...
- section标签实现文字滚动
h5新增样式 section标签 使用demo //h5新增属性 h5新增滚动的标签 <marquee> <div style="padding-left: 20px;ma ...
- HTML 事件
1.HTML 全局事件属性 HTML4 的新特性之一就是可以使 HTML 事件触发浏览器中的行为,比方说当用户点击某个 HTML 元素时启动一段 JavaScript,在 HTML5 中还增加了一些新 ...
- Vue.js有赞商城(思路以及总结整理)
以下是本次项目的代码链接和预览链接: 代码链接:https://github.com/Leonardo-zyh/Vue-youzanStore 预览链接:https://leonardo- ...
随机推荐
- window下载并且安装kafka
安装zookeeper kafka运行需要有jdk+zookeeper环境才能够使用,jdk的安装和环境变量的配置就不介绍了,这里需要先安装zookeeper.可以从官网上下载 https://www ...
- eclipse 切换主题Theme
eclipse切换主题theme 1. 打开help -> eclipse marketplace,搜索theme 2. 点击右侧安装后一直继续,直到安装完成 3. 安装完成后会重启eclips ...
- 微信支付开发h5调用
这两天做微信支付开发.碰到大坑.纠结死我了.好不容做完. 后台java:直接上代码:注意区分前后端的变量大小写... @RequestMapping(value = "/index" ...
- ASP.NET CORE 基础知识(一):概述【上】
此为系列文章,对MSDN ASP.NET Core 的官方文档进行系统学习与翻译.其中或许会添加本人对 ASP.NET Core 的浅显理解 原文请参考MSDN ASP.NET Core. 这篇文章是 ...
- 洛谷 P2118 比例简化(枚举)
嗯... 题目链接:https://www.luogu.org/problem/P2118 这道题的出题人很善良,l的范围不是很大,所以我们可以逐一枚举. 本题主要思想就是把所有的比例都转换为乘积的形 ...
- MST — Kruskal's algorithm
算法简介 Kruskal算法可用来求解MST(最小生成树)问题,还可以作为迷宫生成算法等. 算法分析 其实算法不难理解,算法先要将 $ G(V, E) $ 的集合 $ E $ 按权重 $ \Omega ...
- acm数论之旅(转载)---最大公约数与最小公倍数
gcd(a, b),就是求a和b的最大公约数 lcm(a, b),就是求a和b的最小公倍数 然后有个公式 a*b = gcd * lcm ( gcd就是gcd(a, b), ( •̀∀•́ ) ...
- javascript的阻止默认事件和阻止冒泡事件
这两个方面的知识,在妙味课堂中有听过,再次复习一下: 原文来自:[http://www.cnblogs.com/Essence/p/4266618.html] 事件冒泡与默认行为 在说事件冒泡之前 ...
- Wireshark 查看指定进程的网络包
Wireshark 查看指定进程的网络包 打开任务管理器,右键筛选列,选中PID(进程标识符): 找到该进程对应的PID,如1200: 在cmd中执行netstat -ano|findstr 1200 ...
- Educational Codeforces Round 74 (Rated for Div. 2)E(状压DP,降低一个m复杂度做法含有集合思维)
#define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;char s[100005];int pos[ ...