此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。

View in English Always switch to English

瀑布流布局

实验性: 这是一项实验性技术
在将其用于生产之前,请仔细检查浏览器兼容性表格

CSS 网格布局的第 3 版规范包含了 masonry 值,用于 grid-template-columnsgrid-template-rows。本指南详细介绍了瀑布流布局是什么,以及如何使用它。

瀑布流布局是一种布局方式,其中一个轴使用标准的的严格网格布局(通常是列),另一个轴则采用瀑布流布局。在瀑布流轴上,后续行的元素会向上对齐,完全填补较短元素留下的空隙,而非严格按网格排列导致空隙残留。

创建瀑布流布局

要创建最常用的瀑布流布局,需要将列设置为网格轴,将行设置为瀑布流轴,通过 grid-template-columnsgrid-template-rows 属性进行定义。此时容器的子元素会像常规网格布局的自动排列那样,逐行依次布局。

当元素换行时,会遵循瀑布流算法进行排列。元素将被加载到剩余空间最多的列中,最终形成一个紧密排列的布局,而不会存在固定的行轨道。

css
.grid {
  display: grid;
  gap: 10px;
  grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
  grid-template-rows: masonry;
}
html
<div class="grid">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>
js
// prettier-ignore
const itemSizes = [
  "2em", "3em", "1.6em", "4em", "3.2em",
  "3em", "4.5em", "1em", "3.5em", "2.8em",
];
const items = document.querySelectorAll(".item");
for (let i = 0; i < items.length; i++) {
  items[i].style.blockSize = itemSizes[i];
}

也可以创建按行加载元素的瀑布流布局。

js
// prettier-ignore
const itemSizes = [
  "2em", "3em", "1.6em", "4em", "2.2em",
  "3em", "4.5em", "1em", "3.5em", "2.8em",
];
const items = document.querySelectorAll(".item");
for (let i = 0; i < items.length; i++) {
  items[i].style.inlineSize = itemSizes[i];
}
css
.grid {
  display: grid;
  gap: 10px;
  grid-template-columns: masonry;
  grid-template-rows: repeat(3, 100px);
}

控制网格轴

在网格轴上,它的工作方式和你预期的网格布局完全一致。你可以使用 span 关键字让元素在自动排列的状态下跨越多条轨道,也可以基于行线的位置来定位元素。

跨轨道的瀑布流布局

本示例中,有两个元素跨两条轨道,其余瀑布流元素会围绕这两个元素进行排列。

html
<div class="grid">
  <div class="item"></div>
  <div class="item span-2"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item span-2"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>
css
.grid {
  display: grid;
  gap: 10px;
  grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
  grid-template-rows: masonry;
}

.span-2 {
  grid-column-end: span 2;
}

本示例包含一个通过列定位的元素。具有明确位置的元素会在瀑布流布局生效之前完成放置。

html
<div class="grid">
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item positioned">已定位。</div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
  <div class="item"></div>
</div>
css
.grid {
  display: grid;
  gap: 10px;
  grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
  grid-template-rows: masonry;
}

.positioned {
  padding: 1em;
  grid-column: 2 / 4;
}

瀑布流布局的回退

不支持瀑布流的浏览器中,将使用常规的网格自动布局进行替代。

规范

Specification
CSS Grid Layout Module Level 3
# masonry-layout

浏览器兼容性

css.properties.grid-template-columns.masonry

css.properties.grid-template-rows.masonry

参见