uniapp弹窗踩坑

问题描述

问题一

点击立即购买会弹出购买商品弹窗,滑动弹窗到底部之后,后面背景的滚动条

解决方式

如果弹窗展示则在最外层添加tl-show

// 最外层元素
<view
	class="member-save-up"
	:class="buyModal ? 'tl-show' : ''"
	id="memberSaveUp"
>
</view>

// 弹窗
<view class="modal-bg" v-if="buyModal" v-show="!productDescModal">

// 设置后面禁止滚动的样式
.tl-show {
	position: fixed;
	    left: 0;
	    width: 100%;
}

问题二

最外层使用fixed之后,默认会将浏览器滚动到顶部

解决方式

使用fixed布局之后,可以获取当前位置距离网页顶部距离,然后通过设置top值进行一个定位就能达到保留当前位置的功能

// 获取当前滚动的距离
onPageScroll(e) {
	if (e.scrollTop) {
		this.pageScrollTop = e.scrollTop;
	}
},
// 设置外层
<view
	class="member-save-up"
	:class="buyModal ? 'tl-show' : ''"
	id="memberSaveUp"
	:style="{
		top: `-${pageScrollTop * 2}rpx`
	}"
>
</view>

问题三

关闭弹窗之后,清除了fixed布局,页面还是会滚动到最顶部

解决方式

因为之前记录了网页顶部距离,可以在弹窗关闭之后,重新设置网页顶部距到刚才的位置就能到到效果,但是需要设置延时(不清楚具体的原理,怀疑是uniapp设置this的机制问题),会造成页面有一瞬间的闪现(从顶部到当前位置)

this.buyModal=false;
setTimeout(()=>{
    uni.pageScrollTo({
    	duration: 0,
    	scrollTop: this.pageScrollTop // number number number!
    });
});

问题四

页面一瞬间的闪现

解决方式

通过直接操作dom的方式清除tl-show,而不是通过uniapp的数据判断,新增删除tl-show

// 获取dom元素
const query = uni.createSelectorQuery().in(this);
query.select('#memberSaveUp').boundingClientRect(data => {
	console.log(data)
}).exec();
this.memberSaveUpDom = query._component.$el;

// 监听弹窗关闭
watch: {
	buyModal(newVal, oldVal) {
		if (!newVal) {
		    // 清除tl-show
			this.memberSaveUpDom.setAttribute("class", 'member-save-up')
			uni.pageScrollTo({
				duration: 0,
				scrollTop: this.pageScrollTop // number number number!
			});
			// window.scrollTo(0, this.pageScrollTop);
		}
	},
},

问题五

部分手机已经实现了弹窗之后,后面元素不能滚动,并且关闭弹窗,还是保留之前的位置,但是部分手机触摸弹窗还是会发生后面的背景滚动到最顶部的问题

解决方式

控制弹窗阻止向上冒泡,就不会造成部分手机还能滚动到顶部的问题

<view class="modal-bg" v-if="buyModal" v-show="!productDescModal" @touchmove.stop.prevent="disabledScroll">
</view>

disabledScroll() {
	return
},

问题六

当前弹窗的所有滚动事件都被自己禁止了,发现里面有部分动态加载数据需要滚动的地方也不能滚动了

解决方式

只禁用不需要滚动位置的元素

<view class="h3" @touchmove.stop.prevent="disabledScroll">
</view>
<view class="price-title" v-if="buyType === 'buy'" @touchmove.stop.prevent="disabledScroll">
	<view class="small-font">¥</view>
	<view class="big-font">{{ buyDetail.price }}</view>
</view>

至此,弹窗问题已经解决了大部分,能够基本满足页面需求,多个手机做了测试,暂无发现明显问题

posted @ 2021-10-16 11:59  福小松  阅读(711)  评论(0编辑  收藏  举报