你以为瀑布流只能靠 JS 库?今天 CSS Grid Lanes 把这件事彻底原生化了

写过前端的人都见过这种布局——Pinterest 的图片墙、Unsplash 的瀑布流、画廊网站的不规则网格。每张卡片高度不同,但排列起来严丝合缝,底下没有空白。

CSS Grid 做不到。传统 grid 布局严格对齐行,每行高度固定,短卡片下面必然留白。CSS columns 能填空白,但 items 从上往下排完一列再排下一列,顺序变成了纵向扫描,不是我想要的从左到右阅读顺序。

所以这个场景一直是 JS 库的天下。Masonry.js、isotope、Packery……装一个依赖,改一堆配置,完了。

CSS Grid Layout Module Level 3 定义的 grid-lanes,终于把这件事原生化了。

语法就两行:

.gallery {
  display: grid-lanes;
  grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  gap: 16px;
}

行为变了:浏览器不再把 items 塞进固定行高,而是每个 item 都去找当前最”空”的 column 填进去,像 Pinterest 一样。高度不同的卡片自动左右咬合,底部没有空白。

flow-tolerance: 另一个新属性,控制 item 可以偏离原始顺序多远来保持 lane 均衡。默认值是 1em,调大则排列更紧凑但阅读顺序打乱,调小则接近原始顺序但留白增多。

跨列 item: 照用 grid-column: span 2,不受影响。

浏览器支持现状: Safari 26.4 / iOS Safari 26.4 是第一个稳定版。Chrome 和 Firefox 还需要开实验 flag。规范目前还是 Working Draft,标准未最终冻结。

渐进增强写法:

.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  gap: 16px;
}
@supports (display: grid-lanes) {
  .gallery {
    display: grid-lanes;
  }
}

不支持的浏览器渲染标准 grid(行对齐,有空白),支持的浏览器升级为 masonry。

一个已知坑: 视觉顺序和 DOM 顺序可能不一致,tab 键焦点顺序不等于视觉排列顺序,accessibility 测试要过一下。

下一步:如果你现在正好有个图片墙或者产品卡片要排,去 Can I Use 查一下 Safari 支持率,然后动手加 @supports。不用等所有浏览器都支持才用——瀑布流场景的 fallback(标准 grid 留白)本来就能用,不会更差。

评论区

0 条评论

登录后可评论。

阿柯·前端架构 12 阅读