CSS Grid布局是一种强大的二维布局系统,允许开发者在网页上创建复杂的布局结构。它提供了精确控制行和列的能力,使得设计响应式和复杂的界面变得更加简单。

一、Grid布局的基本概念

1.1 核心术语

  • 网格容器 (Grid Container):应用了 display: grid 的元素。

  • 网格项 (Grid Items):网格容器的直接子元素。

  • 网格线 (Grid Lines):分隔行和列的线,有数字编号。

  • 网格轨道 (Grid Tracks):网格线之间的空间,包括行和列。

  • 网格单元格 (Grid Cell):行和列交叉形成的最小单位。

  • 网格区域 (Grid Area):由多个网格单元格组成的矩形区域。

2.2. 与Flexbox的区别

特性

Grid布局

Flexbox布局

维度

二维 (行和列)

一维 (行或列)

主要用途

页面整体布局、复杂组件

一维列表、导航、卡片

内容流向

可以同时控制行和列

只能控制单一方向

二、网格容器属性

属性名

描述

display

定义元素为网格容器

grid-template-columns

定义网格的列轨道大小 | 长度值

grid-template-rows

定义网格的行轨道大小

grid-template-areas

定义命名网格区域 | 区域名称

grid-template

简写属性,包含上述三个属性

grid-column-gap

定义列之间的间距

grid-row-gap

定义行之间的间距

gap

简写属性,设置行和列的间距

grid-auto-columns

定义隐式列轨道的大小

grid-auto-rows

定义隐式行轨道的大小

grid-auto-flow

定义自动放置项目的流动方向

justify-content

当网格小于容器时,沿主轴对齐网格

align-content

当网格小于容器时,沿交叉轴对齐网格

place-content

简写属性,同时设置 justify-content 和 align-content

justify-items

设置网格项在其单元格内沿主轴的对齐方式

align-items

设置网格项在其单元格内沿交叉轴的对齐方式

place-items

简写属性,同时设置 justify-items 和 align-items

属性名

可能值

display

grid

grid-template-columns

长度值 | 百分比 | fr | repeat() | minmax() | auto

grid-template-rows

同上

grid-template-areas

区域名称 | . (空单元格)

grid-template

grid-template-rows / grid-template-columns

grid-column-gap

长度值

grid-row-gap

长度值

gap

grid-row-gap grid-column-gap

grid-auto-columns

长度值 | 百分比 | fr | auto

grid-auto-rows

长度值 | 百分比 | fr | auto

grid-auto-flow

row | column | dense

justify-content


start | end | center | stretch | space-around | space-between | space-evenly

align-content

place-content

justify-content align-content

justify-items

start | end | center | stretch

align-items

start | end | center | stretch | baseline

place-items

justify-items align-items

属性名

示例

display

display: grid;

grid-template-columns

grid-template-columns: 1fr 2fr 1fr;

grid-template-rows

grid-template-rows: 100px 200px 100px;

grid-template-areas

grid-template-areas: "header header" "sidebar main" "footer footer";

grid-template

grid-template: 100px 1fr / 200px 1fr;

grid-column-gap

grid-column-gap: 20px;

grid-row-gap

grid-row-gap: 10px;

gap

gap: 10px 20px;

grid-auto-columns

grid-auto-columns: 100px;

grid-auto-rows

grid-auto-rows: minmax(50px, auto);

grid-auto-flow

grid-auto-flow: row dense;

justify-content

justify-content: center;

align-content

align-content: space-between;

place-content

place-content: center center;

justify-items

justify-items: center;

align-items

align-items: stretch;

place-items

place-items: center stretch;

三、网格属性

属性名

描述

grid-column-start

定义网格项的起始列网格线

grid-column-end

定义网格项的结束列网格线

grid-row-start

定义网格项的起始行网格线

grid-row-end

定义网格项的结束行网格线

grid-column

简写属性,设置 grid-column-start 和 grid-column-end

grid-row

简写属性,设置 grid-row-start 和 grid-row-end

grid-area

定义网格项所在的网格区域

justify-self

覆盖容器的 justify-items,设置单个网格项沿主轴的对齐方式

align-self

覆盖容器的 align-items,设置单个网格项沿交叉轴的对齐方式

place-self

简写属性,同时设置 justify-self 和 align-self

order

控制网格项的排列顺序

属性名

可能值

grid-column-start

网格线编号 | 区域名称 | span 数值

grid-column-end

网格线编号 | 区域名称 | span 数值

grid-row-start

网格线编号 | 区域名称 | span 数值

grid-row-end

网格线编号 | 区域名称 | span 数值

grid-column

grid-column-start / grid-column-end

grid-row

grid-row-start / grid-row-end

grid-area

区域名称 | grid-row-start / grid-column-start / grid-row-end / grid-column-end

justify-self

start | end | center | stretch

align-self

start | end | center | stretch | baseline

place-self

justify-self align-self

order

整数(默认值为 0)

属性名

示例

grid-column-start

grid-column-start: 2;

grid-column-end

grid-column-end: span 2;

grid-row-start

grid-row-start: header;

grid-row-end

grid-row-end: span 3;

grid-column

grid-column: 1 / span 2;

grid-row

grid-row: 2 / 4;

grid-area

grid-area: 1 / 2 / 3 / 4;

justify-self

justify-self: end;

align-self

align-self: center;

place-self

place-self: center end;

order

order: -1;

四、属性值说明

关键字

描述

fr

份数单位,表示剩余空间的一部分

repeat()

重复模式,避免重复书写相同的值

minmax()

定义一个范围,表示最小值和最大值

auto

根据内容自动调整大小

span

表示跨越的网格线数量

dense

尝试填充网格中的空白区域

五、网格容器属性示例

5.1 定义网格

.container {
  display: grid;
  /* 定义3列,每列宽度100px */
  grid-template-columns: 100px 100px 100px;
  /* 定义2行,每行高度50px */
  grid-template-rows: 50px 50px;
  /* 列间距10px,行间距20px */
  gap: 20px 10px;
}

5.2 灵活的列宽/行高

.container {
  display: grid;
  /* 3列等宽 */
  grid-template-columns: 1fr 1fr 1fr;
  /* 或简写 */
  grid-template-columns: repeat(3, 1fr);
  /* 最小100px,最大自动扩展 */
  grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
  /* 自动填充,不强制换行 */
  grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
}

5.3 网格区域命名

.container {
  display: grid;
  grid-template-columns: 1fr 3fr;
  grid-template-rows: 80px 1fr 50px;
  grid-template-areas: 
    "header header"
    "sidebar main"
    "footer footer";
}

.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.footer { grid-area: footer; }

5.4 内容对齐

.container {
  display: grid;
  height: 500px;
  grid-template-columns: repeat(3, 100px);
  grid-template-rows: repeat(2, 100px);
  
  /* 对齐整个网格 */
  justify-content: center; /* 水平方向 */
  align-content: center;   /* 垂直方向 */
  place-content: center;   /* 简写 */
  
  /* 对齐网格项 */
  justify-items: center;   /* 水平方向 */
  align-items: center;     /* 垂直方向 */
  place-items: center;     /* 简写 */
}

六、网格项属性示例

6.1 定位网格项

.item {
  /* 起始和结束网格线 */
  grid-column-start: 1;
  grid-column-end: 3;
  grid-row-start: 1;
  grid-row-end: 2;
  
  /* 简写 */
  grid-column: 1 / 3;
  grid-row: 1 / 2;
  
  /* 起始线 + 跨度 */
  grid-column: 1 / span 2;
  grid-row: 1 / span 1;
}

6.2 对齐单个网格项

.item {
  justify-self: center;   /* 水平方向 */
  align-self: center;     /* 垂直方向 */
  place-self: center;     /* 简写 */
}

七、高级特性

7.1 隐式网格

.container {
  display: grid;
  grid-template-columns: repeat(3, 100px);
  /* 显式定义2行 */
  grid-template-rows: 100px 100px;
  /* 隐式行高 */
  grid-auto-rows: 80px;
  /* 自动流方向 */
  grid-auto-flow: row; /* 默认值 */
}

7.2 网格线命名

.container {
  display: grid;
  grid-template-columns: [col1-start] 1fr [col1-end col2-start] 1fr [col2-end];
  grid-template-rows: [row1-start] 100px [row1-end row2-start] 100px [row2-end];
}

.item {
  grid-column: col1-start / col2-end;
}

7.3 响应式布局示例

.container {
  display: grid;
  grid-template-columns: 1fr;
  gap: 20px;
}

@media (min-width: 768px) {
  .container {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (min-width: 1024px) {
  .container {
    grid-template-columns: repeat(3, 1fr);
  }
}

八、浏览器支持

Grid布局在现代浏览器中得到广泛支持,包括:

  • Chrome 57+

  • Firefox 52+

  • Safari 10.1+

  • Edge 16+

  • 可以点击 《Can I Use》查看更多兼容性数据。

对于旧版浏览器,可以使用Flexbox或其他布局方式作为回退方案。

九、最佳实践

  • 从简单开始:先掌握基本的网格定义,再逐步学习高级特性。

  • 使用浏览器开发工具:现代浏览器提供了Grid布局的可视化工具,便于调试。

  • 结合Flexbox:Grid负责整体布局,Flexbox负责内部元素排列。

  • 语义化HTML:保持HTML结构清晰,使用适当的标签。

  • 响应式设计:使用媒体查询和相对单位(fr, %)创建自适应布局。

总结

Grid布局是CSS中最强大的布局系统之一,掌握它可以让你轻松创建各种复杂的网页布局,从简单的卡片网格到复杂的仪表板界面。通过不断练习和实践,你将能够充分利用Grid布局的优势,提升网页设计的效率和质量。