Appearance
CSS Grid 布局
Grid(网格)是一种用于二维布局的 CSS 布局系统。
概述
Grid 布局适用于复杂的大规模布局,可以同时处理行和列。
容器属性
display
定义网格容器:
css
.grid-container {
display: grid; /* 块级网格 */
display: inline-grid; /* 行内网格 */
}
grid-template-columns 和 grid-template-rows
定义网格的列和行大小:
css
.container {
grid-template-columns: 100px 200px 100px; /* 固定列宽 */
grid-template-rows: 50px 100px; /* 固定行高 */
/* 使用 fr 单位分配剩余空间 */
grid-template-columns: 1fr 2fr 1fr;
/* 使用 repeat() 函数 */
grid-template-columns: repeat(3, 1fr);
/* 使用 minmax() 函数 */
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
grid-template-areas
定义网格区域:
css
.container {
grid-template-areas:
"header header header"
"sidebar main aside"
"footer footer footer";
}
.header { grid-area: header; }
.main { grid-area: main; }
.sidebar { grid-area: sidebar; }
.aside { grid-area: aside; }
.footer { grid-area: footer; }
grid-gap, column-gap, row-gap
定义网格间距:
css
.container {
gap: 10px; /* 行和列间距 */
column-gap: 15px; /* 列间距 */
row-gap: 10px; /* 行间距 */
}
grid-auto-columns 和 grid-auto-rows
定义隐式网格轨道大小:
css
.container {
grid-auto-columns: 100px;
grid-auto-rows: 50px;
}
grid-auto-flow
控制自动放置算法:
css
.container {
grid-auto-flow: row; /* 默认值,按行填充 */
grid-auto-flow: column; /* 按列填充 */
grid-auto-flow: row dense; /* 紧密填充 */
grid-auto-flow: column dense;
}
项目属性
grid-column 和 grid-row
定义项目在网格中的位置:
css
.item {
grid-column: 1 / 3; /* 从第1列到第3列(不包含) */
grid-column: 1 / -1; /* 从第1列到最后一列 */
grid-column: span 2; /* 跨越2列 */
grid-row: 1 / 3; /* 从第1行到第3行 */
grid-row: span 2; /* 跨越2行 */
}
grid-area
简写属性,可以定义网格区域名称或位置:
css
.item {
grid-area: 1 / 1 / 3 / 2; /* row-start / column-start / row-end / column-end */
grid-area: header; /* 网格区域名称 */
}
justify-self
水平轴上对齐单个项目:
css
.item {
justify-self: start; /* 左对齐 */
justify-self: end; /* 右对齐 */
justify-self: center; /* 居中 */
justify-self: stretch; /* 默认值,拉伸 */
}
align-self
垂直轴上对齐单个项目:
css
.item {
align-self: start; /* 顶部对齐 */
align-self: end; /* 底部对齐 */
align-self: center; /* 垂直居中 */
align-self: stretch; /* 默认值,拉伸 */
}
place-self
justify-self 和 align-self 的简写:
css
.item {
place-self: center; /* 水平和垂直都居中 */
place-self: center stretch; /* 水平居中,垂直拉伸 */
}
常用函数和单位
fr 单位
分配剩余空间:
css
.container {
grid-template-columns: 1fr 2fr 1fr; /* 按 1:2:1 分配剩余空间 */
}
minmax() 函数
定义大小范围:
css
.container {
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
/* 自适应列,最小200px,最大1fr */
}
repeat() 函数
重复模式:
css
.container {
grid-template-columns: repeat(5, 1fr); /* 5列,每列相等 */
grid-template-columns: repeat(2, 100px 1fr); /* 重复 100px 1fr 模式2次 */
}
实用示例
响应式网格
css
.responsive-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 20px;
}
经典网页布局
css
.page-layout {
display: grid;
grid-template-areas:
"header"
"main"
"sidebar"
"footer";
grid-template-rows: auto 1fr auto auto;
height: 100vh;
}
.header { grid-area: header; }
.main { grid-area: main; }
.sidebar { grid-area: sidebar; }
.footer { grid-area: footer; }
卡片网格
css
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
}
Grid 模板简写属性
grid-template
grid-template-columns、grid-template-rows 和 grid-template-areas 的简写:
css
.container {
grid-template:
[row1-start] "header header header" 1fr [row1-end]
[row2-start] "sidebar main aside" 1fr [row2-end]
[row3-start] "footer footer footer" 100px [row3-end]
/ 150px 1fr 150px;
}
grid
所有网格属性的简写:
css
.container {
grid: 100px 300px / auto 1fr;
/* 等价于 */
grid-template-rows: 100px 300px;
grid-template-columns: auto 1fr;
}
最佳实践
- Grid 适合二维布局,Flexbox 适合一维布局
- 使用 Grid 创建整体页面布局
- 使用 minmax() 和 auto-fit/auto-fill 实现响应式网格
- 合理使用网格线和区域名称提高可读性
- 考虑老版本浏览器的兼容性(IE10+ 支持)