/* fr = 剩余空间的等份,只在 grid-template-* 里可用 */ grid-template-columns: 1fr 2fr; /* 第二列是第一列的两倍 */ grid-template-columns: repeat(12, 1fr); /* 12 栏栅格底 */ grid-template-columns: repeat(3, minmax(0, 1fr)); /* 常见防御写法,见 11b */ grid-template-columns: [侧栏] 240px [主区] 1fr; /* 给轨道命名,用 grid-column: 侧栏 定位 */
grid-template-* 只描述你写明的轨道;超出的部分由 grid-auto-rows/grid-auto-columns 决定尺寸,方向由 grid-auto-flow(row / column / dense)控制。
.page {
display: grid;
grid-template-columns: 216px minmax(0, 1fr) 232px;
grid-template-areas: "nav main aside";
}
header { grid-area: nav; } /* 子项按名字落位,DOM 顺序可以与视觉顺序不同 */
区域名组成的矩形必须完整(不能有 L 形空洞),否则整条声明失效。用 . 表示空格子。响应式换布局只需重写 grid-template-areas,HTML 一行不动 —— 这是它比 Flex 更适合「整页骨架」的原因。
Grid 的 gap 只作用于轨道之间,四周不留额外空白,因此 1fr 已经自动扣掉了间距 —— 不需要再算 calc(33.333% - 11px)。
| 属性 | 管什么 |
|---|---|
justify-items / align-items | 格子内部内容在水平/垂直方向的位置 |
place-items | 上面两个的简写(place-items: center = 完全居中) |
justify-content / align-content | 整个网格轨道在容器里的分布(有剩余空间才看得出) |
justify-self / align-self | 单个子项叛逆一次 |
grid-auto-flow: dense 会打乱阅读顺序(视觉顺序 ≠ DOM 顺序),只适合图片墙一类非线性内容。
/* 等宽三列 + 间距 */ .g { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
/* 侧栏 + 流式主区 */ .g { display: grid; grid-template-columns: 240px minmax(0, 1fr); gap: 24px; }
/* 完美居中 */ .c { display: grid; place-items: center; }
/* 整页骨架 */ 见 11b 与 HTML 教程第九章