滑动穿透
情况列举
- body 无滚动,弹层无滚动
- body 无滚动,弹层有滚动
- body 有滚动,弹层无滚动
- body 有滚动,弹层有滚动
body 无滚动,弹层无滚动
弹层出现时,body 置为超出隐藏,固定布局,弹层关闭后恢复
打开弹层
layer.style.display = "block";
document.body.style.overflow = "hidden";
document.body.style.position = "fixed"; // 【弊端】因为加了fixed,就会自动回滚到顶部
关闭弹层
layer.style.display = "none";
document.body.style.overflow = "auto";
document.body.style.position = "static";
问题
用户在超出一屏高度的位置点开弹层,页面会因为 fixed 布局回到顶部
解决
可使用 swiper 控制页面一页一屏
body 无滚动,弹层有滚动
弹层出现时,body 置为超出隐藏,固定布局,样式中增加允许滑动,弹层关闭后恢复
打开弹层
layer.style.display = "block";
document.body.style.overflow = "hidden";
document.body.style.position = "fixed"; // 【弊端】因为加了fixed,就会自动回滚到顶部
overflow-y: scroll;
-webkit-overflow-scrolling: touch; /* 解决在IOS上滚动惯性失效的问题 */
关闭弹层
layer.style.display = "none";
document.body.style.overflow = "auto";
document.body.style.position = "static";
问题
滑动到页面顶部或底部时仍会发生穿透
解决
当滑动到边界时禁止滑动
body 有滚动,弹层无滚动
阻止弹层的 touchmove 事件默认行为
body 有滚动,弹层有滚动
检测 touchmove 事件,如果 touch 的目标是弹窗不可滚动区域(背景蒙层)就禁掉默认事件,反之就不做控制