uniapp 微信小程序uview2.0 u-popup弹出层弹出在遮罩层不影响卡片正常勾选的情况下实现点击空白区域关闭弹层

如图所示,在底部弹出层出现的时候希望点击卡片能够正常勾选。同时点击空白区域又可以关闭底部弹层,如果使用u-popup自带的遮罩层可以实现点击但是不可以实现勾选,实现勾选不能实现关闭。解决办法就是使用@touchend.stop来代替点击事件,并在子元素上使用@touchend.stop来阻止冒泡事件产生,附上代码大家可以参考。

 

	<view class="container" @touchend.stop="endShake()">
		<view class="card-box">
			<u-checkbox-group shape="circle" @change="checkboxChange()" activeColor="#3d80fc" iconSize="32" size='32'>
				<view :class="['card-item', 'shadow', shake ? `shake-${item.runStatus}` : `status-${item.runStatus}`]"
					@touchstart.prevent="gtouchstart(item)" @touchend.stop="gtouchEnd(item)" @touchmove.stop="gtouchmove()"
					v-for="item in cardInfo" :key="item.id">
					<view class="info-box" v-if="!shake">
						<PowerChart :value="item.voltage" />
						<SignalChart :value="item.rssi" />
					</view>
					<view class="info-box" style="z-index: 99;" v-else>
						<u-checkbox :name="item.id"></u-checkbox>
					</view>
					<image :src="'/static/images/'+ item.imgpath" mode=""></image>
					<view>{{item.name}}</view>
					<view v-if="item.runStatus == 10" class="mask"></view>
				</view>
				<view class="card-add shadow" @touchend.stop="toAdd()">
					<image src="/static/images/card-add.png" mode=""></image>
					<view>添加设备</view>
				</view>
			</u-checkbox-group>
		</view>
		
		<!-- <u-popup :show="shake" :round="10" mode="bottom" :overlayOpacity="0" @close="closeShake"> -->
		<u-popup :show="shake" :round="10" mode="bottom" :overlay="false " @close="closeShake">
			<view class="bom-box">
				<view class="item-bom" @click="removeDevice()">
					<u-icon name="trash" size="36"></u-icon>
					删除
				</view>
				<view class="item-bom" @click="famshow()">
					<u-icon name="list" size="36"></u-icon>
					分配
				</view>
			</view>
		</u-popup>
		
		<u-popup :show="show" :round="10" mode="bottom" @close="close">
			<scroll-view @scrolltolower="onScrolltolower" class="scroll-view" scroll-y>
				<view class="item-txt" @click="famClick(item)" v-for="(item,index) in famList" :key="index">{{item.name}}</view>
			</scroll-view>
		</u-popup>

		<image class="bgimg" src="../../static/images/home-bg.png" mode=""></image>
		<m-tabbar v-if="!shake" fixed fill current="0" :tabbar="DefaultTabbarConfig"></m-tabbar>

	</view>

### 如何在 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、付费专栏及课程。

余额充值