国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 微信小程序 小程序開發(fā) 聊聊怎么在小程序中實現(xiàn)一個可截斷的瀑布流組件

聊聊怎么在小程序中實現(xiàn)一個可截斷的瀑布流組件

Jan 24, 2022 am 10:32 AM
小程序 微信小程序

怎么在小程序中實現(xiàn)一個可截斷的瀑布流組件?下面本篇文章給大家介紹一下微信小程序?qū)崿F(xiàn)可截斷瀑布流組件的方法,希望對大家有所幫助!

聊聊怎么在小程序中實現(xiàn)一個可截斷的瀑布流組件

瀑布流是一種常見的布局方式,實現(xiàn)的方式有許多,比如直接分兩列,然后控制在左右兩列加入元素;還有一種方式就是通過絕對定位的方式來放置兩邊。【相關學習推薦:小程序開發(fā)教程

本文所要介紹的瀑布流不同于常規(guī)的,因為瀑布流中間可能會被截斷:

1.png

對于上面的布局,如果強制分成兩列去做布局就不太適合了,因此我采用了絕對定位的方式來進行布局,由于瀑布流中的元素高度都不是固定的,因此我得想辦法獲取到每個元素的高度,然后判定元素到底是放一整行,還是左側(cè),亦或者右側(cè)。

首先我們來看下模板部分的實現(xiàn):

<view class="container" style="height:{{height}}px;">
	<view wx:for="{{list}}" wx:key="index" style="{{item.style}}" class="wrapper">
		<abstract item="{{item}}"/>
	</view>
</view>
<view wx:if="{{tmp}}" class="computed-zone">
	<view class="wrapper">
		<abstract item="{{tmp}}"/>
	</view>
</view>

模板比較簡單,一個 container 容器,然后循環(huán)數(shù)組,平級渲染出一堆 wrapper 容器。

wrapper 容器是一個絕對定位的包裹元素,wrapper 容器里面需要放置需要實際渲染的組件,為了靈活性更高一點,我把這個渲染組件設置成了虛擬節(jié)點,在使用組件的時候可以指定實際渲染的自定義組件。

因為 wrapper 元素是絕對定位的,因此我們需要手動去維護整個 container 容器的高度。

這里有個問題是,我們怎么獲取里面元素的高度呢?模板中的 computed-zone 就是來解決這個問題的,在將元素放置到數(shù)組之前,我們先把元素在 computed-zone 中進行渲染,然后通過 WXML api 來獲取其中元素的實際渲染尺寸,這樣我們就可以知道這個元素實際渲染的寬高度了。

有了每個元素的渲染尺寸信息之后,我們需要確認元素到底是占滿整行,還是占半邊:

  • 如果元素的渲染寬度跟容器一樣,那么就可以判斷這個元素沾滿一整行,需要將包裹容器 wrapper 設置為一整行的寬度;

  • 如果不滿足1條件,那么就需要基于左右元素的總高度,將 wrapper 放在左側(cè)或者右側(cè)。

分析下來,需要稍微寫點兒邏輯的就是對 wrapper 計算偏移量,處理到底放左邊還是放右邊,亦或者占滿整行,核心的代碼實現(xiàn)如下:

{
	// 將 setData Promise 化,方便使用
	$setData(data) {
		return new Promise(resolve => {
			this.setData(data, () => {
				resolve();
			});
		});
	},
	// 獲取元素的渲染尺寸
	getRect(item) {
		return this.$setData({
			tmp: item,
		}).then(() => {
			return new Promise((resolve, reject) => {
				const query = this.createSelectorQuery(); // 注意要使用 this,不要再使用 wx 前綴了
				query.select(&#39;.computed-zone .wrapper&#39;).boundingClientRect();
				query.exec(ret => {
					if (ret[0]) {
						resolve(ret[0]);
					} else {
						reject(&#39;not found dom!&#39;);
					}
				});
			});
		});
	},
	// 添加元素,內(nèi)部使用
	addItem(item) {
		let tick = this.tick;
		return this.getRect(item).then(rect => {
			if (tick !== this.tick) {
				return Promise.reject(&#39;tick&#39;);
			}
			const { margin } = this.data;
			let { height, width } = rect;
			const windowWidth = this.sysInfo.windowWidth;
			let [ leftTotal, rightTotal ] = this.height; // leftTotal 左側(cè)欄高度,rightTotal 右側(cè)欄高度,
			let marginPx = this.sysInfo.getPx(margin);
			let style = &#39;&#39;;

			if (Math.abs(width - windowWidth) < 3) {
				// 占滿屏幕寬度
				style = `left:0;top:${ Math.max(leftTotal, rightTotal) }px;width:100%;`;
				leftTotal = rightTotal = Math.max(leftTotal + height, rightTotal + height);
			} else if (rightTotal < leftTotal) {
				// 放入右邊
				style = `right:${ marginPx }px;top:${ rightTotal }px;`;
				rightTotal += height;
			} else {
				// 放入左邊
				style = `left:${ marginPx }px;top:${ leftTotal }px;`;
				leftTotal += height;
			}

			const { list = [] } = this.data;
			const targetKey = `list[${list.length}]`; // 利用直接操作數(shù)組下標的方式來觸發(fā)數(shù)組修改,性能有很大提升
			this.height = [leftTotal, rightTotal]; // 記錄最新的左右側(cè)高度
			return this.$setData({
				[targetKey]: {
					data: item,
					style,
				},
				height: Math.max(leftTotal, rightTotal),
			});
		});
	},
	// 實際添加元素使用,自建Promise隊列,保證順序一致
	add(item) {
		let pending = this.pending || Promise.resolve();
		return this.pending = pending.then(() => {
			return this.addItem(item);
		}).catch(err => {
			console.error(err);
			this.pending = null;
			throw err;
		});
	},
	clear() {
		this.tick = tick++;
		this.height = [0, 0];
		this.pending = null;
		this.setData({
			list: [],
			height: 0,
		});
	},
}

在使用該組件的時候我們就不能直接通過賦值數(shù)組的方式來渲染元素了,而是得通過組件實例方法add(item) 的方式,因為我實現(xiàn)了隊列,因此可以直接循環(huán) add 就行。如果關心狀態(tài)就判斷最后一個元素的 add 操作是否完成即可。

通過這種方式來實現(xiàn)的瀑布流靈活性相對較高,但是性能消耗也是不低的,需要挨個獲取元素的實際渲染尺寸,如果要支持窗口的resize的話,那消耗是恐怖。

對于需要看代碼細節(jié)的同學,我將實際的demo放到了 Github微信代碼片段,有需要的同學可以試一試。

基于上面的模型,其實也可以優(yōu)化成只渲染可視區(qū)范圍內(nèi)的元素,可以大大提升瀑布流的性能,希望有時間的同學可以完善完善,我來fork點贊~o( ̄▽ ̄)d

更多編程相關知識,請訪問:編程視頻!!

以上是聊聊怎么在小程序中實現(xiàn)一個可截斷的瀑布流組件的詳細內(nèi)容。更多信息請關注PHP中文網(wǎng)其他相關文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權歸原作者所有,本站不承擔相應法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

閑魚微信小程序正式上線 閑魚微信小程序正式上線 Feb 10, 2024 pm 10:39 PM

閑魚官方微信小程序悄然上線,在小程序中可以發(fā)布閑置與買家/賣家私信交流、查看個人資料及訂單、搜索物品等,有用好奇閑魚微信小程序叫什么,現(xiàn)在快來看一下。閑魚微信小程序叫什么答案:閑魚,閑置交易二手買賣估價回收。1、在小程序中可以發(fā)布閑置、與買家/賣家私信交流、查看個人資料及訂單、搜索指定物品等功能;2、在小程序的頁面中有首頁、附近、發(fā)閑置、消息、我的5項功能;3、想要使用的話必要要開通微信支付才可以購買;

實現(xiàn)微信小程序中的卡片翻轉(zhuǎn)特效 實現(xiàn)微信小程序中的卡片翻轉(zhuǎn)特效 Nov 21, 2023 am 10:55 AM

實現(xiàn)微信小程序中的卡片翻轉(zhuǎn)特效在微信小程序中,實現(xiàn)卡片翻轉(zhuǎn)特效是一種常見的動畫效果,可以提升用戶體驗和界面交互的吸引力。下面將具體介紹如何在微信小程序中實現(xiàn)卡片翻轉(zhuǎn)的特效,并提供相關代碼示例。首先,需要在小程序的頁面布局文件中定義兩個卡片元素,一個用于顯示正面內(nèi)容,一個用于顯示背面內(nèi)容,具體示例代碼如下:&lt;!--index.wxml--&gt;&l

實現(xiàn)微信小程序中的圖片濾鏡效果 實現(xiàn)微信小程序中的圖片濾鏡效果 Nov 21, 2023 pm 06:22 PM

實現(xiàn)微信小程序中的圖片濾鏡效果隨著社交媒體應用的流行,人們越來越喜歡在照片中應用濾鏡效果,以增強照片的藝術效果和吸引力。在微信小程序中也可以實現(xiàn)圖片濾鏡效果,為用戶提供更多有趣和創(chuàng)造性的照片編輯功能。本文將介紹如何在微信小程序中實現(xiàn)圖片濾鏡效果,并提供具體的代碼示例。首先,我們需要在微信小程序中使用canvas組件來加載和編輯圖片。canvas組件可以在頁面

實現(xiàn)微信小程序中的下拉菜單效果 實現(xiàn)微信小程序中的下拉菜單效果 Nov 21, 2023 pm 03:03 PM

實現(xiàn)微信小程序中的下拉菜單效果,需要具體代碼示例隨著移動互聯(lián)網(wǎng)的普及,微信小程序成為了互聯(lián)網(wǎng)開發(fā)的重要一環(huán),越來越多的人開始關注和使用微信小程序。微信小程序的開發(fā)相比傳統(tǒng)的APP開發(fā)更加簡便快捷,但也需要掌握一定的開發(fā)技巧。在微信小程序的開發(fā)中,下拉菜單是一個常見的UI組件,實現(xiàn)了更好的用戶操作體驗。本文將詳細介紹如何在微信小程序中實現(xiàn)下拉菜單效果,并提供具

支付寶上線'漢字拾光-生僻字”小程序,用于征集、補充生僻字庫 支付寶上線'漢字拾光-生僻字”小程序,用于征集、補充生僻字庫 Oct 31, 2023 pm 09:25 PM

本站10月31日消息,今年5月27日,螞蟻集團宣布啟動“漢字拾光計劃”,最近又迎來新進展:支付寶上線“漢字拾光-生僻字”小程序,用于向社會征集生僻字,補充生僻字庫,同時提供不同的生僻字輸入體驗,以幫助完善支付寶內(nèi)的生僻字輸入方法。目前,用戶搜索“漢字拾光”、“生僻字”等關鍵詞就可以進入“生僻字”小程序。在小程序里,用戶可以提交尚未被系統(tǒng)識別錄入的生僻字圖片,支付寶工程師在確認后,將會對字庫進行補錄入。本站注意到,用戶還可以在小程序體驗最新的拆字輸入法,這一輸入法針對讀音不明確的生僻字設計。用戶拆

閑魚微信小程序叫什么 閑魚微信小程序叫什么 Feb 27, 2024 pm 01:11 PM

閑魚官方微信小程序已經(jīng)悄然上線,它為用戶提供了一個便捷的平臺,讓你可以輕松地發(fā)布和交易閑置物品。在小程序中,你可以與買家或賣家進行私信交流,查看個人資料和訂單,以及搜索你想要的物品。那么閑魚在微信小程序中究竟叫什么呢,這篇教程攻略將為您詳細介紹,想要了解的用戶們快來跟著本文繼續(xù)閱讀吧!閑魚微信小程序叫什么答案:閑魚,閑置交易二手買賣估價回收。1、在小程序中可以發(fā)布閑置、與買家/賣家私信交流、查看個人資料及訂單、搜索指定物品等功能;2、在小程序的頁面中有首頁、附近、發(fā)閑置、消息、我的5項功能;3、

微信小程序?qū)崿F(xiàn)圖片上傳功能 微信小程序?qū)崿F(xiàn)圖片上傳功能 Nov 21, 2023 am 09:08 AM

微信小程序?qū)崿F(xiàn)圖片上傳功能隨著移動互聯(lián)網(wǎng)的發(fā)展,微信小程序已經(jīng)成為了人們生活中不可或缺的一部分。微信小程序不僅提供了豐富的應用場景,還支持開發(fā)者自定義功能,其中包括圖片上傳功能。本文將介紹如何在微信小程序中實現(xiàn)圖片上傳功能,并提供具體的代碼示例。一、前期準備工作在開始編寫代碼之前,我們需要先下載并安裝微信開發(fā)者工具,并注冊成為微信開發(fā)者。同時,還需要了解微信

使用微信小程序?qū)崿F(xiàn)輪播圖切換效果 使用微信小程序?qū)崿F(xiàn)輪播圖切換效果 Nov 21, 2023 pm 05:59 PM

使用微信小程序?qū)崿F(xiàn)輪播圖切換效果微信小程序是一種輕量級的應用程序,具有簡單、高效的開發(fā)和使用特點。在微信小程序中,實現(xiàn)輪播圖切換效果是常見的需求。本文將介紹如何使用微信小程序?qū)崿F(xiàn)輪播圖切換效果,并給出具體的代碼示例。首先,在微信小程序的頁面文件中,添加一個輪播圖組件。例如,可以使用&lt;swiper&gt;標簽來實現(xiàn)輪播圖的切換效果。在該組件中,可以通過b

See all articles