uniapp 禁止滚动穿透(一般用于遮罩)-小程序/app/h5适用

Posted 前端小胡兔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uniapp 禁止滚动穿透(一般用于遮罩)-小程序/app/h5适用相关的知识,希望对你有一定的参考价值。

原理:

 

遮罩打开,内容部分滚动到底时,继续划动会导致底层页面的滚动,这就是滚动穿透。

但由于平台自身原因,除了h5平台外 ,其他平台都不能在在组件内禁止滚动穿透,所以在微信小程序、App 平台,页面内需要用户特殊处理一下

解决:

在 微信小程序/App 平台可使用 page-meta 组件动态修改页面样式 ,

需要在 data 中定义一个变量,用来表示 uni-popup (其他遮罩也可)的开启关闭状态,并通过这个变量修改 page-meta 的 overflow 属性。

代码:

<page-meta :page-style="'overflow:'+(show?'hidden':'visible')"></page-meta>

tips:

  • h5 滚动穿透不需要处理
  • wx、app 需要 使用 page-meta 组件配合阻止滚动穿透
  • 注意 page-meta 组件,一个页面只能存在一个
  • 其他平台无法阻止滚动穿透,建议使用 scroll-view 滚动 ,手动设置 overflow:hidden,同 page-meta 方法一致

补充:

uniapp

<page-meta :page-style="'overflow:'+(showOverlay?'hidden':'visible')"></page-meta>

如果编译为 h5 需要增加方法:

下面是开启遮罩后禁止滚动

openOverlay()
                this.showOverlay = true;
                let uniPlatform = uni.getSystemInfoSync().uniPlatform;
                // H5禁止滚动
                if (uniPlatform == 'web')
                    var mo = function(e)
                        e.preventDefault();
                    ;

                    document.body.style.overflow = 'hidden';
                    document.addEventListener("touchmove", mo, false); //禁止页面滑动
                

            ,
            //关闭遮罩
            closeOverLay: function()
                this.showOverlay = false;
                let uniPlatform = uni.getSystemInfoSync().uniPlatform;
                if (uniPlatform == 'web')
                    var mo = function(e)
                        e.preventDefault();
                    ;
                    document.body.style.overflow = ''; //出现滚动条
                    document.removeEventListener("touchmove", mo, false);
                
            ,

1.解决小程序遮罩层遮住页面后滚动穿透问题

小程序遮罩层遮住页面后滚动穿透问题分为两种情况:
1.蒙层mask没有滚动事件的情况
可以在mask这个view上直接添加事件catchtouchmove="ture"来防止滚动或者写一个方法也可以
代码如下:

    <view class="mask" wx:if="{{showModelcontact}}" catchtouchmove="prevent"></view>
    <!-- js --> 
    prevent:function(){}

2.如果蒙层mask有滚动事件的情况
这种情况需要在主体内容view上加一个固定定位的class,这个class和mask同时显示同时消失
代码如下:

  <view class="mask" wx:if="{{showModelcontact}}"></view>
  <!-- 遮罩下面的页面内容 -->
  <view class="content  {{showModelcontact?'prevent':'  '}}"></view>
<!-- js -->
Page{
  //通过事件显示遮罩
 showMask:function(){
    var that = this;
    that.setData({
      showModelcontact: true
    })
  },
  //隐藏遮罩层
  hiddenMask:function(){
    var that = this;
    this.setData({
      showModelcontact: false
    })
  }
}
<!-- css -->
/* 设置内容的css prevent 且这内容层级(z-index)要比蒙层的低 */
  .prevent{
    position:   fixed ; 
    top: 0px ; 
    left:   0px ; 
    width:   100% ; 
    height:   100% ; 
    overflow:   hidden ; 
    z-index:   0 ; 
  }

这个遮罩滚动穿透问题这样解决,但是在开发工具上面还是可以滚动,手机实际预览就不会出现这个问题了
希望能帮到大家,也便于自己记录!!!
如有疑问可以下方评论留言哦~会积极回复大家的!!!

以上是关于uniapp 禁止滚动穿透(一般用于遮罩)-小程序/app/h5适用的主要内容,如果未能解决你的问题,请参考以下文章

1.解决小程序遮罩层遮住页面后滚动穿透问题

uniapp 微信小程序和H5的弹窗滚动穿透解决

小程序遮罩层禁止页面滚动(遮罩层内部可以滚动)

uniapp 解决滑动穿透 (模态滚动影响页面滚动)

移动端遮罩层滚动时,禁止底部滑动

移动端遮罩层滚动时,禁止底部滑动