移动端滚动穿透解决方案:
移动端当有 fixed 遮罩背景和弹出层时,在屏幕上滑动能够滑动背景下面的内容。
现在总结一下三种解决方案:
1. css 之 overflow: hidden
当页面弹出 modal 之后,将 .HTML_MODAL_OPEN
添加到 html
上,并且禁止 html 和 body 的滚动。
1 | .HTML_MODAL_OPEN { |
缺点:
- 由于 html 和 body的滚动条都被禁用,弹出层后页面的滚动位置会丢失。
- 页面的背景还是能够有滚的动的效果
2. js 之 preventDefault
添加监听事件:
1 | modal.addEventListener('touchmove', function(e) { |
缺点:
- modal 层里不能有其它需要滚动的内容。滚动事件会被一起禁止掉。
3. js + css 值 position: fixed
参考很多做法,最后发现能完美解决这个问题只有 js 和 css 配合才可以。解决方案如下:
css 部分:
1 | body.BODY_MODAL_OPEN { |
js 部分:
所以如果需要保持滚动条的位置需要用 js 保存滚动条位置关闭的时候还原滚动位置。
1 | const scrollTop; // 记录上次的滚动位置 |
优化移动端滑动的 css 属性:
-webkit-overflow-scrolling: touch;