我們知道瀑布流是等寬不等高的,下邊我們使用兩種方式實現(xiàn)瀑布流
css3的column布局 column-count: column-gap
- template
<template>
<div id="app">
<ul>
<li
ref='waterfallItem'
v-for="(item,index) in waterfallArr"
:key="index"
>
<img :src="item.img"> 第{{index+1}}張
<span>原價 {{item.price}}</span>
</li>
</ul>
</div>
</template>
- javacript
<script>
export default {
data() {
return {
waterfallArr: [
{
id: 1,
img: require("./assets/images/1.jpg"),
price: "50",
},
{
id: 2,
img: require("./assets/images/2.jpg"),
price: "50",
},
{
id: 3,
img: require("./assets/images/3.jpg"),
price: "50",
},
{
id: 4,
img: require("./assets/images/4.jpg"),
price: "50",
},
{
id: 5,
img: require("./assets/images/5.jpg"),
price: "50",
},
{
id: 6,
img: require("./assets/images/6.jpg"),
price: "50",
},
],
};
},
mounted() {},
methods: { },
};
</script>
- css
<style lang="scss" scoped>
#app {
width: 750px;
height: 100vh;
background-color: #0f0;
color: #333;
text-align: center;
font-size: 20px;
ul {
width: 750px;
height: 100%;
box-sizing: border-box;
background-color: #fff;
column-count: 2;
column-gap: 20px;
padding: 20px;
li {
height: auto;
font-size: 14px;
box-sizing: border-box;
margin: 0 0 10px 0;
overflow: hidden;
img {
width: 100%;
display: block;
height: auto;
}
span {
text-decoration: line-through;
line-height: 2;
margin-left: 10px;
}
}
}
}
</style>
效果圖如下,我們發(fā)現(xiàn)這個圖片第一張第二張都是豎著排列的,不是我們想要的結果

image.png
第二種使用grid布局
- template
<template>
<div id="app">
<ul>
<li
ref='waterfallItem'
v-for="(item,index) in waterfallArr"
:key="index"
>
<img :src="item.img"> 第{{index+1}}張
<span>原價 {{item.price}}</span>
</li>
</ul>
</div>
</template>
- javacript
<script>
export default {
data() {
return {
waterfallArr: [
{
id: 1,
img: require("./assets/images/1.jpg"),
price: "50",
},
{
id: 2,
img: require("./assets/images/2.jpg"),
price: "50",
},
{
id: 3,
img: require("./assets/images/3.jpg"),
price: "50",
},
{
id: 4,
img: require("./assets/images/4.jpg"),
price: "50",
},
{
id: 5,
img: require("./assets/images/5.jpg"),
price: "50",
},
{
id: 6,
img: require("./assets/images/6.jpg"),
price: "50",
},
],
};
},
mounted() {},
methods: { },
};
</script>
- css
<style lang="scss" scoped>
#app {
width: 750px;
height: 100vh;
background-color: #0f0;
color: #333;
text-align: center;
font-size: 20px;
ul {
width: 750px;
height: 100%;
box-sizing: border-box;
background-color: #fff;
display: grid;
grid-gap: 10px;
/* 可以看到,網(wǎng)格大小,占據(jù)位置是需要提前設定的 */
grid-template-columns: repeat(2, 1fr);
li {
height: auto;
font-size: 14px;
box-sizing: border-box;
margin: 0 0 10px 0;
overflow: hidden;
img {
width: 100%;
display: block;
height: auto;
}
span {
text-decoration: line-through;
line-height: 2;
margin-left: 10px;
}
}
}
}
</style>
效果圖如下,很顯然這種等寬和同行等高的不是我們想要的瀑布流,優(yōu)點類似于flex布局了

image.png
第三種使用js動態(tài)生成
- template
<template>
<div id="app">
<ul>
<li
ref='waterfallItem'
v-for="(item,index) in waterfallArr"
:key="index"
>
<img :src="item.img"> 第{{index+1}}張
<span>原價 {{item.price}}</span>
</li>
</ul>
</div>
</template>
- javacript
<script>
export default {
data() {
return {
waterfallArr: [
{
id: 1,
img: require("./assets/images/1.jpg"),
price: "50",
},
{
id: 2,
img: require("./assets/images/2.jpg"),
price: "50",
},
{
id: 3,
img: require("./assets/images/3.jpg"),
price: "50",
},
{
id: 4,
img: require("./assets/images/4.jpg"),
price: "50",
},
{
id: 5,
img: require("./assets/images/5.jpg"),
price: "50",
},
{
id: 6,
img: require("./assets/images/6.jpg"),
price: "50",
},
{
id: 7,
img: require("./assets/images/5.jpg"),
price: "50",
},
{
id: 8,
img: require("./assets/images/6.jpg"),
price: "50",
},
],
array: [] //定義空數(shù)組存儲元素高度
};
},
mounted() {
setTimeout(() => { // 防止圖片高度沒有加載出來
this.getWaterfall();
},100)
},
methods: {
getWaterfall() {
let columns = 2; //定義布局的列數(shù)為2
let item = this.$refs.waterfallItem; //獲取每個子元素的DOM
console.log("item",item)
for (let i = 0; i < item.length; i++) {
//遍歷整個子元素的DOM集合
if (i < columns) {
//小于columns的子元素作為第一行
item[i].style.top = 20 + 'px';
item[i].style.left = item[0].clientWidth * i + "px";
console.log("offsetWidth", item[0].clientHeight)
this.array.push(item[i].clientHeight); //遍歷結束時,數(shù)組this.array保存的是第一行子元素的元素高度
console.log("this.array",this.array)
} else {
//大于等于columns的子元素將作其他行
let minHeight = Math.min(...this.array); // 找到第一列的最小高度
let index = this.array.findIndex(item => item === minHeight) // 找到最小高度的索引
//設置當前子元素項的位置
item[i].style.top = this.array[index] +25+ "px";
item[i].style.left = item[index].offsetLeft + "px";
//重新定義數(shù)組最小項的高度 進行累加
this.array[index]+= item[i].clientHeight
console.log("this.array[index]",this.array[index])
}
}
},
},
};
</script>
- css
<style lang="scss" scoped>
#app {
width: 750px;
height: 100vh;
background-color: #0f0;
color: #333;
text-align: center;
font-size: 20px;
ul {
width: 750px;
height: 100%;
list-style: none;
box-sizing: border-box;
background-color: #fff;
overflow: hidden;
li {
width: 50%;
height: auto;
padding: 10px;
font-size: 14px;
position: absolute;
box-sizing: border-box;
margin: 0 0 10px 0;
overflow: hidden;
img {
width: 100%;
display: block;
height: auto;
}
span {
text-decoration: line-through;
line-height: 2;
margin-left: 10px;
}
}
}
}
</style>
效果圖如下,很明顯這個才是我們想要的結果

image.png
第四種 flex布局實現(xiàn)瀑布流
<template>
<view class="list">
<view class='list-half'>
<view class="item" v-for="(item,index) in listData" :key="index" v-if="index%2 !== 0">
<image class='card' :src="item.img" style="width: 346rpx;" mode="widthFix"></image>
</view>
</view>
<view class='list-half'>
<view class="item" v-for="(item,index) in listData" :key="index" v-if="index%2 == 0">
<image class='card' :src="item.img" style="width: 346rpx;" mode="widthFix"></image>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
components: {
},
data() {
return {
listData: [
{
id: 1,
img: "../../static/images/P_00.jpg"
},
{
id: 1,
img: "../../static/images/P_01.jpg"
},
{
id: 1,
img: "../../static/images/P_02.jpg"
},
{
id: 1,
img: "../../static/images/P_03.jpg"
},
{
id: 1,
img: "../../static/images/P_04.jpg"
},
{
id: 1,
img: "../../static/images/P_05.jpg"
},
{
id: 1,
img: "../../static/images/P_06.jpg"
},
{
id: 1,
img: "../../static/images/P_07.jpg"
},
{
id: 1,
img: "../../static/images/P_08.jpg"
},
{
id: 1,
img: "../../static/images/P_09.jpg"
},
{
id: 1,
img: "../../static/Pimages/_010.jpg"
},
]
}
},
methods: {
}
}
</script>
<style>
.list {
padding: 20rpx;
display: flex;
justify-content: space-between;
}
.list .list-half {
width: 346rpx;
height: 100%;
box-sizing: border-box;
}
image {
height: 100%;
}
.list-half .card {
border-radius: 20rpx;
overflow: hidden;
margin-bottom: 30rpx;
}
</style>