【学习记录】grid布局

308 阅读4分钟

grid ⽹格布局

CSS Grid 布局是一种强大的二维布局系统,允许开发者通过行和列的方式来创建复杂的网页布局。与传统的布局方式(如浮动、Flexbox)相比,Grid 布局更加灵活和直观,适合构建复杂的网格结构。

1. 基本概念

1.1 网格容器(Grid Container)

通过将元素的 display 属性设置为 gridinline-grid,可以将其定义为网格容器。

.container {
  display: grid;
}

1.2 网格项(Grid Items)

网格容器内的直接子元素称为网格项。

<div class="container">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
</div>

1.3 网格线(Grid Lines)

网格线是网格的行和列的分界线,用于定位网格项。

1.4 网格轨道(Grid Track)

网格轨道是相邻两条网格线之间的空间,分为行轨道和列轨道。

1.5 网格单元格(Grid Cell)

网格单元格是行和列的交叉区域,是网格布局的最小单位。

1.6 网格区域(Grid Area)

网格区域是由一个或多个网格单元格组成的矩形区域。

2. 定义网格

2.1 定义行和列

通过 grid-template-rowsgrid-template-columns 定义网格的行和列。

示例
.container {
  display: grid;
  grid-template-rows: 100px 200px; /* 两行,高度分别为 100px 和 200px */
  grid-template-columns: 1fr 2fr; /* 两列,宽度比例为 1:2 */
}
常用单位
  • fr:比例单位,表示剩余空间的分配比例。
  • pxemrem:固定单位。
  • auto:自动分配空间。
  • minmax(min, max):定义最小和最大尺寸。

2.2 定义网格区域

通过 grid-template-areas 定义网格区域,并通过 grid-area 将网格项分配到指定区域。

示例
.container {
  display: grid;
  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;
}

3. 网格项的定位

3.1 通过网格线定位

通过 grid-rowgrid-column 指定网格项的位置。

示例
.item {
  grid-row: 1 / 3; /* 从第 1 行到第 3 行 */
  grid-column: 2 / 4; /* 从第 2 列到第 4 列 */
}
简写
  • grid-row: start / end
  • grid-column: start / end

3.2 通过网格区域定位

通过 grid-area 将网格项分配到指定区域。

示例
.item {
  grid-area: header; /* 分配到 header 区域 */
}

4. 网格间距

通过 gap 属性设置网格项之间的间距。

示例
.container {
  gap: 10px; /* 行和列的间距均为 10px */
  row-gap: 10px; /* 行间距 */
  column-gap: 20px; /* 列间距 */
}

5. 对齐方式

5.1 网格容器对齐

通过 justify-contentalign-content 控制网格在容器内的对齐方式。

示例
.container {
  justify-content: center; /* 水平居中 */
  align-content: center; /* 垂直居中 */
}

5.2 网格项对齐

通过 justify-itemsalign-items 控制网格项在单元格内的对齐方式。

示例
.container {
  justify-items: center; /* 水平居中 */
  align-items: center; /* 垂直居中 */
}

5.3 单个网格项对齐

通过 justify-selfalign-self 控制单个网格项的对齐方式。

示例
.item {
  justify-self: start; /* 水平靠左 */
  align-self: end; /* 垂直靠下 */
}

6. 隐式网格

当网格项超出显式定义的网格时,浏览器会自动创建隐式网格。可以通过 grid-auto-rowsgrid-auto-columns 控制隐式网格的大小。

示例
.container {
  grid-auto-rows: 100px; /* 隐式行高度为 100px */
  grid-auto-columns: 1fr; /* 隐式列宽度为 1fr */
}

7. 重复和自动填充

7.1 repeat() 函数

用于重复定义行或列。

示例
.container {
  grid-template-columns: repeat(3, 1fr); /* 3 列,每列宽度为 1fr */
}

7.2 auto-fillauto-fit

用于自动填充或适应容器空间。

示例
.container {
  grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); /* 自动填充 */
}

8. 示例:完整网格布局

以下是一个完整的网格布局示例:

<div class="container">
  <div class="header">Header</div>
  <div class="sidebar">Sidebar</div>
  <div class="main">Main Content</div>
  <div class="footer">Footer</div>
</div>
.container {
  display: grid;
  grid-template-rows: 100px 1fr 100px;
  grid-template-columns: 200px 1fr;
  grid-template-areas:
    "header header"
    "sidebar main"
    "footer footer";
  gap: 10px;
}

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

9. 总结

CSS Grid 布局的核心概念包括:

  • 网格容器和网格项。
  • 网格线、网格轨道、网格单元格和网格区域。
  • 通过 grid-template-rowsgrid-template-columns 定义网格。
  • 通过 grid-rowgrid-columngrid-area 定位网格项。
  • 通过 gap 设置间距。
  • 通过 justify-contentalign-contentjustify-itemsalign-items 等属性控制对齐方式。

Grid 布局功能强大且灵活,适合构建复杂的网页布局!