Skip to content

Grid 布局

Grid 简介

CSS Grid(网格布局)是一种二维布局模型,可以同时处理行和列,实现复杂的布局效果。

基本概念

Grid 容器

css
.container {
  display: grid;
}

Grid 项目

Grid容器的直接子元素自动成为Grid项目。

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

容器属性

1. grid-template-columns(列定义)

css
.container {
  grid-template-columns: 100px 200px 300px;  /* 三列,固定宽度 */
  grid-template-columns: 1fr 2fr 3fr;        /* 三列,比例分配 */
  grid-template-columns: repeat(3, 1fr);       /* 三列,等宽 */
  grid-template-columns: 100px 1fr 2fr;        /* 混合使用 */
  grid-template-columns: auto-fit minmax(200px, 1fr); /* 自适应 */
}

2. grid-template-rows(行定义)

css
.container {
  grid-template-rows: 100px 200px 300px;  /* 三行,固定高度 */
  grid-template-rows: 1fr 2fr 3fr;        /* 三行,比例分配 */
  grid-template-rows: repeat(3, 1fr);     /* 三行,等高 */
  grid-template-rows: 100px 1fr 2fr;     /* 混合使用 */
}

3. grid-template-areas(区域定义)

css
.container {
  grid-template-areas:
    "header header header"
    "sidebar main main"
    "footer footer footer";
}

.header {
  grid-area: header;
}

.sidebar {
  grid-area: sidebar;
}

.main {
  grid-area: main;
}

.footer {
  grid-area: footer;
}

4. grid-template(简写)

css
.container {
  grid-template: 
    "header header header" 60px
    "sidebar main main" 1fr
    "footer footer footer" 60px
    / 200px 1fr 1fr;
}

5. grid-column-gap 和 grid-row-gap(间距)

css
.container {
  grid-column-gap: 20px;  /* 列间距 */
  grid-row-gap: 20px;     /* 行间距 */
}

6. grid-gap(简写)

css
.container {
  grid-gap: 20px;          /* 行列间距相同 */
  grid-gap: 20px 30px;    /* 行间距20px,列间距30px */
}

7. justify-items(水平对齐)

css
.container {
  justify-items: start;    /* 起点对齐 */
  justify-items: end;      /* 终点对齐 */
  justify-items: center;   /* 居中对齐 */
  justify-items: stretch;  /* 拉伸(默认) */
}

8. align-items(垂直对齐)

css
.container {
  align-items: start;     /* 起点对齐 */
  align-items: end;       /* 终点对齐 */
  align-items: center;    /* 居中对齐 */
  align-items: stretch;  /* 拉伸(默认) */
}

9. place-items(简写)

css
.container {
  place-items: center center;  /* 水平垂直居中 */
  place-items: start end;     /* 水平起点,垂直终点 */
}

10. justify-content(整体水平对齐)

css
.container {
  justify-content: start;       /* 起点对齐 */
  justify-content: end;         /* 终点对齐 */
  justify-content: center;      /* 居中对齐 */
  justify-content: stretch;     /* 拉伸 */
  justify-content: space-around; /* 环绕对齐 */
  justify-content: space-between; /* 两端对齐 */
  justify-content: space-evenly; /* 均匀对齐 */
}

11. align-content(整体垂直对齐)

css
.container {
  align-content: start;       /* 起点对齐 */
  align-content: end;         /* 终点对齐 */
  align-content: center;      /* 居中对齐 */
  align-content: stretch;     /* 拉伸 */
  align-content: space-around; /* 环绕对齐 */
  align-content: space-between; /* 两端对齐 */
  align-content: space-evenly; /* 均匀对齐 */
}

12. place-content(简写)

css
.container {
  place-content: center center;  /* 水平垂直居中 */
  place-content: start end;     /* 水平起点,垂直终点 */
}

项目属性

1. grid-column-start 和 grid-column-end(列位置)

css
.item {
  grid-column-start: 1;  /* 从第1列开始 */
  grid-column-end: 3;    /* 到第3列结束 */
}

2. grid-column(简写)

css
.item {
  grid-column: 1 / 3;    /* 从第1列到第3列 */
  grid-column: 1 / span 2; /* 从第1列开始,跨越2列 */
  grid-column: span 2;    /* 跨越2列 */
}

3. grid-row-start 和 grid-row-end(行位置)

css
.item {
  grid-row-start: 1;  /* 从第1行开始 */
  grid-row-end: 3;    /* 到第3行结束 */
}

4. grid-row(简写)

css
.item {
  grid-row: 1 / 3;    /* 从第1行到第3行 */
  grid-row: 1 / span 2; /* 从第1行开始,跨越2行 */
  grid-row: span 2;    /* 跨越2行 */
}

5. grid-area(区域)

css
.item {
  grid-area: header;  /* 使用区域名称 */
  grid-area: 1 / 1 / 2 / 3; /* 从第1行第1列到第2行第3列 */
}

6. justify-self(水平对齐)

css
.item {
  justify-self: start;    /* 起点对齐 */
  justify-self: end;      /* 终点对齐 */
  justify-self: center;   /* 居中对齐 */
  justify-self: stretch;  /* 拉伸 */
}

7. align-self(垂直对齐)

css
.item {
  align-self: start;    /* 起点对齐 */
  align-self: end;      /* 终点对齐 */
  align-self: center;   /* 居中对齐 */
  align-self: stretch;  /* 拉伸 */
}

8. place-self(简写)

css
.item {
  place-self: center center;  /* 水平垂直居中 */
  place-self: start end;     /* 水平起点,垂直终点 */
}

常用布局

1. 基本网格

css
.container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-gap: 20px;
}

2. 圣杯布局

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

.header {
  grid-area: header;
}

.sidebar {
  grid-area: sidebar;
}

.main {
  grid-area: main;
}

.footer {
  grid-area: footer;
}

3. 响应式网格

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

4. 不规则网格

css
.container {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-template-rows: repeat(2, 200px);
  grid-gap: 20px;
}

.item1 {
  grid-column: 1 / 3;
  grid-row: 1 / 2;
}

.item2 {
  grid-column: 3 / 5;
  grid-row: 1 / 2;
}

.item3 {
  grid-column: 1 / 2;
  grid-row: 2 / 3;
}

.item4 {
  grid-column: 2 / 4;
  grid-row: 2 / 3;
}

.item5 {
  grid-column: 4 / 5;
  grid-row: 2 / 3;
}

5. 图片网格

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

.item {
  position: relative;
  overflow: hidden;
}

.item img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

实际应用

1. 仪表盘布局

css
.dashboard {
  display: grid;
  grid-template-columns: 250px 1fr;
  grid-template-rows: 60px 1fr;
  grid-template-areas:
    "sidebar header"
    "sidebar main";
  min-height: 100vh;
}

.header {
  grid-area: header;
  background-color: #333;
  color: white;
  padding: 0 20px;
  display: flex;
  align-items: center;
}

.sidebar {
  grid-area: sidebar;
  background-color: #f5f5f5;
  padding: 20px;
}

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

2. 图片画廊

css
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  grid-auto-rows: 250px;
  grid-gap: 20px;
}

.gallery-item {
  position: relative;
  overflow: hidden;
}

.gallery-item img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.3s;
}

.gallery-item:hover img {
  transform: scale(1.1);
}

3. 卡片布局

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

.card {
  background-color: white;
  border-radius: 8px;
  box-shadow: 0 2px 5px rgba(0,0,0,0.1);
  overflow: hidden;
}

.card img {
  width: 100%;
  height: 200px;
  object-fit: cover;
}

.card-content {
  padding: 20px;
}

面试常见问题

1. Grid 和 Flexbox 的区别?

  • Grid: 二维布局,同时处理行和列
  • Flexbox: 一维布局,只处理行或列
css
/* Grid */
.container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
}

/* Flexbox */
.container {
  display: flex;
  flex-wrap: wrap;
}

2. grid-template-columns 的常用值?

css
grid-template-columns: 100px 200px 300px;  /* 固定宽度 */
grid-template-columns: 1fr 2fr 3fr;        /* 比例分配 */
grid-template-columns: repeat(3, 1fr);     /* 重复模式 */
grid-template-columns: auto-fit minmax(200px, 1fr); /* 自适应 */

3. grid-area 的作用是什么?

grid-area用于定义Grid项目的区域,可以使用区域名称或行列位置。

css
.item {
  grid-area: header;  /* 使用区域名称 */
  grid-area: 1 / 1 / 2 / 3; /* 使用行列位置 */
}

4. 如何实现响应式Grid布局?

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

5. justify-items 和 justify-content 的区别?

  • justify-items: 控制Grid项目在单元格内的水平对齐
  • justify-content: 控制整个Grid在容器内的水平对齐
css
.container {
  justify-items: center;  /* 项目居中 */
  justify-content: center; /* 整体居中 */
}

通过理解CSS Grid的各种属性和应用,可以轻松实现复杂的二维布局效果。

好好学习,天天向上