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>

至此,彈窗問題已經解決了大部分,能夠基本滿足頁面需求,多個手機做了測試,暫無發現明顯問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM