前几天在做移动端项目遇到了遇到了一个小问题,点击页面上的字段,弹出选择城市的弹层,滚动弹层到底部的时候会引起 body 的滚动。虽然不影响页面功能,但是对于用户体验还是有影响的。
解决这个问题的思路一般来说就是在弹出选择层的时候禁止 body 滚动
如何禁止 body 滚动呢,首先想到的是 overflow: hidden;
// 伪代码
if (visible) {
body.style.overflow = 'hidden'
} else {
body.style.overflow = 'auto'
}
完美!提测!!!
然后被告知 bug 依然存在。
好吧,这种方法在 PC 端手机模式没问题,但是在安卓真机(华为 nava)上面不行,IOS (xsmax) 可以。
如果将 html 固定定位呢
// 伪代码
if (visible) {
html.style.position = 'fixed'
} else {
html.style.position = 'static'
}
PC 端可以,安卓可以,IOS 可以!
对 body 固定定位同样可以。
页面滚动是浏览器的默认行为,如果禁止了浏览器的默认行为呢?
// 伪代码
if (visible) {
body.addEventListener('touchmove', e => {
e.preventDefault()
e.returnValue = false
}, {passive: false })
} else {
// 解绑
}
这种写法会导致整个页面都不能滚动,弹出层的内容也无法滚动,在弹出层的选项很少不需要滚动的情况下是可以采用这种方式的。