CSS Grid
学习 CSS 网格布局(Grid)的基本概念、属性和使用方法,掌握现代 CSS 二维布局技术。
什么是 CSS Grid?
CSS Grid(网格布局)是一种二维布局模型,用于在容器中对项目进行行和列的排列。它可以轻松创建复杂的布局结构,适用于各种屏幕尺寸和设备。
Grid 基本术语
- 网格容器 (Grid Container):应用了
display: grid;或display: inline-grid;的元素。 - 网格项目 (Grid Item):网格容器的直接子元素。
- 网格线 (Grid Line):构成网格结构的线,包括水平线和垂直线。
- 网格轨道 (Grid Track):两条相邻网格线之间的空间,包括行和列。
- 网格单元格 (Grid Cell):相邻的行和列网格线之间的最小单位,类似于表格的单元格。
- 网格区域 (Grid Area):由一个或多个网格单元格组成的矩形区域。
- 网格间隙 (Grid Gap):网格轨道之间的空间。
/* 创建一个网格容器 */
.grid-container { /* 选择器:class 为 grid-container 的元素 */
display: grid; /* 属性:display,设置为 grid,创建一个块级网格容器 */
/* 其他 grid 容器属性,如 grid-template-columns, grid-template-rows, gap 等 */
}
/* 网格项目会自动成为容器的子元素 */
.grid-item { /* 选择器:class 为 grid-item 的元素 */
/* 其他 grid 项目属性,如 grid-column, grid-row, grid-area 等 */
}
Grid 容器属性
1. display
定义一个网格容器。
| 值 | 描述 |
|---|---|
| grid | 创建一个块级网格容器。 |
| inline-grid | 创建一个内联网格容器。 |
2. grid-template-columns 和 grid-template-rows
定义网格的列和行的大小。
| 值 | 描述 |
|---|---|
| length | 指定具体的长度值,如 px、em、% 等。 |
| fr | 网格剩余空间的比例单位。 |
| auto | 根据内容自动调整大小。 |
| minmax(min, max) | 指定最小和最大尺寸范围。 |
| repeat(n, value) | 重复指定的值 n 次。 |
/* 定义一个 3 列 2 行的网格 */
.grid-container { /* 选择器:class 为 grid-container 的元素 */
display: grid; /* 属性:display,设置为 grid,创建一个块级网格容器 */
grid-template-columns: 100px 1fr 2fr; /* 属性:grid-template-columns,定义 3 列,宽度分别为 100 像素、1 份剩余空间、2 份剩余空间 */
grid-template-rows: 50px 100px; /* 属性:grid-template-rows,定义 2 行,高度分别为 50 像素、100 像素 */
}
/* 使用 repeat 函数 */
.grid-container { /* 选择器:class 为 grid-container 的元素 */
display: grid; /* 属性:display,设置为 grid,创建一个块级网格容器 */
grid-template-columns: repeat(3, 1fr); /* 属性:grid-template-columns,使用 repeat 函数定义 3 列,每列宽度为 1 份剩余空间 */
grid-template-rows: repeat(2, auto); /* 属性:grid-template-rows,使用 repeat 函数定义 2 行,每行高度根据内容自动调整 */
}
/* 使用 minmax 函数 */
.grid-container { /* 选择器:class 为 grid-container 的元素 */
display: grid; /* 属性:display,设置为 grid,创建一个块级网格容器 */
grid-template-columns: repeat(3, minmax(100px, 1fr)); /* 属性:grid-template-columns,使用 repeat 函数定义 3 列,每列宽度最小为 100 像素,最大为 1 份剩余空间 */
}
3. grid-template-areas
定义网格区域的布局。
/* 定义网格区域 */
.grid-container { /* 选择器:class 为 grid-container 的元素 */
display: grid; /* 属性:display,设置为 grid,创建一个块级网格容器 */
grid-template-columns: 1fr 3fr 1fr; /* 属性:grid-template-columns,定义 3 列,宽度分别为 1 份、3 份、1 份剩余空间 */
grid-template-rows: auto 1fr auto; /* 属性:grid-template-rows,定义 3 行,高度分别为自动、1 份剩余空间、自动 */
grid-template-areas: /* 属性:grid-template-areas,定义网格区域布局 */
"header header header" /* 第一行:整个行都是 header 区域 */
"sidebar main right" /* 第二行:左侧是 sidebar 区域,中间是 main 区域,右侧是 right 区域 */
"footer footer footer"; /* 第三行:整个行都是 footer 区域 */
}
/* 分配网格项目到区域 */
.header { /* 选择器:class 为 header 的元素 */
grid-area: header; /* 属性:grid-area,将元素分配到 header 区域 */
}
.sidebar { /* 选择器:class 为 sidebar 的元素 */
grid-area: sidebar; /* 属性:grid-area,将元素分配到 sidebar 区域 */
}
.main { /* 选择器:class 为 main 的元素 */
grid-area: main; /* 属性:grid-area,将元素分配到 main 区域 */
}
.right { /* 选择器:class 为 right 的元素 */
grid-area: right; /* 属性:grid-area,将元素分配到 right 区域 */
}
.footer { /* 选择器:class 为 footer 的元素 */
grid-area: footer; /* 属性:grid-area,将元素分配到 footer 区域 */
}
4. grid-template
grid-template-columns、grid-template-rows 和 grid-template-areas 的简写属性。
5. gap (grid-gap)
定义网格项目之间的间隙。
| 值 | 描述 |
|---|---|
| length | 指定具体的长度值,如 px、em 等。 |
| fr | 网格剩余空间的比例单位。 |
/* 设置网格间隙 */
.grid-container { /* 选择器:class 为 grid-container 的元素 */
display: grid; /* 属性:display,设置为 grid,创建一个块级网格容器 */
grid-template-columns: repeat(3, 1fr); /* 属性:grid-template-columns,使用 repeat 函数定义 3 列,每列宽度为 1 份剩余空间 */
gap: 10px; /* 属性:gap,设置行和列的间隙都是 10 像素 */
}
/* 分别设置行和列的间隙 */
.grid-container { /* 选择器:class 为 grid-container 的元素 */
display: grid; /* 属性:display,设置为 grid,创建一个块级网格容器 */
grid-template-columns: repeat(3, 1fr); /* 属性:grid-template-columns,使用 repeat 函数定义 3 列,每列宽度为 1 份剩余空间 */
row-gap: 10px; /* 属性:row-gap,设置行间隙为 10 像素 */
column-gap: 20px; /* 属性:column-gap,设置列间隙为 20 像素 */
}
6. justify-items
定义网格项目在单元格内水平方向的对齐方式。
| 值 | 描述 |
|---|---|
| stretch | 默认值,拉伸以填充单元格。 |
| start | 左对齐。 |
| end | 右对齐。 |
| center | 水平居中对齐。 |
7. align-items
定义网格项目在单元格内垂直方向的对齐方式。
| 值 | 描述 |
|---|---|
| stretch | 默认值,拉伸以填充单元格。 |
| start | 顶部对齐。 |
| end | 底部对齐。 |
| center | 垂直居中对齐。 |
8. place-items
align-items 和 justify-items 的简写属性。
9. justify-content
定义网格容器内网格在水平方向的对齐方式,当网格总宽度小于容器宽度时生效。
| 值 | 描述 |
|---|---|
| stretch | 默认值,拉伸以填充容器。 |
| start | 左对齐。 |
| end | 右对齐。 |
| center | 水平居中对齐。 |
| space-between | 网格之间均匀分布,首尾网格贴近容器边缘。 |
| space-around | 网格之间均匀分布,首尾网格距离容器边缘有一半间距。 |
| space-evenly | 网格之间和与容器边缘之间都均匀分布。 |
10. align-content
定义网格容器内网格在垂直方向的对齐方式,当网格总高度小于容器高度时生效。
| 值 | 描述 |
|---|---|
| stretch | 默认值,拉伸以填充容器。 |
| start | 顶部对齐。 |
| end | 底部对齐。 |
| center | 垂直居中对齐。 |
| space-between | 网格之间均匀分布,首尾网格贴近容器边缘。 |
| space-around | 网格之间均匀分布,首尾网格距离容器边缘有一半间距。 |
| space-evenly | 网格之间和与容器边缘之间都均匀分布。 |
11. place-content
align-content 和 justify-content 的简写属性。
12. grid-auto-columns 和 grid-auto-rows
定义自动生成的网格轨道的大小。
13. grid-auto-flow
定义自动放置网格项目的方式。
| 值 | 描述 |
|---|---|
| row | 默认值,按行填充。 |
| column | 按列填充。 |
| dense | 尝试填充网格中的空隙。 |
Grid 项目属性
1. grid-column-start, grid-column-end, grid-row-start, grid-row-end
定义网格项目的位置和大小。
| 值 | 描述 |
|---|---|
| number | 网格线的编号。 |
| name | 命名的网格线。 |
| span n | 跨越 n 个网格轨道。 |
| auto | 自动确定位置。 |
/* 设置网格项目的位置和大小 */
.item1 { /* 选择器:class 为 item1 的元素 */
grid-column-start: 1; /* 属性:grid-column-start,设置元素的起始列网格线为 1 */
grid-column-end: 3; /* 属性:grid-column-end,设置元素的结束列网格线为 3 */
grid-row-start: 1; /* 属性:grid-row-start,设置元素的起始行网格线为 1 */
grid-row-end: 2; /* 属性:grid-row-end,设置元素的结束行网格线为 2 */
}
/* 使用简写属性 */
.item2 { /* 选择器:class 为 item2 的元素 */
grid-column: 1 / 3; /* 属性:grid-column,简写属性,设置元素的起始列网格线为 1,结束列网格线为 3 */
grid-row: 2 / 4; /* 属性:grid-row,简写属性,设置元素的起始行网格线为 2,结束行网格线为 4 */
}
/* 使用 span */
.item3 { /* 选择器:class 为 item3 的元素 */
grid-column: 2 / span 2; /* 属性:grid-column,设置元素的起始列网格线为 2,跨越 2 个列网格轨道 */
grid-row: 1 / span 3; /* 属性:grid-row,设置元素的起始行网格线为 1,跨越 3 个行网格轨道 */
}
2. grid-column 和 grid-row
grid-column-start/grid-column-end 和 grid-row-start/grid-row-end 的简写属性。
3. grid-area
定义网格项目的区域,可以是命名的区域或网格线的组合。
4. justify-self
定义单个网格项目在单元格内水平方向的对齐方式,覆盖容器的 justify-items 属性。
| 值 | 描述 |
|---|---|
| stretch | 默认值,拉伸以填充单元格。 |
| start | 左对齐。 |
| end | 右对齐。 |
| center | 水平居中对齐。 |
5. align-self
定义单个网格项目在单元格内垂直方向的对齐方式,覆盖容器的 align-items 属性。
| 值 | 描述 |
|---|---|
| stretch | 默认值,拉伸以填充单元格。 |
| start | 顶部对齐。 |
| end | 底部对齐。 |
| center | 垂直居中对齐。 |
6. place-self
align-self 和 justify-self 的简写属性。
Grid 实际应用示例
示例 1:基本网格布局
<div class="grid-container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
</div>
<style>
.grid-container { /* 选择器:class 为 grid-container 的元素 */
display: grid; /* 属性:display,设置为 grid,创建一个块级网格容器 */
grid-template-columns: repeat(3, 1fr); /* 属性:grid-template-columns,使用 repeat 函数定义 3 列,每列宽度为 1 份剩余空间 */
grid-template-rows: repeat(2, 100px); /* 属性:grid-template-rows,使用 repeat 函数定义 2 行,每行高度为 100 像素 */
gap: 10px; /* 属性:gap,设置网格项目之间的间隙为 10 像素 */
}
.item { /* 选择器:class 为 item 的元素 */
background-color: #e0f7fa; /* 属性:background-color,设置背景颜色为浅蓝色 */
padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
text-align: center; /* 属性:text-align,设置文本对齐方式为居中 */
border-radius: 4px; /* 属性:border-radius,设置圆角为 4 像素 */
}
</style>
示例 2:响应式网格
<div class="responsive-grid">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
</div>
<style>
.responsive-grid { /* 选择器:class 为 responsive-grid 的元素 */
display: grid; /* 属性:display,设置为 grid,创建一个块级网格容器 */
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); /* 属性:grid-template-columns,使用 repeat(auto-fit, minmax(200px, 1fr)) 创建自适应网格,每列最小宽度为 200 像素,最大为 1 份剩余空间 */
gap: 10px; /* 属性:gap,设置网格项目之间的间隙为 10 像素 */
}
.item { /* 选择器:class 为 item 的元素 */
background-color: #e8f5e8; /* 属性:background-color,设置背景颜色为浅绿色 */
padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
text-align: center; /* 属性:text-align,设置文本对齐方式为居中 */
border-radius: 4px; /* 属性:border-radius,设置圆角为 4 像素 */
}
</style>
示例 3:复杂布局
<div class="complex-layout">
<header class="header">头部</header>
<aside class="sidebar">侧边栏</aside>
<main class="main">主内容</main>
<section class="widget1">小部件 1</section>
<section class="widget2">小部件 2</section>
<footer class="footer">底部</footer>
</div>
<style>
.complex-layout { /* 选择器:class 为 complex-layout 的元素 */
display: grid; /* 属性:display,设置为 grid,创建一个块级网格容器 */
grid-template-columns: 200px 1fr 1fr; /* 属性:grid-template-columns,定义 3 列,宽度分别为 200 像素、1 份、1 份剩余空间 */
grid-template-rows: auto 1fr auto auto; /* 属性:grid-template-rows,定义 4 行,高度分别为自动、1 份剩余空间、自动、自动 */
grid-template-areas: /* 属性:grid-template-areas,定义网格区域布局 */
"header header header" /* 第一行:整个行都是 header 区域 */
"sidebar main main" /* 第二行:左侧是 sidebar 区域,中间和右侧是 main 区域 */
"sidebar widget1 widget2" /* 第三行:左侧是 sidebar 区域,中间是 widget1 区域,右侧是 widget2 区域 */
"footer footer footer"; /* 第四行:整个行都是 footer 区域 */
gap: 10px; /* 属性:gap,设置网格区域之间的间隙为 10 像素 */
min-height: 100vh; /* 属性:min-height,设置最小高度为 100 视口高度,确保占满整个屏幕 */
}
.header { /* 选择器:class 为 header 的元素 */
grid-area: header; /* 属性:grid-area,将元素分配到 header 区域 */
background-color: #333; /* 属性:background-color,设置背景颜色为深灰色 */
color: white; /* 属性:color,设置文本颜色为白色 */
padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
}
.sidebar { /* 选择器:class 为 sidebar 的元素 */
grid-area: sidebar; /* 属性:grid-area,将元素分配到 sidebar 区域 */
background-color: #f0f0f0; /* 属性:background-color,设置背景颜色为浅灰色 */
padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
}
.main { /* 选择器:class 为 main 的元素 */
grid-area: main; /* 属性:grid-area,将元素分配到 main 区域 */
background-color: #ffffff; /* 属性:background-color,设置背景颜色为白色 */
padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
}
.widget1 { /* 选择器:class 为 widget1 的元素 */
grid-area: widget1; /* 属性:grid-area,将元素分配到 widget1 区域 */
background-color: #e3f2fd; /* 属性:background-color,设置背景颜色为浅蓝色 */
padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
}
.widget2 { /* 选择器:class 为 widget2 的元素 */
grid-area: widget2; /* 属性:grid-area,将元素分配到 widget2 区域 */
background-color: #e8f5e8; /* 属性:background-color,设置背景颜色为浅绿色 */
padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
}
.footer { /* 选择器:class 为 footer 的元素 */
grid-area: footer; /* 属性:grid-area,将元素分配到 footer 区域 */
background-color: #333; /* 属性:background-color,设置背景颜色为深灰色 */
color: white; /* 属性:color,设置文本颜色为白色 */
padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
}
</style>
示例 4:卡片网格
<div class="card-grid">
<div class="card">
<h3>卡片 1</h3>
<p>这是一张卡片内容</p>
</div>
<div class="card">
<h3>卡片 2</h3>
<p>这是一张卡片内容</p>
</div>
<div class="card">
<h3>卡片 3</h3>
<p>这是一张卡片内容</p>
</div>
<div class="card">
<h3>卡片 4</h3>
<p>这是一张卡片内容</p>
</div>
<div class="card">
<h3>卡片 5</h3>
<p>这是一张卡片内容</p>
</div>
</div>
<style>
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 20px;
padding: 20px;
}
.card {
background-color: #ffffff;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
padding: 20px;
transition: transform 0.3s ease;
}
.card:hover {
transform: translateY(-5px);
}
.card h3 {
margin-top: 0;
color: #333;
}
.card p {
color: #666;
}
</style>
Grid 使用技巧
- 二维布局优先使用 Grid:Grid 适用于二维布局(行和列),而 Flexbox 适用于一维布局。
- 合理使用 repeat 函数:使用
repeat()函数可以简化重复的网格轨道定义。 - 使用 minmax 函数创建响应式布局:
minmax()函数可以确保网格轨道在不同屏幕尺寸下的合理显示。 - 使用 auto-fit 和 auto-fill 创建自适应网格:结合
repeat()和minmax()可以创建自适应的响应式网格。 - 合理命名网格区域:使用
grid-template-areas可以创建清晰易懂的布局结构。 - 注意浏览器兼容性:虽然现代浏览器都支持 Grid,但在处理旧浏览器时需要考虑兼容性。
- 结合 Flexbox 使用:Grid 和 Flexbox 可以结合使用,Grid 用于整体布局,Flexbox 用于局部对齐。
Grid 总结
- CSS Grid 是一种二维布局模型,用于在容器中对项目进行行和列的排列。
- 网格容器通过
display: grid;或display: inline-grid;创建。 - Grid 容器属性控制整个容器的布局方式,如网格轨道大小、对齐方式等。
- Grid 项目属性控制单个项目的行为,如位置、大小、对齐方式等。
- Grid 可以轻松创建复杂的布局结构,如响应式网格、卡片布局、复杂页面布局等。
- Grid 是现代 CSS 布局的重要工具,掌握它可以大大提高布局效率和灵活性。