对于一般大小的弹窗可以使用如下方案:
1. 阻止默认事件
缺点:该方案存在一定的兼容性,不是所有浏览器都有效。对于弹窗存在滚动的情况,也不适用。
优点:弹窗显示时,页面仍然固定在原来位置,不会回滚到顶部
//阻止弹窗滚动
function stopScroll() {
// 弹出时
$('body').on('touchmove', preventDefaultFn);
$('body').css({
'overflow': 'hidden'
})
}
function recoverScroll() {
// 隐藏时
$('body').off('touchmove', preventDefaultFn);
$('body').css({
'overflow': 'auto'
})
}
function preventDefaultFn(event) {
event.preventDefault();
}
2. Fixed定位
缺点:在弹框弹出和隐藏时,由于页面发生了 top 和页面滚动,所以页面会有闪烁的情况
优点: 可以解决弹窗本身存在滚动的情况
function stopScrollLong() {
var top = -$(window).scrollTop();
$('body').css({
'position': 'fixed'
})
setTimeout(function () {
$('body').css({
'top': top + 'px'
})
}, 10)
}
function recoverScrollLong() {
var top = parseInt(-$('body').css('top').replace('px', ''));
$('body').css({
position: 'static'
})
$(window).scrollTop(top);
}
移动端H5页面,可以结合这两种方法适用,可以解决大部分的弹窗底部滚动情况
参考:https://dancon.gitbooks.io/git-books/content/js/essay/dialog_forbid_back_scroll.html