CSS: Grid 项目与对齐

在 Grid 布局中,你可以精确控制每个子元素放在哪个网格单元,以及子元素在网格单元内的对齐方式。

Grid 项目属性速查表

属性 常用值 作用
grid-column 1 / 3, span 2, 1 / -1 控制项目跨越哪些列
grid-row 1 / 2, span 3 控制项目跨越哪些行
grid-area header, 1 / 1 / 3 / 4 项目区域(可配合 grid-template-areas 命名)
justify-self stretch, start, end, center 项目自身在列方向的对齐
align-self stretch, start, end, center 项目自身在行方向的对齐
order 0, 1, -1 项目排列顺序(数值越小越靠前)

1. 项目放置

在定义好网格后,你可以使用以下属性将项目放置到指定的网格位置:

(1) grid-column 和 grid-row

▶ 示例

HTML
<style>
.item1 {
  grid-column: 1 / 3;   /* 从第1列线到第3列线,跨2列 */
  grid-row: 1 / 2;      /* 从第1行线到第2行线,占1行 */
}

.item2 {
  grid-column: 2 / 4;   /* 从第2列线到第4列线 */
  grid-row: 1 / 3;      /* 从第1行线到第3行线,跨2行 */
}
</style>
<div class="item1">Item1</div>
<div class="item2">Item2</div>
▶ 试一试

网格线编号:网格的线从 1 开始编号。1 / 3 表示从第 1 条线到第 3 条线,占据中间 2 列。

(2) 使用 span 关键字

▶ 示例

HTML
<style>
.item {
  grid-column: span 2;  /* 跨2列 */
  grid-row: span 3;     /* 跨3行 */
}

/* 等价于 */
.item {
  grid-column: 1 / span 2;  /* 从第1列开始,跨2列 */
}
</style>
<div class="item">项目元素,表示列表或布局中的一个项</div>
<span>内联文本</span>
<span>内联文本</span>
<span>内联文本</span>
▶ 试一试

(3) 使用简写

▶ 示例

HTML
<style>
.item {
  grid-area: 1 / 1 / 3 / 3;
  /* grid-row-start / grid-column-start / grid-row-end / grid-column-end */
  /* 从第1行第1列到第3行第3列 */
}
</style>
<div class="item">项目元素,表示列表或布局中的一个项</div>
▶ 试一试

2. 项目对齐

(1) 容器上的对齐属性(作用于所有项目)

justify-items: 水平方向对齐(在单元格内)

▶ 示例

HTML
<style>
.container {
  justify-items: start;    /* 左对齐 */
  justify-items: end;      /* 右对齐 */
  justify-items: center;   /* 居中 */
  justify-items: stretch;  /* 拉伸填满(默认) */
}
</style>
<div class="container">容器元素,内部包含其他子元素</div>
▶ 试一试

align-items: 垂直方向对齐(在单元格内)

▶ 示例

HTML
<style>
.container {
  align-items: start;     /* 顶部对齐 */
  align-items: end;       /* 底部对齐 */
  align-items: center;    /* 垂直居中 */
  align-items: stretch;   /* 拉伸填满(默认) */
}
</style>
<div class="container">容器元素,内部包含其他子元素</div>
▶ 试一试

place-items: 简写

▶ 示例

HTML
<style>
.container {
  place-items: center;         /* 水平和垂直都居中 */
  place-items: start center;   /* 水平居中,顶部对齐 */
}
</style>
<div class="container">容器元素,内部包含其他子元素</div>
<span class="demo-start">起始位置</span>
▶ 试一试

(2) 项目上的对齐属性(作用于单个项目)

justify-self: 单个项目水平对齐(覆盖容器 justify-items)

▶ 示例

HTML
<style>
.item {
  justify-self: start;
  justify-self: end;
  justify-self: center;
  justify-self: stretch;
}
</style>
<div class="item">项目元素,表示列表或布局中的一个项</div>
▶ 试一试

align-self: 单个项目垂直对齐(覆盖容器 align-items)

▶ 示例

HTML
<style>
.item {
  align-self: start;
    /* 自身对齐 */
  align-self: end;
  align-self: center;
  align-self: stretch;
}
</style>
<div class="item">项目元素,表示列表或布局中的一个项</div>
▶ 试一试

place-self: 简写

▶ 示例

HTML
<style>
.item {
  place-self: center;   /* 单个项目居中 */
}
</style>
<div class="item">项目元素,表示列表或布局中的一个项</div>
▶ 试一试

3. 容器上的整体对齐

当网格的总尺寸小于容器尺寸时,可以用以下属性控制网格整体的位置:

justify-content: 水平方向整体对齐

▶ 示例

HTML
<style>
.container {
  justify-content: start;        /* 左对齐 */
  justify-content: end;          /* 右对齐 */
  justify-content: center;       /* 居中 */
  justify-content: space-between;
  justify-content: space-around;
  justify-content: space-evenly;
}
</style>
<div class="container">容器元素,内部包含其他子元素</div>
▶ 试一试

align-content: 垂直方向整体对齐

▶ 示例

HTML
<style>
.container {
  align-content: start;
    /* 多行对齐 */
  align-content: end;
  align-content: center;
  align-content: space-between;
  align-content: space-around;
  align-content: space-evenly;
}
</style>
<div class="container">容器元素,内部包含其他子元素</div>
▶ 试一试

place-content: 简写

▶ 示例

HTML
<style>
.container {
  place-content: center;  /* 网格整体居中 */
}
</style>
<div class="container">容器元素,内部包含其他子元素</div>
▶ 试一试

4. 命名网格区域

(1) grid-template-areas

你还可以给网格区域"命名",然后通过名称放置项目:

▶ 示例

HTML
<style>
.container {
  display: grid;
  grid-template-columns: 200px 1fr;
  grid-template-rows: 80px 1fr 60px;
  grid-template-areas:
    "header header"
    "sidebar main"
    "footer footer";
  gap: 10px;
  height: 100vh;
}

header { grid-area: header; }
aside  { grid-area: sidebar; }
main   { grid-area: main; }
footer { grid-area: footer; }
.container-item {
  background: #e8f4f8;
  border: 1px solid #3498db;
  padding: 16px;
  margin: 4px;
  border-radius: 4px;
  text-align: center;
}
</style>
<div class="container">
    <div class="container-item">Container item</div>
    <div class="container-item">Container item</div>
    <div class="container-item">Container item</div>
</div>
▶ 试一试

这种方法非常直观,适合整体页面布局。


5. 综合示例

▶ 示例

HTML
<style>
.grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: 100px;
  gap: 10px;
}

/* 第一个项目占左上角2×2格 */
.item1 {
  grid-column: 1 / 3;
  grid-row: 1 / 3;
  display: flex;
  align-items: center;
  justify-content: center;
  background: #e74c3c;
  color: white;
}

/* 第三个项目跨2列 */
.item3 {
  grid-column: span 2;
  justify-self: center;
  align-self: center;
}
.grid-item {
  background: #e8f4f8;
  border: 1px solid #3498db;
  padding: 16px;
  margin: 4px;
  border-radius: 4px;
  text-align: center;
}
</style>
<div class="grid">
    <div class="grid-item">Grid item</div>
    <div class="grid-item">Grid item</div>
    <div class="grid-item">Grid item</div>
</div>
▶ 试一试

❓ 常见问题

Q grid-column: 1 / -1 是什么意思?
A 表示从第 1 条网格线跨越到最后 1 条网格线(-1 是最后一条线的编号),即占满整行。非常适合做全宽的标题行或分隔行,不需要知道总共有多少列。
Q Grid 项目可以重叠吗?
A 可以。Grid 允许项目占据相同的网格区域,后面的项目会覆盖在前面的上面。可以利用这个特性做叠加效果,比如文字叠在图片上。用 z-index 控制叠放顺序。
Q span 关键字怎么用?
A grid-column: span 2 表示"跨 2 列",比写网格线编号更直观。不需要知道从哪条线开始,浏览器会自动计算。特别适合在不知道具体列数的响应式场景中使用。

📖 小节

📝 作业

  1. 创建一个 4×4 网格,将一个项目放置在从第 2 列第 2 行开始、跨 2 列 2 行的位置。
  2. 使用 grid-template-areas 创建一个完整的页面布局:头部(跨2列)、侧栏、内容区、底部(跨2列)。
  3. 在网格容器中让所有项目水平和垂直居中(使用 place-items: center)。
  4. 让网格中的第三个项目单独在单元格内靠右下角对齐(使用 justify-selfalign-self)。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏