repeat(auto-fit, minmax(250px, 1fr))是响应式九宫格核心,它使列数随容器宽度自动增减(小屏单列、中屏两列、大屏三列以上),而非固定3×3;auto-fit折叠空轨道避免留白,auto-fill则保留空轨道导致小屏空白或滚动,minmax()中250px为最小宽度(需<length>单位),1fr为弹性份额,二者共同确保格子视觉一致且内容驱动。
repeat(auto-fit, minmax()) 是实现响应式九宫格的真正核心,但它不是“让九宫格在所有屏幕都显示 3×3”,而是让列数随容器宽度自动变化——小屏单列、中屏两列、大屏三列甚至四列,同时保持格子视觉一致。硬写 repeat(3, 1fr) 或 33.33% 33.33% 33.34% 只是固定三列,根本不算响应式。
auto-fit 会折叠空轨道,auto-fill 会保留所有可能轨道(哪怕没内容),导致小屏下右侧大片空白或横向滚动。
auto-fit 避免留白auto-fill 或 auto-fit 失效了auto-fill 适合仪表盘预留插槽,但九宫格是内容驱动型布局,不是结构占位型minmax(280px, 1fr) 不是“最小 280px 或最大 1fr”,而是:该列宽度必须 ≥ 280px,且 ≤ 它按 1fr 应得的那份剩余空间。
<length>(如 px、rem),禁用 em —— 字体缩放会干扰列数计算1fr 或 max-content;写成 2fr、auto 或 minmax(280px, 2fr) 会被浏览器静默忽略gap 总和;低于这个值,列数就会自动减少minmax(250px, 1fr),比 280px 更适配主流手机窄屏(如 iPhone SE 的 375px)不是代码错,而是约束条件被破坏。浏览器按可用行内尺寸计算列数,任何挤压都会让它“算不出第二列”。
立即学习“前端免费学习笔记(深入)”;
display: inline-block / float 导致宽度塌陷gap 过大(比如 gap: 40px),窄屏下直接挤占掉可分配空间width: 300px、min-width: 280px 或 flex: 0 0 250px,强行顶开网格项,破坏 minmax() 的弹性协商display: grid,或子项用了 position: absolute / float,导致网格定位完全不生效九宫格常需图片/图标等比例展示,aspect-ratio: 1/1 是最简方案,但要注意兼容性边界。
aspect-ratio: 1/1 在 iOS 16.4+ 和 Android Chrome 全支持,无需 polyfillheight: 120px 强制等高 —— 截断文字、破坏系统字体缩放grid-auto-rows: minmax(120px, auto):内容少时留白,内容多时延展,不拉扯其他格子padding,改用 margin: 0 12px 控制左右安全区,再配 max-width: calc(100vw - 24px) 防窄屏溢出repeat(auto-fit, minmax()) 的响应能力完全依赖父容器的真实宽度和子项的自然流行为。一旦加了固定宽、脱离文档流、或外层宽度塌陷,它就退化成“看着像响应式,实则卡死”。真正的难点不在写法,而在守住这些隐性约束。