网站

CSS Grid

CSS Grid Layout | MDN

引入

Grid 用来处理二维布局,也就是同时控制行和列。

它很适合页面骨架、图片网格、后台面板、复杂卡片列表等布局。

正文

定义

定义

CSS Grid 是二维网格布局模型,用于把容器划分为行和列,并把子元素放入指定的网格区域中。

Flexbox 更像是一行或一列的弹性排列。

Grid 更像是先画好表格,再把内容放到不同格子里。

基础语法

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

这会创建一个三列网格,每列宽度平均。

<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
</div>
.grid {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 12px;
}

常见概念

概念说明
网格容器设置了 display: grid; 的元素
网格项目网格容器的直接子元素
网格线行和列的分割线
网格轨道一行或一列
网格单元格行列交叉形成的格子
网格区域一个或多个单元格组成的区域

容器常见属性

属性作用
display: grid;创建 grid 容器
grid-template-columns定义列
grid-template-rows定义行
gap设置行列间距
justify-items控制项目在单元格内的水平对齐
align-items控制项目在单元格内的垂直对齐
grid-template-areas使用命名区域定义布局

定义列

.grid {
  display: grid;
  grid-template-columns: 200px 1fr 1fr;
}

这里第一列是固定 200px,后两列平均分配剩余空间。

fr 单位

fr 是 Grid 中常见的弹性单位,表示可用空间的一份。

.grid {
  display: grid;
  grid-template-columns: 1fr 2fr;
}

这里第二列会是第一列的两倍。

repeat()

repeat() 可以减少重复写法。

.grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
}

这等同于:

.grid {
  grid-template-columns: 1fr 1fr 1fr;
}

minmax()

minmax() 用来设置一个范围。

.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 16px;
}

这个写法很适合响应式卡片列表。

每张卡片最小 240px,空间足够时自动分配剩余宽度。

行列间距 gap

.grid {
  display: grid;
  gap: 16px;
}

也可以分别设置行间距和列间距。

.grid {
  row-gap: 16px;
  column-gap: 24px;
}

项目位置

可以让某个项目跨多列或多行。

.featured {
  grid-column: span 2;
}

.featured 会横跨两列。

也可以指定起止网格线。

.sidebar {
  grid-column: 1 / 2;
}
 
.content {
  grid-column: 2 / 4;
}

命名区域 grid-template-areas

命名区域适合页面骨架布局。

<div class="page">
  <header class="header">头部</header>
  <aside class="sidebar">侧边栏</aside>
  <main class="main">主体</main>
  <footer class="footer">底部</footer>
</div>
.page {
  display: grid;
  grid-template-columns: 200px 1fr;
  grid-template-areas:
    "header header"
    "sidebar main"
    "footer footer";
  gap: 16px;
}
 
.header {
  grid-area: header;
}
 
.sidebar {
  grid-area: sidebar;
}
 
.main {
  grid-area: main;
}
 
.footer {
  grid-area: footer;
}

这种写法能很直观地看出页面结构。

对齐方式

.grid {
  display: grid;
  justify-items: center;
  align-items: center;
}

常见对齐属性:

属性作用
justify-items控制项目在单元格内的水平方向对齐
align-items控制项目在单元格内的垂直方向对齐
justify-content控制整个网格在容器内的水平方向位置
align-content控制整个网格在容器内的垂直方向位置

例子

响应式卡片网格

<div class="cards">
  <article class="card">卡片 1</article>
  <article class="card">卡片 2</article>
  <article class="card">卡片 3</article>
</div>
.cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 16px;
}
 
.card {
  padding: 16px;
  border: 1px solid #dddddd;
}

这个布局会根据容器宽度自动调整列数。

后台页面布局

.dashboard {
  display: grid;
  grid-template-columns: 240px 1fr;
  grid-template-rows: auto 1fr;
  gap: 16px;
}
 
.dashboard-header {
  grid-column: 1 / 3;
}

头部横跨两列,下面是侧边栏和主体内容。

特点

  • Grid 适合二维布局
  • 可以同时控制行和列
  • fr 用于按比例分配剩余空间
  • repeat() 可以简化重复列或行
  • minmax() 很适合响应式网格
  • grid-template-areas 适合页面区域布局

注意事项

  • Grid 容器的直接子元素才是 grid 项目
  • 简单的一行排列不一定要用 Grid,Flexbox 可能更直接
  • 命名区域中的每一行字符串列数要一致
  • Grid 很适合整体布局,Flexbox 很适合局部一维对齐

理解

可以把 Grid 理解为先在页面上画出行和列,再把元素放进格子里。

它解决的是二维布局问题,特别适合需要同时管理横向和纵向关系的页面。

如果只是让几个元素排成一行,Flexbox 更轻;如果要做完整页面骨架或卡片网格,Grid 更清楚。

引出

学完 Grid 后,可以结合 CSS 响应式设计,做出能适配不同屏幕宽度的页面布局。