不能。grid-template-columns: 1fr仅定义单列,grid默认行优先布局,子项仍从左到右排列;实现垂直列表需用grid-auto-rows: auto配合每个子项设grid-column: 1。

grid-template-columns: 1fr 不能让子项垂直排列
很多人以为设了 grid-template-columns: 1fr 就能自动“竖着排”,结果发现所有子项还是挤在一行里,或者只显示第一个。这是因为 Grid 默认是行优先(grid-auto-flow: row),grid-template-columns: 1fr 只是把整行划成一列,但不控制行数——它不会自动为每个子项生成新行。
真正起作用的是行的生成机制:你得让 Grid “愿意”为每个子项新开一行,而不是硬塞进同一行。
- 错误写法:
grid-template-rows: 1fr→ 所有子项被压进**唯一一行**,视觉上重叠或溢出 - 正确方向:用
grid-auto-rows: auto(或minmax(40px, auto))让 Grid 动态创建行 - 再配合每个子项加
grid-column: 1,强制全部落在第一列,自然形成上下堆叠
纯 Grid 实现垂直列表的最小可行代码
不需要定义行数、不用 JavaScript、不依赖内容高度,只要三行 CSS:
ul {
display: grid;
grid-template-columns: 1fr;
grid-auto-rows: auto;
}
li {
grid-column: 1;
}
这段代码的关键点:
-
grid-template-columns: 1fr确保整行宽度由容器分配,不留多余列 -
grid-auto-rows: auto是核心——它告诉 Grid:“每来一个子项,就新开一行,高度按内容定” -
grid-column: 1把每个li显式钉在第 1 列,避免 Grid 自动按行优先填满多列
如果子项高度差异大,默认顶部对齐;加 align-items: start(或 center)可统一垂直对齐方式。
为什么不用 grid-auto-flow: column?
grid-auto-flow: column 看似“按列填”,但它会让子项从上到下填满第一列,填满后再跳到第二列——结果是**单列多行,但内容本身仍是横向排布**(比如文字还是左到右,图标还是横着排),不是你要的“每个子项独占一行”的垂直列表。
它适合做“纵向滚动的标签栏”或“瀑布流式侧边导航”,但不适合模拟 flex-direction: column 的语义行为。
- 适用场景:
grid-auto-flow: column+ 固定行高 + 多列布局(如仪表盘指标纵列) - 不适用场景:菜单、日志列表、垂直时间线等需“一项一行”的结构
- 兼容性注意:IE 完全不支持
grid-auto-flow,别指望降级 fallback
垂直列表中 align-items 没反应?先查这三件事
align-items: center 或 place-items: center 在垂直列表里失效,90% 是因为没给 Grid 容器提供垂直方向的对齐基准:
- 容器本身高度塌陷:没设
min-height、height,也没内容撑开,computed height 是 0px - 子项不是直接子元素:比如
ul里套了div再包li,place-items对li不生效 - 用了
grid-auto-rows: auto但没配align-content:当所有行加起来高度小于容器时,align-items控制单元格内对齐,align-content才控制整组行在容器内的位置
最简验证法:给容器加 min-height: 100vh 或 grid-template-rows: 1fr(后者会强制至少一行撑满),再试 align-items —— 如果立刻生效,说明问题就在高度基准上。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











