uniapp遮罩层穿透问题,uview遮罩层组件,uview的actionSheet组件.鼠标穿透,uview组件u-popup遮罩滚动穿透问题

当使用uniapp或uview时,长按出现遮罩层并滑动仍会触发页面滚动。作者提出一种解决方案:通过监听遮罩层显示隐藏的flag,动态设置document.body.style.overflow,遮罩层显示时设为hidden阻止滚动,隐藏时恢复,有效解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题背景:

使用uniapp或者uview组件时,涉及到遮罩层的出现,一般会随之出现一个问题,就是当长按出现遮罩层时,此时不松手,往下滑动屏幕,还是会触发当前页面所涉及到的页面滚动甚至下拉刷新事件. 看了下各种博客人云亦云. 我找到一个很简单的方法

分析

首先,这个情况是什么时候会出现? 遮罩层出现的时候会出现,那么,我们就可以监听控制遮罩层或者包含遮罩层的那个组件的flag变量. 当遮罩层显示的时候,让当前页面的overflow变成hideen,在遮罩层隐藏的时候,设置当前页面的overflow为’'. 设置了overflow为hidden,页面滚动条都没了,我看你怎么滚动.

上代码

watch: {
		showupsheet(val){
				if(val){
				//遮罩层显示
					document.body.style.overflow = 'hidden';
				}else{
					document.body.style.overflow = '';
				}
			}
		},

效果
在这里插入图片描述
完美解决!

### 如何在 uView2 中实现嵌套弹出遮罩层 #### 解决方案概述 为了实现在 `u-view` 的 `u-popup` 组件内部再次弹出另一个遮罩层并形成嵌套效果,可以采取以下措施: 1. **调整层级关系** 需要确保外层和内层的弹窗组件具有不同的 `z-index` 值,以便它们能够正确显示而不互相干扰。根据已有信息[^1],可以通过设置 `zIndex` 属性来控制弹窗的层级。 2. **防止滑动穿透问题** 如果存在滑动穿透现象,则需通过事件修饰符阻止默认行为。具体做法是在外层和内层弹窗上分别绑定 `@touchmove.native.stop.prevent="stopTouchMove"` 方法[^2]。 3. **处理遮罩关闭逻辑冲突** 对于可能出现的点击遮罩层后弹窗“反复横跳”的情况,应仔细检查 `closeOnClickOverlay` 和其他相关属性配置是否合理,并确保回调函数执行无误[^4]。 以下是完整的解决方案代码示例: ```html <template> <view> <!-- 外层 popup --> <u-popup :show="outerPopupShow" mode="center" @close="handleOuterClose" @open="handleOuterOpen" zIndex="10080" closeOnClickOverlay=true @touchmove.native.stop.prevent="stopTouchMove"> <view class="outer-content">这是外层弹窗</view> <!-- 内层 action-sheet --> <u-action-sheet :show="innerActionSheetShow" title="请选择操作项" :list="actionList" @close="handleInnerClose" cancelText="取消"></u-action-sheet> </u-popup> </view> </template> <script> export default { data() { return { outerPopupShow: false, innerActionSheetShow: false, actionList: [ { text: '选项一' }, { text: '选项二' } ] }; }, methods: { handleOuterOpen() { console.log('外层弹窗已打开'); }, handleOuterClose() { this.outerPopupShow = false; console.log('外层弹窗已关闭'); }, openInnerActionSheet() { this.innerActionSheetShow = true; }, handleInnerClose(e) { this.innerActionSheetShow = e.show ? true : false; console.log('内层 Action Sheet 已关闭', e); }, stopTouchMove() { return false; } } }; </script> <style scoped> .outer-content { padding: 20px; background-color: white; } </style> ``` --- #### 关键点解析 1. **外层 Popup 设置** - 使用 `mode="center"` 定义居中展示模式。 - 添加 `zIndex="10080"` 来提升其相对于默认值 (如 10075)[^1] 的优先级。 2. **内层 Action-Sheet 调整** - 将 `u-action-sheet` 放置在外层 `u-popup` 内部作为子组件- 确保两者之间的交互不会相互影响。 3. **滑动穿透防护** - 在模板标签中加入 `@touchmove.native.stop.prevent="stopTouchMove"` 方法调用来抑制不必要的滚动动作。 4. **遮罩层点击异常修复** - 明确设定 `closeOnClickOverlay=true` 并验证实际运行表现是否符合预期。 --- #### 注意事项 - 若目标平台涉及 iOS 设备,请额外留意可能存在的兼容性隐患[^5]。 - 动态计算各组件间的相对位置以及透明度变化等因素也可能有助于优化视觉体验。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值