借助等差数列的通项公式实现瀑布流式布局

1,018 阅读6分钟

借助等差数列的通项公式实现瀑布流式布局

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

微信图片_20230928163125.png

使用 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 列示意图:

为了帮助理解,我们假设页面中的图片已经按行列顺序标好索引,示例如下:

image.png

图片索引分布

  • 第一列: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 = 0

    idx = 0 + 0 * 4 = 0
    
  • 第一行第二列r = 0, c = 1

    idx = 1 + 0 * 4 = 1
    
  • 第二行第一列r = 1, c = 0

    idx = 0 + 1 * 4 = 4
    
  • 第二行第二列r = 1, c = 1

    idx = 1 + 1 * 4 = 5
    
  • 第三行第三列r = 2, c = 2

    idx = 2 + 2 * 4 = 10
    
  • 第四行第四列r = 3, c = 3

    idx = 3 + 3 * 4 = 15
    

6. 总结

通过以上推导过程,我们得出了图片索引的计算公式:

idx = c + r * C

这种计算方法与等差数列的通项公式非常相似,能够帮助我们准确地计算每张图片的索引,并确保图片按顺序填充页面。


效果展示

运行上述代码后,你可以看到如下效果:

Snipaste_2023-09-28-14-43-38.png

Snipaste_2023-09-28_15-22-37.png

可以看到,每张图片都按等差数列的规律分配到了不同的列中,形成了类似瀑布的效果。每列的高度相对均匀,没有出现明显的空白区域。同时,利用 v-if 条件判断,确保了图片的索引不会超出数组范围,从而避免渲染错误的图片。


总结

本文介绍了如何通过 Vue等差数列的通项公式 实现一个简洁的类瀑布流布局。这个方法可以让图片按列排列,尽量填满页面的空白区域。整个实现简单易懂,适合大多数场景。不过,它也有一些局限性,比如在页面或图片尺寸差异较大的时候,布局可能不够灵活,无法完美适应。


希望这篇文章能帮到你!如果你有任何问题或建议,欢迎留言和讨论。感谢你的阅读和支持!