当 flex 容器换行时,无法自然实现“一个子项收缩至内容高度、另一个占满剩余空间”的布局;css grid 通过 `grid-auto-rows: 1fr` 与响应式列定义可优雅解决该问题。
在响应式英雄区(hero section)设计中,常需实现「宽屏双栏并列、窄屏单列堆叠」的布局。若使用 display: flex 配合 flex-wrap: wrap,换行后所有子项默认按 align-content: stretch 拉伸至容器等高——这会导致内容较少的区块(如装饰性图片容器)被不必要地拉高,破坏视觉节奏与语义结构。
此时,CSS Grid 是更精准的解决方案。它天然支持“显式定义首行尺寸 + 隐式定义后续行尺寸”的能力,恰好匹配需求:
.hero {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(300px, 100%), 40%)));
grid-template-rows: auto; /* 第一行高度由内容决定 */
grid-auto-rows: 1fr; /* 换行后新增行占满剩余空间 */
height: 500px;
}
/* 装饰性样式(不影响布局逻辑) */
.hero {
background-color: hsla(0, 100%, 50%, 0.5);
padding: 10px;
border: 2px dotted red;
}
.item1 {
background-color: hsla(120, 100%, 50%, 0.5);
padding: 10px;
border: 2px dotted green;
}
.item2 {
background-color: hsl
a(240, 100%, 50%, 0.5);
padding: 10px;
border: 2px dotted blue;
}Item1. Should be short when wrapped Item2. Should take all available height when wrapped.
⚠️ 注意事项:
总结:面对 Flex 换行后高度难以差异化控制的场景,CSS Grid 的显式/隐式轨道分离机制提供了更直观、更可控的替代路径——用对特性,比绕过限制更高效。