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- ...
随机推荐
- 《macOS 使用手册》之远程控制
https://support.apple.com/zh-cn/guide/mac-help/mchlp1066/mac 选择版本: macOS Catalina 10.15 macOS Mojave ...
- flex一行显示两列(CSS)
外层display: flex;flex-wrap: wrap; 里层 width:49%
- 吴裕雄 python 机器学习——模型选择损失函数模型
from sklearn.metrics import zero_one_loss,log_loss def test_zero_one_loss(): y_true=[1,1,1,1,1,0,0,0 ...
- 【JavaWeb+Echarts+EL表达式】用图表形式展示数据
1. Echarts环境配置 https://www.echartsjs.com/zh/download.html 选择需要的,然后等待Build完成之后,就会自动弹出下载框啦! 把下载好的js放在w ...
- Python - 协议和鸭子类型
参考: Fluent_Python - P430 wiki 这里说的协议是什么?是让Python这种动态类型语言实现多态的方式. 在面向对象编程中,协议是非正式的接口,是一组方法,但只是一种文档,语言 ...
- pikachu-xx型注入
一 xx型注入,一脸懵x,管他什么型注入,先在输入框里随便输入个字符a试试 我们可以发现该传输方式为get型传输,传输的参数为name=a&submit=查询 二 测试使其闭合的符号 加一个单 ...
- PyQt5的菜单栏、工具栏和状态栏
1.创建菜单栏import sys, mathfrom PyQt5.QtWidgets import *from PyQt5.QtGui import *from PyQt5.QtCore impor ...
- 九、web.xml理解
1.web.xml文件在每个web工程不是必须要有的: web.xml文件是用来初始化配置信息:比如Welcome页面.servlet.servlet-mapping.filter.liste ...
- Python笔记4
JSON: JavaScript Object Notation, JavaScript 对象标记 JSON 本质:是一种轻量级的数据交换格式 1. 轻量级 是 和 XML作比较 2. 数据交换格式 ...
- [原]Greenplum failed segment的恢复方法
当在使用greenplum过程中有不当的操作时,可能会出现segment节点宕掉的情况(比如在greenplum运行的过程中停掉其中几台segment节点的服务器),通过下面的方法可以恢复segmen ...