auto-fit 更适合响应式布局,因它会收缩空轨道并均分空间,而 auto-fill 保留空白列;单子项拉伸是 1fr 特性所致,需改用 fit-content 或媒体查询控制。
常见现象是容器宽度固定、子元素数量少时,网格项被拉宽甚至撑破容器。根本原因是 minmax() 的第一个参数(最小值)设得太大,或者容器本身没有设置 width 或 max-width,导致浏览器无法判断“可填充多少列”。auto-fill 会尽可能多地创建轨道(哪怕对应位置没内容),而 auto-fit 会把空轨道合并——但两者都依赖父容器有可计算的可用宽度。
width: 100% 或 max-width: 1200px

minmax(200px, 1fr) 中的 200px 是单列最小宽度,若容器宽仅 300px,最多只能放 1 列;设成 minmax(120px, 1fr) 才可能在 300px 宽度下填出 2 列width: 200px),它会和 minmax() 冲突二者只在“空轨道是否保留”上不同:当子元素数量不足以填满所有生成的列时,auto-fill 保留空白列(表现为右侧留白),auto-fit 会把空列收缩为 0 并让剩余列均分可用空间。实际响应式布局中几乎总是该用 auto-fit。
.grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)));
gap: 12px;
}
换成 auto-fit 后,4 个子项在 800px 宽容器里不会留三列空白,而是让 4 列均分宽度:
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)));
gap: 12px;
}
即使用了 auto-fit,单个子项仍会占满整行(因为 1fr 按比例分配)。这不是 bug,是 1fr 的本意。如果希望它保持“自身内容宽度”,就得换策略:
1fr 换成 max-content 或 fit-content(200px),但兼容性略差(fit-content() 在 Safari 旧版需前缀)display: inline-block 或 width: fit-content,再配合 justify-content: center 居中@media (max-width: 480px) { grid-template-columns: 1fr; },强制小屏单列不拉伸CSS Grid 是纯声明式的,DOM 变化本身不会触发重新计算列数——只要容器尺寸没变,repeat(auto-fit, ...) 就不会主动调整。问题通常出在 JS 插入元素后未触发重排或容器尺寸被意外冻结。
offsetHeight,或加个 setTimeout(() => {}, 0)
grid-auto-flow: column,它会让新增项按列堆叠,破坏行内自适应逻辑