微信小程序?qū)崙?zhàn)基于vue2實(shí)現(xiàn)瀑布流的代碼實(shí)例
瀑布流,又稱瀑布流式布局。是比較流行的一種網(wǎng)站頁面布局,視覺表現(xiàn)為參差不齊的多欄布局,隨著頁面滾動(dòng)條向下滾動(dòng),這種布局還會(huì)不斷加載數(shù)據(jù)塊并附加至當(dāng)前尾部。
1、什么是瀑布流呢?
瀑布流,又稱瀑布流式布局。是比較流行的一種網(wǎng)站頁面布局,視覺表現(xiàn)為參差不齊的多欄布局,隨著頁面滾動(dòng)條向下滾動(dòng),這種布局還會(huì)不斷加載數(shù)據(jù)塊并附加至當(dāng)前尾部。
瀑布流對(duì)于圖片的展現(xiàn),是高效而具有吸引力的,用戶一眼掃過的快速閱讀模式可以在短時(shí)間內(nèi)獲得更多的信息量,而瀑布流里懶加載模式又避免了用戶鼠標(biāo)點(diǎn)擊的翻頁操作,瀑布流的主要特性便是錯(cuò)落有致,定寬而不定高的設(shè)計(jì)讓頁面區(qū)別于傳統(tǒng)的矩陣式圖片布局模式,巧妙的利用視覺層級(jí),視線的任意流動(dòng)又緩解了視覺疲勞,同時(shí)給人以不拘一格的感覺,切中年輕一族的個(gè)性化心理。
下面這些就是用瀑布流來實(shí)現(xiàn),看起來是不是很美觀呢?
2、實(shí)現(xiàn)一個(gè)簡(jiǎn)單的瀑布流
先看一下咱們最終的試下效果吧,只是簡(jiǎn)單傳入文字進(jìn)行演示
1、瀑布流的特點(diǎn)
1、琳瑯滿目:整版以圖片為主,大小不一的圖片按照一定的規(guī)律排列。
2、唯美:圖片的風(fēng)格以唯美的圖片為主。
3、操作簡(jiǎn)單:在瀏覽網(wǎng)站的時(shí)候只需要輕輕滑動(dòng)一下鼠標(biāo)滾輪,一切的美妙的圖片精彩便可呈現(xiàn)在你面前
2、核心算法
通過圖片我們可以直觀的看到,每一個(gè)卡片的高度都是不一樣的,需要我們實(shí)時(shí)能計(jì)算高度,同時(shí)左右的高度還是不能相互影響。
這里我們主要通過兩個(gè)數(shù)組進(jìn)行實(shí)現(xiàn),即分為左右數(shù)組,核心代碼如下:
<view id="u-left-column" class="u-column"> <slot name="left" :leftList="leftList"></slot> </view> <view id="u-right-column" class="u-column"> <slot name="right" :rightList="rightList"></slot> </view> data() { return { leftList: [], rightList: [], tempList: [], scrollTop: 0, } }
對(duì)傳入數(shù)組進(jìn)行分組和計(jì)算高度
async splitData() { if (!this.tempList.length) return; let leftRect = await this.$uGetRect('#u-left-column'); let rightRect = await this.$uGetRect('#u-right-column'); // 如果左邊小于或等于右邊,就添加到左邊,否則添加到右邊 let item = this.tempList[0]; // 解決多次快速上拉后,可能數(shù)據(jù)會(huì)亂的問題,因?yàn)榻?jīng)過上面的兩個(gè)await節(jié)點(diǎn)查詢阻塞一定時(shí)間,加上后面的定時(shí)器干擾 // 數(shù)組可能變成[],導(dǎo)致此item值可能為undefined if (!item) return; if (leftRect.height < rightRect.height) { this.leftList.push(item); } else if (leftRect.height > rightRect.height) { this.rightList.push(item); } else { // 這里是為了保證第一和第二張?zhí)砑訒r(shí),左右都能有內(nèi)容 // 因?yàn)樘砑拥谝粡?,?shí)際隊(duì)列的高度可能還是0,這時(shí)需要根據(jù)隊(duì)列元素長(zhǎng)度判斷下一個(gè)該放哪邊 if (this.leftList.length <= this.rightList.length) { this.leftList.push(item); } else { this.rightList.push(item); } } // 移除臨時(shí)列表的第一項(xiàng) this.tempList.splice(0, 1); // 如果臨時(shí)數(shù)組還有數(shù)據(jù),繼續(xù)循環(huán) if (this.tempList.length) { this.splitData(); return } }
3、完整的組件代碼如下
<template> <scroll-view class="scroll-y" scroll-y="true" @scrolltolower="tolower" :scroll-top="scrollTop"> <view class="u-waterfall" id="list"> <view id="u-left-column" class="u-column"> <slot name="left" :leftList="leftList"></slot> </view> <view id="u-right-column" class="u-column"> <slot name="right" :rightList="rightList"></slot> </view> </view> </scroll-view> </template> <script> export default { name: "waterfall", props: { value: { // 瀑布流數(shù)據(jù) type: Array, required: true, default: function() { return []; } }, scrolltolower: { type: Function, default: () => {} } }, data() { return { leftList: [], rightList: [], tempList: [], scrollTop: 0, } }, watch: { copyFlowList(nVal, oVal) { this.tempList = this.cloneData(this.copyFlowList); this.splitData(); } }, mounted() { this.tempList = this.cloneData(this.copyFlowList); this.splitData(); // this.$on('clearWaterFall', this.clear) }, computed: { // 破壞flowList變量的引用,否則watch的結(jié)果新舊值是一樣的 copyFlowList() { return this.cloneData(this.value); } }, methods: { async splitData() { if (!this.tempList.length) return; let leftRect = await this.$uGetRect('#u-left-column'); let rightRect = await this.$uGetRect('#u-right-column'); // 如果左邊小于或等于右邊,就添加到左邊,否則添加到右邊 let item = this.tempList[0]; // 解決多次快速上拉后,可能數(shù)據(jù)會(huì)亂的問題,因?yàn)榻?jīng)過上面的兩個(gè)await節(jié)點(diǎn)查詢阻塞一定時(shí)間,加上后面的定時(shí)器干擾 // 數(shù)組可能變成[],導(dǎo)致此item值可能為undefined if (!item) return; if (leftRect.height < rightRect.height) { this.leftList.push(item); } else if (leftRect.height > rightRect.height) { this.rightList.push(item); } else { // 這里是為了保證第一和第二張?zhí)砑訒r(shí),左右都能有內(nèi)容 // 因?yàn)樘砑拥谝粡?,?shí)際隊(duì)列的高度可能還是0,這時(shí)需要根據(jù)隊(duì)列元素長(zhǎng)度判斷下一個(gè)該放哪邊 if (this.leftList.length <= this.rightList.length) { this.leftList.push(item); } else { this.rightList.push(item); } } // 移除臨時(shí)列表的第一項(xiàng) this.tempList.splice(0, 1); // 如果臨時(shí)數(shù)組還有數(shù)據(jù),繼續(xù)循環(huán) if (this.tempList.length) { this.splitData(); return } }, // 復(fù)制而不是引用對(duì)象和數(shù)組 cloneData(data) { return JSON.parse(JSON.stringify(data)); }, tolower(e) { this.scrolltolower() }, clear() { this.leftList = [] this.rightList = [] } } } </script> <style lang="scss" scoped> @mixin vue-flex($direction: row) { /* #ifndef APP-NVUE */ display: flex; flex-direction: $direction; /* #endif */ } .scroll-y { height: 78vh; margin-top: 18px; } .u-waterfall { @include vue-flex; flex-direction: row; align-items: flex-start; } .u-column { @include vue-flex; flex: 1; flex-direction: column; height: auto; width: 45vw; word-break: break-all; } </style>
3、簡(jiǎn)單使用
基于vue的語法進(jìn)行使用,先進(jìn)行導(dǎo)入和注冊(cè)
<script> import waterfall from '../../component/waterfall/index.vue' export default { name: 'content', components: { waterfall } } </script>
因?yàn)榻M件是基于插槽的形式進(jìn)行開發(fā)的,所以我們可以直接傳入咱們的樣式和標(biāo)簽
<template> <view class="main"> <waterfall :value="dataList" :scrolltolower="getRecommendLove" ref="child"> <template v-slot:left="left"> <view v-for="item in left.leftList" :key="item.id" class="left-content" @click="copy(item)"> <view class="item"> {{item.content}} </view> </view> </template> <template v-slot:right="right"> <view v-for="item in right.rightList" :key="item.id" class="right-content" @click="copy(item)"> <view class="item"> {{item.content}} </view> </view> </template> </waterfall> </view> </template>
最終的效果就可以達(dá)到我們的目標(biāo)了
到此這篇關(guān)于微信小程序?qū)崙?zhàn),基于vue2實(shí)現(xiàn)瀑布流的文章就介紹到這了,更多相關(guān)vue2瀑布流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue antd的from表單中驗(yàn)證rules中type的坑記錄
這篇文章主要介紹了vue antd的from表單中驗(yàn)證rules中type的坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04vue中el-table實(shí)現(xiàn)可拖拽移動(dòng)列和動(dòng)態(tài)排序字段
最近公司需要做個(gè)項(xiàng)目,需要拖拽表格和自定義表格字段,本文主要介紹了vue中el-table實(shí)現(xiàn)可拖拽移動(dòng)列和動(dòng)態(tài)排序字段,具有一定吃參考價(jià)值,感興趣的可以了解一下2023-12-12Vue實(shí)現(xiàn)一個(gè)帶有緩存功能的Tab頁簽功能
在現(xiàn)代?Web?應(yīng)用中,Tab?頁簽功能是非常常見的一種交互模式,它可以幫助用戶在不同的視圖間快速切換,而不會(huì)丟失當(dāng)前視圖的狀態(tài),本文將介紹如何在?Vue?項(xiàng)目中實(shí)現(xiàn)一個(gè)帶有緩存功能的?Tab?頁簽功能,需要的朋友可以參考下2024-08-08關(guān)于vue2強(qiáng)制刷新,解決頁面不會(huì)重新渲染的問題
今天小編就為大家分享一篇關(guān)于vue2強(qiáng)制刷新,解決頁面不會(huì)重新渲染的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-10-10解決vue使用vant下拉框van-dropdown-item 綁定title值不變問題
這篇文章主要介紹了解決vue使用vant下拉框van-dropdown-item 綁定title值不變問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08vue改變循環(huán)遍歷后的數(shù)據(jù)實(shí)例
今天小編就為大家分享一篇vue改變循環(huán)遍歷后的數(shù)據(jù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11關(guān)于vue-router路由的傳參方式params query
這篇文章主要介紹了關(guān)于vue-router路由的傳參方式params query,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10