grid实现高度不定瀑布流布局

442 阅读1分钟

grid两列布局瀑布流思想:

  • 将容器分为若干个网格,每行网格占2px(可以根据喜好自定义)
  • 模拟每一块的高度,计算出每个块所占网格行数
  • 利用span(跨行)关键字,重新设置块的起始位置
  • 实现瀑布流布局
<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Demo</title>
  <style>
    body {
      margin: 0;
    }
    .masonry {
      display: grid;
      grid-template-columns: repeat(2, 1fr);
      gap: 0 20px; /*网格的列间距*/
      grid-auto-rows: 2px; /*网格行高*/
      align-items: end; /*排列方式*/
    }
    .item {
      background: #f8f8fa;
      display: flex;
      justify-content: center;
      align-items: center;
    }
  </style>
</head>
<body>
  <div class="masonry">
    <div class="item">item1</div>
    <div class="item">item2</div>
    <div class="item">item3</div>
    <div class="item">item4</div>
    <div class="item">item5</div>
    <div class="item">item6</div>
    <div class="item">item7</div>
    <div class="item">item8</div>
    <div class="item">item9</div>
    <div class="item">item10</div>
    <div class="item">item11</div>
    <div class="item">item12</div>
    <div class="item">item13</div>
    <div class="item">item14</div>
    <div class="item">item15</div>
    <div class="item">item16</div>
    <div class="item">item17</div>
    <div class="item">item18</div>
    <div class="item">item19</div>
    <div class="item">item20</div>
    <div class="item">item21</div>
    <div class="item">item22</div>
    <div class="item">item23</div>
    <div class="item">item24</div>
    <div class="item">item25</div>
  </div>

  <script>
    window.addEventListener('load', () => {
      // 模拟随机高度  
      document.querySelectorAll('.masonry > .item').forEach(item => {
        item.style.height = `${Math.floor(Math.random() * 1000) + 100}px`
      })
      calcRows()
    })
    // 计算每个块的所占行数
    const calcRows = () => {
      const masonry = document.querySelector('.masonry')
      const items = masonry.querySelectorAll('.item')
      items.forEach((item, index) => {
          // 给需要上下间隔的元素增加上间隔(每列第一个元素无需上间隔)
          const gapRows = index >= 2 ? 8 : 0;
          // 根据元素高度设置元素的需占行数
          const rows = Math.ceil(item.clientHeight / 2) + gapRows;
          // 当前的item跨越的行数,方便下一个块的排列
          item.style.gridRowEnd = `span ${rows}`;
      })
    }
  </script>
</body>
</html>

本篇是通过学习记录的笔记

参考:【必看】Grid 实现不定高度的响应式真瀑布流 - 掘金 (juejin.cn)

Grid布局实现不定高度的真瀑布流,只需几行代码 - 知乎 (zhihu.com)