vue中使用mint-ui的mt-popup出现滚动穿透问题解决方法

一、如果popup内部不需要滑动:
防止滚动穿透 只需加入@touchmove.native.stop.prevent 阻止默认根元素的默认事件

<mt-popup
      v-model="popupSCVisible"
      position="bottom"
      model="true"
      closeOnClickModal="true"
      @touchmove.native.stop.prevent  //防止滚动穿透
      >

但是:
vue的 @touchmove.prevent 可以用来阻止滑动,但是同时会禁止蒙层内的子元素的滑动事件,如果蒙层内子元素没有中间滑动需求(如只有点击需求),就可以用 @touchmove.prevent 实现阻止蒙层滑动穿透问题。

二、如果popup内部有滑动需求:

最近做的项目中用到了mint-popup,项目需求需要在popup中添加一个可以下拉的列表。可是下拉弹窗列表的同时,会穿透导致body跟着下拉。为了解决这种问题尝试了很多办法比如:overflow: hidden, height:100% @touchmove.native.stop.prevent
watch监听v-modal、 e.preventDefault()等都没能解决,不过功夫不负有心人终于找到解决办法,以下为解决办法:

那么只需要在body或者父级div设置fixed属性即可。

body {
    position: fixed; 
    left: 0;
    top: 0;
  }

三、

通过监听popupVisible变量,在弹窗出现后禁止body节点touchMove事件,弹窗消失后恢复body节点的touchMove事件

<mt-popup
      v-model="popupTopVisible"
      position="top"
      model="true"
      closeOnClickModal="true"
      >
data(){
	popupTopVisible: false,
	handle: function(e){
            e.preventDefault()
        },
},
watch:{
	popupTopVisible(value) {
      if(value) {
        this.closeTouch ()
      }else{
        this.openTouch ()
      }
    },
}
methods: {
	closeTouch () {
          document.getElementsByTagName('body')[0].addEventListener('touchmove', this.handler, {passive:false})//阻止默认事件
      },
      openTouch () {
          document.getElementsByTagName('body')[0].removeEventListener('touchmove', this.handler, {passive:false})//打开默认事件
      },
 }

四、
Datetime Picker:

<mt-datetime-picker
    ref="picker"
    type="time"
    v-model="pickerValue"
    @touchmove.native.stop.prevent>
</mt-datetime-picker>

对于时间组件加了@touchmove.native.stop.prevent,选择时间滚动的时候底部页面就不会跟着滚动了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值