从零开始学习 Grid 布局
本文内容基于 AI 生成结果整理,可能包含不准确信息,仅供参考使用。
Grid 介绍
Grid(网格)布局是 CSS 中最强大的布局系统,它是一个二维布局系统(可以同时处理行和列),而 Flexbox 是一维布局系统(一次只能处理行或列)。
MDN Grid 文档 | CSS Grid Garden - 游戏化学习 Grid | Grid by Example - 大量示例
基础概念
网格容器
css
.container {
display: grid; /* 或 display: inline-grid */
}设置这个属性的元素就变成了网格容器,它的直接子元素会自动成为网格项目。
网格线
网格线是构成网格结构的分界线,包括水平线和垂直线。
网格轨道
两个相邻网格线之间的空间,包括行轨道和列轨道。
网格单元格
网格单元格是网格中的最小单位,由四条网格线包围。
网格区域
网格区域是由一个或多个网格单元格组成的矩形区域。
基本用法
定义网格
css
.container {
display: grid;
grid-template-columns: 100px 200px 100px; /* 3列,宽度分别为100px,200px,100px */
grid-template-rows: 50px 100px; /* 2行,高度分别为50px,100px */
}常用单位
- fr:剩余空间分配单位
- auto:自动尺寸
- minmax(min, max):定义大小范围
css
.container {
grid-template-columns: 1fr 2fr 1fr; /* 中间列是两侧的两倍宽 */
}实战示例
基本网格
html
<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>
css
.grid-container {
display: grid;
grid-template-columns: repeat(3, 1fr); /* 3等宽列 */
gap: 10px; /* 网格间距 */
}
.item {
background-color: #4caf50;
padding: 20px;
text-align: center;
color: white;
}响应式网格
css
.grid-container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 15px;
}- auto-fill:自动填充尽可能多的列
- minmax(200px, 1fr):每列最小 200px,最大 1fr
网格项目定位
基于线的定位
css
.item {
grid-column-start: 1;
grid-column-end: 3;
grid-row-start: 1;
grid-row-end: 3;
/* 简写 */
grid-column: 1 / 3;
grid-row: 1 / 3;
}grid-column: 1 / span 2;
表示从第 1 条网格线开始,跨越 2 个单元格,效果与 grid-column: 1 / 3 相同。
基于区域的定位
css
.container {
grid-template-areas:
"header header header"
"sidebar content content"
"footer footer footer";
}
.header {
grid-area: header;
}
.sidebar {
grid-area: sidebar;
}
.content {
grid-area: content;
}
.footer {
grid-area: footer;
}对齐方式
可以通过 F12 审查示例了解具体作用。
容器内对齐
控制元素在容器内的对齐方式。
语法:
css
.container {
justify-items: start | end | center | stretch;
align-items: start | end | center | stretch;
place-items: <align-items> <justify-items>; /* 简写 */
}示例:
此演示仅在桌面端浏览器中可用
示例代码:
html
<!DOCTYPE html>
<html lang="en">
<head>
<title>wanglei.live</title>
<style>
* {
margin: 0;
padding: 0;
}
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3, 1fr);
justify-items: center;
align-items: center;
width: 300px;
height: 300px;
margin: 10px auto;
}
.item {
background-color: pink;
width: 50px;
height: 50px;
}
</style>
</head>
<body>
<div class="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 class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
</div>
</body>
</html>整个内容区域对齐
控制容器的布局方式。
语法:
css
.container {
justify-content: start | end | center | stretch | space-around | space-between
| space-evenly;
align-content: start | end | center | stretch | space-around | space-between |
space-evenly;
}示例:
此演示仅在桌面端浏览器中可用
示例代码:
html
<!DOCTYPE html>
<html lang="en">
<head>
<title>wanglei.live</title>
<style>
* {
margin: 0;
padding: 0;
}
.container {
display: grid;
grid-template-columns: repeat(3, 80px);
grid-template-rows: repeat(3, 50px);
align-content: space-around;
justify-content: space-around;
width: 300px;
height: 200px;
margin: 10px auto;
}
.item {
background-color: pink;
}
</style>
</head>
<body>
<div class="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 class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
</div>
</body>
</html>auto-fit vs auto-fill
在子元素不能够铺满一行时,它俩才会出现差异。
auto-fill 会自动填充尽可能多的列,即使有空间也不会调整列数。
此演示仅在桌面端浏览器中可用
css
display: grid;
grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));auto-fit 会自动调整列数,填充剩余空间。
此演示仅在桌面端浏览器中可用
css
display: grid;
grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));