说说如何解决移动端滑动穿透

230 阅读1分钟

背景:实现弹窗时,弹窗在滑动到顶部或底部时,body中的内容竟然也会跟着一起滑动

解决方法时,打开弹窗时,先记录下body的position,top以及滑动的距离scrollTop,然后将body的position设置为fixed,top设置为-scrollTop 关闭弹窗时body的position、top以及滑动距离scrollTop设置为之前保存的值

const disableScroll = function() {
    window._bodyPosition = document.body.style.position;
    window._bodyTop = document.body.style.top;
    window._bodyScrollTop = document.body.scrollTop || document.documentElement.scrollTop || 0;
    document.body.style.position = 'fixed'; // 让body不能滚动,但是他的scrollTop变成0,利用top设置为-scrollTop,等关闭弹窗之后再去恢复scrollTop
    document.body.style.top = `-${window._bodyScrollTop}px`;
}
const enableScroll = function() {
    document.body.style.position = window._bodyPosition;
    document.body.style.top = window.__bodyTop;
    document.body.scrollTop = window._bodyScrollTop;
    if (document.documentElement) {
        document.documentElement.scrollTop = window._bodyScrollTop;
    }
}

其中html有时通过document.documentElement来获取当前页面的滚动距离,而没有时是通过document.body