应使用 minmax(0, 1fr) 替代 1fr,避免小屏撑破;断点需重置 grid-template-columns 并同步调整 gap;子项用 grid-column: span n 控制跨列,禁用 width/margin/float。

直接写 grid-template-columns: repeat(12, 1fr) 是错的——小屏下内容撑破、断点失效、嵌套错位,根本跑不起来。
为什么 repeat(12, 1fr) 不能直接用
因为 1fr 是“剩余空间均分”,不是“固定占比”。当容器窄、内容宽(比如长英文单词或未约束尺寸的图片)时,Grid 会强行拉伸列宽,触发横向滚动;它也不自动处理 gap 占位、响应式切换或偏移逻辑。Bootstrap 的 col-4 要的是稳定 ≈33.33% 宽度,不是“尽量分但可能崩掉”。
-
minmax(0, 1fr)才是关键:允许列收缩到 0,避免撑破,同时保留等分语义 - 列轨道定义和子项跨度必须解耦——容器定轨道,子项用
grid-column: span N控制占几格 - IE11 不支持
minmax(),若需兼容,得用@supports降级为float或flex
怎么写容器的 grid-template-columns
别写死 1fr,也别用百分比硬算(如 8.333%),用 minmax()+repeat() 组合才是健壮写法:
.container {
display: grid;
grid-template-columns: 1fr;
gap: 16px;
}
@media (min-width: 768px) {
.container {
grid-template-columns: repeat(6, minmax(0, 1fr));
}
}
@media (min-width: 1024px) {
.container {
grid-template-columns: repeat(12, minmax(0, 1fr));
}
}
- 断点值要和业务一致(比如 Bootstrap 是
576px/768px,这里按常见设备取768px/1024px) - 每档断点都重置
grid-template-columns,不能只改子项grid-column——否则列轨道没变,span会跨错线 -
gap值也要随断点变(移动端16px,桌面32px),别用margin模拟留白
子项怎么对应 col-3、col-md-6 这种类名
不用生成一堆 .col-1 到 .col-12 类——直接用属性选择器或 BEM 命名绑定 grid-column:
.grid__col--3 { grid-column: span 3; }
.grid__col--6 { grid-column: span 6; }
@media (min-width: 768px) {
.grid__col-md--6 { grid-column: span 6; }
}
-
grid-column: span N是相对定位,从当前自动分配的起始线往后跨 N 条线;比grid-column: 2 / 6更直观、不易出错 - 子项不要设
width、margin或float——它们会干扰grid-column的起始位置计算 - 若需偏移(类似
offset-2),写grid-column-start: 3,而不是靠margin模拟
gap 和嵌套容器最容易被忽略的细节
gap 不继承,嵌套时必须显式声明;否则内层网格的 gap 会叠加外层的 gap,导致间距翻倍。另外,gap 不影响网格线编号,但会影响子项实际可占空间范围——尤其在 minmax(0, 1fr) 下,过大的 gap 可能让某些列收缩至视觉不可见。
- 嵌套网格必须独立声明
display: grid和自己的grid-template-columns - 不要依赖父容器的
gap传导,每个网格容器都要单独控制gap - 移动端慎用大
gap,小屏宽度有限,gap占比过高会导致列宽不足、文字换行异常
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











