借助等差数列的通项公式实现瀑布流式布局
瀑布流布局(Waterfall Layout),也被称为瀑布流式布局,是一种用于排列和展示多个项目的网页布局方式。这种布局以其独特的外观而广受欢迎。在瀑布流布局中,项目按列依次排列,每个项目的高度根据内容自适应调整。这样,每个项目可以呈现不同的大小和高度,更加有效地利用页面空间。

使用 Vue 和等差数列的通项公式实现瀑布流布局
本文将介绍一种使用 Vue 和 等差数列的通项公式 来实现瀑布流布局的方法。通过这种方法,我们可以使图片在页面上按列有序排列,尽可能填满空白区域。接下来,我将通过代码示例说明这种方法的实现步骤,你可以根据自己的需求进行修改和调整。
代码示例
准备图片数据
首先,我们准备一些图片数据,这里我使用了一个数组存储图片的 URL。你也可以使用其他数据来源,例如后台接口或本地文件。为了示范,假设我们有 16 张图片,你可以根据页面需求调整数量。
<script>
export default {
name: "Pinterest",
data() {
return {
imageUrls: [
'https://img3.wallspic.com/crops/6/7/9/4/7/174976/174976-yi_shu-dian_lan_se_de-shi_jue_yi_shu-ju_xing-4320x7680.jpg',
'https://img2.wallspic.com/crops/3/7/3/5/7/175373/175373-che_deng-lu_deng-ji_chu_she_shi-zi_se_de-li_qing-4330x5773.jpg',
'https://img1.wallspic.com/crops/2/8/9/4/7/174982/174982-azure-shui_shang-liao_jiu_dian-he_yin_ying_de_se_cai-dian_lan_se_de-2695x5500.png',
'https://img1.wallspic.com/crops/5/7/2/5/7/175275/175275-yi_shu-re-2500x4000.jpg',
'https://img2.wallspic.com/crops/5/3/9/4/7/174935/174935-huo_yan-shao_kao-ping_guo-ios_14-gou_huo-2160x3840.jpg',
'https://img1.wallspic.com/crops/1/4/8/3/7/173841/173841-tong_hua_gu_shi-xing_zhi-yi_shu-shui_zi_yuan-lu_se_de-1843x4096.jpg',
'https://img2.wallspic.com/crops/9/3/8/3/7/173839/173839-hua_duo-fen_hong_se-hua_hui_she_ji-xian_hua_zhi_wu-cheng_se-1843x4096.jpg',
'https://img1.wallspic.com/crops/6/7/7/0/7/170776/170776-azure-shui_shang-ju_xing-1797x3889.jpg',
'https://img1.wallspic.com/crops/0/5/2/8/6/168250/168250-dian_li-ta_kuai-1500x3000.jpg',
'https://img1.wallspic.com/crops/5/0/0/5/7/175005/175005-jian_zhu-cheng_se-dian_li-cheng_shi_she_ji-ta_kuai-1407x3045.jpg',
'https://img2.wallspic.com/crops/5/1/7/0/7/170715/170715-yi_shu-mu_yuan_quan-shi_jue_yi_shu-1440x2960.png',
'https://img3.wallspic.com/crops/1/4/2/5/7/175241/175241-shu_xue-mu_li_qing-cheng_se-cao-1394x3020.jpg',
'https://img3.wallspic.com/crops/4/7/4/2/7/172474/172474-guang-azure-1280x2560.jpg',
'https://img2.wallspic.com/crops/9/5/8/4/7/174859/174859-chong_lang-feng_bo-hai_yang-ye_ti-azure-1280x2560.jpg',
'https://img1.wallspic.com/crops/7/5/1/5/7/175157/175157-apple-iphone_15-guan_bi_le-ios-qi_min-1179x2556.png',
'https://img1.wallspic.com/crops/3/2/7/1/7/171723/171723-zi_ran_jing_guan-cao-he_yin_ying_de_se_cai-1080x2400.png',
],
};
},
};
</script>
样式定义
接下来,我们定义样式来设置图片的宽度和高度,以及页面布局。我使用 flex 布局将页面分为四列,每列的宽度为 100% / 4 - 10px,每列之间的间距为 10px。每张图片的宽度为 100%,每张图片之间的间距为 10px。你可以根据自己的需求调整这些样式。
<style lang="less" scoped>
.pinterest {
width: 100vw;
height: 100%;
.row {
box-sizing: border-box;
display: flex;
padding: 0 5px;
width: 100%;
height: 100%;
overflow: auto;
.col {
margin: 0 5px;
width: calc(100% / 4 - 10px);
height: 100%;
img {
width: 100%;
margin-bottom: 10px;
}
}
}
}
</style>
渲染图片
使用 Vue 的模板语法来渲染图片。我们使用两个 v-for 循环,第一个循环遍历每一列,第二个循环遍历每列中的每一张图片。通过等差数列的通项公式来计算每列的图片索引,使其可以正确排列。
<template>
<div class="pinterest">
<div class="row list">
<div class="col" v-for="firstItemValue in 4" :key="firstItemValue">
<template v-for="(url, index) in imageUrls">
<!--
n > 0 是正整数
index >= 0 是自然数
firstItemValue > 0 是正整数
1.a1 = 第一项 = firstItemValue - 1
2.n = 每一项 = index + 1
3.d = 公差 = 4
4.an = 第 n 项 = firstItemValue - 1 + (index + 1 - 1) * 4
-->
<!-- an = a1 + (n - 1) * d -->
<!-- 判断图片的索引是否超出了数组的长度 -->
<img
v-if="firstItemValue - 1 + index * 4 < imageUrls.length"
:src="imageUrls[firstItemValue - 1 + index * 4]"
:key="url + index"
/>
</template>
</div>
</div>
</div>
</template>
推导过程(借助等差数列的通项公式)
1. 假设页面排布方式
首先,我们假设页面采用 行优先,从左到右 的排布方式。这意味着,页面中的图片按列的顺序依次填充,直到一列满了之后再开始填充下一列,依此类推。每列的高度是根据图片的高度自适应调整。
2. 假设有 4 列
假设页面上有 4 列,每列的宽度固定,图片按列优先从上到下排列。
4 列示意图:
为了帮助理解,我们假设页面中的图片已经按行列顺序标好索引,示例如下:
图片索引分布:
- 第一列:
0, 4, 8, 12 - 第二列:
1, 5, 9, 13 - 第三列:
2, 6, 10, 14 - 第四列:
3, 7, 11, 15
3. 等差数列的应用
从上述索引分布中我们可以发现,每列的图片索引按 等差数列 的规律递增。具体来说,第 c 列的图片索引遵循如下规律:
- 第一列:
0, 4, 8, 12 - 第二列:
1, 5, 9, 13 - 第三列:
2, 6, 10, 14 - 第四列:
3, 7, 11, 15
这些索引遵循 等差数列的规律:每一列的索引递增的步长是固定的,并且每列之间的索引相差相同。这一规律与等差数列的通项公式非常相似,因此我们可以通过等差数列的思想来推导出图片索引的计算公式。
等差数列的通项公式为:
a_n = a_1 + (n - 1) * d
其中:
a_n是第n项的值,a_1是首项(即等差数列的第一个值),d是公差(即每两项之间的差值),n是项数(即位置)。
4. 推导公式
通过观察每列索引的递增规律,并借助等差数列的思想,我们可以得出图片索引的计算公式:
idx = c + r * C
其中:
r是行索引(从 0 开始),c是列序号(从 0 开始),C是总列数(在此例中为 4)。
这个公式与等差数列的通项公式非常相似,其中 r 作为行索引与等差数列中的 n 相对应,c 作为列索引与等差数列的首项相对应,C 作为总列数和等差数列的公差 d 相对应。
5. 示例计算
假设总列数 C = 4,我们来逐一计算一些具体的图片索引:
-
第一行第一列:
r = 0, c = 0idx = 0 + 0 * 4 = 0 -
第一行第二列:
r = 0, c = 1idx = 1 + 0 * 4 = 1 -
第二行第一列:
r = 1, c = 0idx = 0 + 1 * 4 = 4 -
第二行第二列:
r = 1, c = 1idx = 1 + 1 * 4 = 5 -
第三行第三列:
r = 2, c = 2idx = 2 + 2 * 4 = 10 -
第四行第四列:
r = 3, c = 3idx = 3 + 3 * 4 = 15
6. 总结
通过以上推导过程,我们得出了图片索引的计算公式:
idx = c + r * C
这种计算方法与等差数列的通项公式非常相似,能够帮助我们准确地计算每张图片的索引,并确保图片按顺序填充页面。
效果展示
运行上述代码后,你可以看到如下效果:


可以看到,每张图片都按等差数列的规律分配到了不同的列中,形成了类似瀑布的效果。每列的高度相对均匀,没有出现明显的空白区域。同时,利用 v-if 条件判断,确保了图片的索引不会超出数组范围,从而避免渲染错误的图片。
总结
本文介绍了如何通过 Vue 和 等差数列的通项公式 实现一个简洁的类瀑布流布局。这个方法可以让图片按列排列,尽量填满页面的空白区域。整个实现简单易懂,适合大多数场景。不过,它也有一些局限性,比如在页面或图片尺寸差异较大的时候,布局可能不够灵活,无法完美适应。
希望这篇文章能帮到你!如果你有任何问题或建议,欢迎留言和讨论。感谢你的阅读和支持!