移动端下弹框禁止背景滑动

Posted homehtml

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了移动端下弹框禁止背景滑动相关的知识,希望对你有一定的参考价值。

移动端下弹框禁止背景滑动

茴字写法有很多种,找到最适合的才是好的。

以下下方法在一屛之内是可行的

body;html 设置overflow:hidden

.overflow-hidden{
    height: 100%;
    overflow: hidden;
}

// 弹出时
$(‘html, body,.page‘).addClass(‘overflow-hidden‘);

// 隐藏时
$(‘html, body,.page‘).removeClass(‘overflow-hidden‘);

问题

  • 当body内容超出一屛时,弹框背景页面会自动滚动到顶部,无法回到原来弹框所在的位置

保存scrollTop,再设置scrollTo

var top = $(window).scrollTop();
// 弹出时
$("body .page").css({
    "position": "fixed",
    "top": -top,
    "left": 0,    
    "right": 0,    
    "bottom": 0
}),

// 隐藏式
$("body .page").css({
    "position": "static"
});
$("html").css({
    "scroll-behavior": "unset"
});
$(window).scrollTop(top),
$("html").css({
    "scroll-behavior": "smooth"
});

问题

  • 当body内容超出一屛时,弹框背景页面会自动滚动到顶部,无法回到原来弹框所在的位置
  • 页面发生了 top 和页面滚动;页面会有闪烁的情况

绑定touchmove事件,然后调用preventDefault()

function preventDefaultFn(event){
    event.preventDefault();
}

// 弹出时 遮罩层
$(‘.modal-overlay‘).on(‘touchmove‘, preventDefaultFn);

// 隐藏时 遮罩层
$(‘.modal-overlay‘).off(‘touchmove‘, preventDefaultFn);

问题

  • 弹框中还有滚动的内容,滚动内容也无法滚动

解决

  • 给弹框内需滚动的元素添加标记,在判断是否执行event.preventDefault();

给main元素添加position:absolute(推荐)

.page {
     /* main绝对定位,进行内部滚动 */
    position: absolute;
    top: 0;
    bottom: 0;
    right:0;
    left:0;
    /* 使之可以滚动 */
    overflow-y: scroll;
    /* 增加该属性,可以增加弹性 */
    -webkit-overflow-scrolling: touch;
}
.overflow-hidden{
    overflow: hidden;
}

// 弹出时
$(‘.page‘).addClass(‘overflow-hidden‘);

// 隐藏时
$(‘.page‘).removeClass(‘overflow-hidden‘);

<div class="page">
    <!-- 内容在这里... -->
</div>

优点

  • 没有上述这些问题
  • 随带解决了ios fixed 的相关bug

缺点

  • 需要改页面结构
  • css代码微多

以上是关于移动端下弹框禁止背景滑动的主要内容,如果未能解决你的问题,请参考以下文章

移动端 弹框下边的内容 禁止滑动的解决方案

HTML移动端怎么禁止touchstart事件

移动端body跟着模态框一起滑动问题

“css中滑动背景如何让盒子不滑动”?

移动端禁止页面下滑

Android Button 背景色外圈黑框的问题