移动端遮罩打开,禁止滑动穿透问题解决

禁止滑动穿透

一般开始我们都会想到,当弹窗触发时,给body元素,添加css属性

// css 部分
modal_open {
    position: fixed;
    height: 100%;
}

// js 部分
document.body.classList.add('modal_open');
document.body.classList.remove('modal_open');

虽然说上面这个方法轻松的解决了滚动穿透问题,却也遗留着其他问题。

当内容超过100%,可以发生滚动,滚动的位置会丢失,关闭弹窗时无法回到滚动的位置,会被重置到顶部。

知道问题,我们可以得出解决方案,记录滚动的位置,并设置top到scroll的位置,关闭弹窗,让内容回到我们滚动到的位置,保持不动。来看看下面的解决方案:

// css 部分
.modal_open {
  position: fixed; 
}

只设置 fixed 就足够了,添加了 height: 100%;会导致,滚动超过100%的内容只会显示百分比, 其他内容会被 overflow

var ModalHelper = (function(bodyClass) {
    var scrollTop;
    return {
        afterOpen: function() {
            scrollTop = document.scrollingElement.scrollTop  ||
                        document.documentElement.scrollTop || 
                        document.body.scrollTop;
            document.body.classList.add(bodyClass);
            document.body.style.top = -scrollTop + 'px';
        },
        beforeClose: function() {
            document.body.classList.remove(bodyClass);
            document.scrollingElement.scrollTop = document.documentElement.scrollTop = document.body.scrollTop = scrollTop;
        }
    };
})('modal_open');

const openBtn = document.getElementById("open-btn"); // 打开
const closeBtn = document.getElementById("close-btn"); // 关闭
openBtn.addEventListener("click", e => { 
       ModalHelper.afterOpen()
});
closeBtn.addEventListener("click", e => { 
       ModalHelper.beforeClose()
});
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值