grid布局介绍

348 阅读4分钟

在 CSS 中,Grid 布局是一种强大的二维布局系统,允许开发者通过行(rows)和列(columns)的组合创建复杂的网页布局。以下是 Grid 布局的核心概念、属性和实用示例:


一、Grid 布局的核心概念

概念描述
Grid 容器通过 display: griddisplay: inline-grid 定义的父元素。
Grid 项目Grid 容器的直接子元素。
网格线划分行和列的线(隐式或显式命名),用于定位项目。
网格轨道相邻网格线之间的空间(行或列)。
网格单元单个行和列交叉形成的区域(类似表格单元格)。
网格区域由多个网格单元组成的矩形区域,可命名并分配给项目。

二、Grid 容器属性

1. 定义行和列

属性作用示例
grid-template-columns定义列的数量和宽度。grid-template-columns: 100px 1fr 2fr; (固定 + 弹性比例)
grid-template-rows定义行的数量和高度。grid-template-rows: auto minmax(100px, 200px); (自动 + 最小/最大)
grid-template-areas通过命名区域定义布局结构。见下方示例

示例:命名区域布局

.container {
  display: grid;
  grid-template-columns: 1fr 3fr;
  grid-template-rows: 80px 1fr 60px;
  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; }

2. 间距与对齐

属性作用示例
gap设置行和列之间的间距(替代旧版 grid-gap)。gap: 20px;
row-gap / column-gap单独设置行或列的间距。row-gap: 10px;
justify-items控制所有项目在水平方向的对齐方式。justify-items: center;
align-items控制所有项目在垂直方向的对齐方式。align-items: stretch;
justify-content控制整个网格在容器内的水平对齐方式(当网格总宽度小于容器时)。justify-content: space-around;
align-content控制整个网格在容器内的垂直对齐方式。align-content: end;

3. 隐式轨道(自动填充)

属性作用
grid-auto-rows定义隐式行的高度(当项目超出显式定义的行时)。
grid-auto-columns定义隐式列的宽度。
grid-auto-flow控制自动放置项目的流向(默认 row,可选 columndense)。

示例:自动填充响应式列

.container {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: 15px;
}

三、Grid 项目属性

属性作用示例
grid-column指定项目占据的列范围(起始/结束网格线)。grid-column: 1 / 3; (跨第1到第3列)
grid-row指定项目占据的行范围。grid-row: span 2; (跨2行)
grid-area将项目分配到命名区域或指定行列范围。grid-area: header;grid-area: 1 / 1 / 3 / 3; (行起/列起/行终/列终)
justify-self覆盖单个项目的水平对齐方式。justify-self: end;
align-self覆盖单个项目的垂直对齐方式。align-self: start;

四、实用布局示例

1. 圣杯布局(Header, Sidebar, Main, Footer)

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

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

2. 响应式卡片网格

.card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 20px;
  padding: 20px;
}

3. 复杂覆盖布局

.item {
  grid-column: 1 / -1; /* 跨所有列 */
  grid-row: 2;         /* 放置在第二行 */
  z-index: 1;          /* 覆盖其他内容 */
}

五、Grid vs Flexbox

特性GridFlexbox
维度二维布局(行 + 列)一维布局(行 列)
控制方向同时定义行和列单一方向(flex-direction
内容驱动容器主导布局结构项目弹性填充剩余空间
适用场景整体页面布局、复杂网格组件内部布局、流式内容排列

六、浏览器支持与调试

  • 兼容性:所有现代浏览器均支持 Grid 布局(查看兼容性)。
  • 调试工具
    • 浏览器开发者工具中的 Grid 检查器(Chrome/Firefox)。
    • 可视化网格线(通过 grid 容器的 grid 属性)。

总结

CSS Grid 布局通过简洁的语法实现了强大的二维布局能力,适用于从简单卡片到复杂仪表盘的各类场景。掌握以下核心点即可快速上手:

  1. 容器定义display: grid + grid-template-*
  2. 轨道控制fr 单位、repeat()minmax()
  3. 项目定位grid-columngrid-rowgrid-area
  4. 响应式技巧auto-fillauto-fit 结合媒体查询。