轩辕李的博客 轩辕李的博客
首页
  • Java
  • Spring
  • 其他语言
  • 工具
  • JavaScript
  • TypeScript
  • Node.js
  • Vue.js
  • 前端工程化
  • 浏览器与Web API
  • 分布式
  • 代码质量管理
  • 基础
  • 操作系统
  • 计算机网络
  • 编程范式
  • 安全
  • 中间件
  • 心得
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

轩辕李

勇猛精进,星辰大海
首页
  • Java
  • Spring
  • 其他语言
  • 工具
  • JavaScript
  • TypeScript
  • Node.js
  • Vue.js
  • 前端工程化
  • 浏览器与Web API
  • 分布式
  • 代码质量管理
  • 基础
  • 操作系统
  • 计算机网络
  • 编程范式
  • 安全
  • 中间件
  • 心得
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • JavaScript

  • TypeScript

  • Node.js

  • Vue.js

  • 工程化

  • 浏览器与Web API

    • HTML基础-语义化标签与文档结构
    • HTML基础-文本与排版标签
    • HTML基础-列表与表格
    • HTML表单-Input类型详解
    • HTML表单-表单元素与验证
    • HTML交互-多媒体元素
    • HTML工程化-模板与组件化
    • HTML工程化-性能优化
    • CSS基础-选择器与优先级
    • CSS基础-盒模型与布局基础
    • CSS基础-单位与颜色系统
    • CSS基础-文本与字体
    • CSS基础-背景、列表与表格样式
    • CSS布局-Flexbox完全指南
    • CSS布局-Grid网格布局
      • 一、Grid 基础概念
        • 1.1 什么是 Grid
        • 1.2 核心术语
        • 1.3 基本使用
      • 二、容器属性
        • 2.1 grid-template-columns / grid-template-rows (定义行列)
        • 2.2 grid-template-areas (命名区域)
        • 2.3 grid-template (简写)
        • 2.4 gap / row-gap / column-gap (间距)
        • 2.5 justify-items / align-items (项目对齐)
        • 2.6 justify-content / align-content (内容对齐)
        • 2.7 grid-auto-columns / grid-auto-rows (自动轨道)
        • 2.8 grid-auto-flow (自动流)
      • 三、项目属性
        • 3.1 grid-column-start / grid-column-end / grid-row-start / grid-row-end (网格线定位)
        • 3.2 grid-column / grid-row (简写)
        • 3.3 grid-area (区域定位)
        • 3.4 justify-self / align-self (单独对齐)
      • 四、fr 单位和函数
        • 4.1 fr 单位
        • 4.2 repeat() 函数
        • 4.3 minmax() 函数
        • 4.4 auto-fit / auto-fill
      • 五、实战案例
        • 5.1 响应式卡片网格
        • 5.2 圣杯布局
        • 5.3 产品展示页面
        • 5.4 仪表盘布局
      • 六、常见布局模式
        • 6.1 基本网格布局
        • 6.2 侧边栏布局
        • 6.3 卡片网格
        • 6.4 表单布局
      • 七、最佳实践
        • 7.1 何时使用 Grid
        • 7.2 Grid 与 Flexbox 结合
        • 7.3 响应式设计
        • 7.4 性能优化
        • 7.5 可访问性
      • 八、浏览器兼容性
      • 九、总结
    • CSS布局-响应式设计实践
    • CSS进阶-动画与过渡
    • CSS进阶-渐变与阴影效果
    • CSS进阶-Transform与3D变换
    • CSS进阶-滤镜与混合模式
    • 现代CSS-CSS预处理器对比
    • 现代CSS-CSS-in-JS方案
    • 现代CSS-原子化CSS与Tailwind
    • CSS工程化-架构与规范
    • CSS工程化-性能优化
    • CSS工程化-PostCSS实战指南
    • Web API基础-DOM操作完全指南
    • Web API基础-事件处理与委托
    • Web API基础-BOM与浏览器环境
    • Web API存储-客户端存储方案
    • Web API网络-HTTP请求详解
    • Web API网络-实时通信方案
    • Web API交互-用户体验增强
    • HTML&CSS历代版本新特性
  • 前端
  • 浏览器与Web API
轩辕李
2019-05-25
目录

CSS布局-Grid网格布局

CSS Grid(网格布局)是二维布局系统,专门用于创建复杂的网页布局。与Flexbox的一维布局不同,Grid可以同时控制行和列,是现代CSS布局的强大工具。

本文将全面介绍Grid布局的概念、属性和实战应用,帮助你掌握这一先进的布局技术。

# 一、Grid 基础概念

# 1.1 什么是 Grid

Grid Layout(网格布局)是CSS中用于创建二维布局的系统,可以同时处理行(rows)和列(columns)。

主要特点:

  • 二维布局(同时控制行和列)
  • 强大的对齐和分布控制
  • 灵活的网格轨道(grid tracks)
  • 支持重叠和层级

# 1.2 核心术语

┌─────────────────────────────────────────────┐
│  Grid Container (网格容器)                  │
│  ┌──────────┬──────────┬──────────┐        │
│  │ Grid     │ Grid     │ Grid     │        │
│  │ Cell     │ Cell     │ Cell     │ ← 行   │
│  ├──────────┼──────────┼──────────┤        │
│  │ Grid     │ Grid     │ Grid     │        │
│  │ Cell     │ Cell     │ Cell     │        │
│  └──────────┴──────────┴──────────┘        │
│           ↑                             │
│           列                              │
└─────────────────────────────────────────────┘
  • Grid Container(网格容器):设置了 display: grid 或 display: inline-grid 的元素
  • Grid Item(网格项目):容器的直接子元素
  • Grid Line(网格线):构成网格结构的分界线
  • Grid Track(网格轨道):两条相邻网格线之间的空间(行或列)
  • Grid Cell(网格单元格):四个网格线包围的最小单位
  • Grid Area(网格区域):由四个网格线定义的矩形区域

# 1.3 基本使用

.container {
  display: grid; /* 块级网格容器 */
}

.inline-container {
  display: inline-grid; /* 行内网格容器 */
}

# 二、容器属性

# 2.1 grid-template-columns / grid-template-rows (定义行列)

定义网格的列和行的大小。

.container {
  /* 固定大小 */
  grid-template-columns: 100px 200px 150px;
  grid-template-rows: 50px 100px;
  
  /* 使用fr单位 */
  grid-template-columns: 1fr 2fr 1fr;
  grid-template-rows: 1fr 1fr;
  
  /* 混合单位 */
  grid-template-columns: 100px 1fr 2fr;
  
  /* 重复模式 */
  grid-template-columns: repeat(3, 1fr);
  grid-template-columns: repeat(4, 100px);
  
  /* 自动填充 */
  grid-template-columns: repeat(auto-fill, 200px);
}
<html>
  <div class="grid-demo-a1b2c">
    <div class="demo-section-a1b2c">
      <div class="demo-label-a1b2c">固定像素值</div>
      <div class="grid-container-a1b2c fixed-a1b2c">
        <div class="grid-item-a1b2c item1-a1b2c">1</div>
        <div class="grid-item-a1b2c item2-a1b2c">2</div>
        <div class="grid-item-a1b2c item3-a1b2c">3</div>
        <div class="grid-item-a1b2c item4-a1b2c">4</div>
        <div class="grid-item-a1b2c item5-a1b2c">5</div>
        <div class="grid-item-a1b2c item6-a1b2c">6</div>
      </div>
    </div>
    
    <div class="demo-section-a1b2c">
      <div class="demo-label-a1b2c">fr单位 (1fr 2fr 1fr)</div>
      <div class="grid-container-a1b2c fr-a1b2c">
        <div class="grid-item-a1b2c item1-a1b2c">1</div>
        <div class="grid-item-a1b2c item2-a1b2c">2</div>
        <div class="grid-item-a1b2c item3-a1b2c">3</div>
        <div class="grid-item-a1b2c item4-a1b2c">4</div>
        <div class="grid-item-a1b2c item5-a1b2c">5</div>
        <div class="grid-item-a1b2c item6-a1b2c">6</div>
      </div>
    </div>
    
    <div class="demo-section-a1b2c">
      <div class="demo-label-a1b2c">repeat(3, 1fr)</div>
      <div class="grid-container-a1b2c repeat-a1b2c">
        <div class="grid-item-a1b2c item1-a1b2c">1</div>
        <div class="grid-item-a1b2c item2-a1b2c">2</div>
        <div class="grid-item-a1b2c item3-a1b2c">3</div>
        <div class="grid-item-a1b2c item4-a1b2c">4</div>
        <div class="grid-item-a1b2c item5-a1b2c">5</div>
        <div class="grid-item-a1b2c item6-a1b2c">6</div>
      </div>
    </div>
  </div>
</html>
<style>
  .grid-demo-a1b2c .demo-section-a1b2c {
    margin-bottom: 20px;
  }
  
  .grid-demo-a1b2c .demo-label-a1b2c {
    font-weight: bold;
    margin-bottom: 10px;
    color: #333;
  }
  
  .grid-container-a1b2c {
    display: grid;
    gap: 10px;
    background: #e3f2fd;
    padding: 15px;
    border: 2px solid #2196f3;
  }
  
  .fixed-a1b2c {
    grid-template-columns: 80px 120px 80px;
    grid-template-rows: 60px 60px;
  }
  
  .fr-a1b2c {
    grid-template-columns: 1fr 2fr 1fr;
    grid-template-rows: 1fr 1fr;
    height: 150px;
  }
  
  .repeat-a1b2c {
    grid-template-columns: repeat(3, 1fr);
    grid-template-rows: repeat(2, 1fr);
    height: 150px;
  }
  
  .grid-item-a1b2c {
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 4px;
    font-weight: bold;
    color: white;
  }
  
  .item1-a1b2c, .item4-a1b2c { background: #2196f3; }
  .item2-a1b2c, .item5-a1b2c { background: #ff5722; }
  .item3-a1b2c, .item6-a1b2c { background: #4caf50; }
</style>

# 2.2 grid-template-areas (命名区域)

通过命名区域来定义网格布局。

.container {
  grid-template-columns: 1fr 2fr 1fr;
  grid-template-rows: 50px 1fr 50px;
  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; }
<html>
  <div class="areas-demo-c3d4e">
    <div class="areas-container-c3d4e">
      <div class="areas-header-c3d4e">Header</div>
      <div class="areas-sidebar-c3d4e">Sidebar</div>
      <div class="areas-main-c3d4e">Main Content</div>
      <div class="areas-footer-c3d4e">Footer</div>
    </div>
  </div>
</html>
<style>
  .areas-demo-c3d4e {
    padding: 15px;
    background: #f5f5f5;
  }
  
  .areas-container-c3d4e {
    display: grid;
    grid-template-columns: 1fr 3fr;
    grid-template-rows: 50px 1fr 50px;
    grid-template-areas: 
      "header header"
      "sidebar main"
      "footer footer";
    gap: 10px;
    height: 250px;
  }
  
  .areas-header-c3d4e {
    grid-area: header;
    background: #333;
    color: white;
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: bold;
    border-radius: 4px;
  }
  
  .areas-sidebar-c3d4e {
    grid-area: sidebar;
    background: #e3f2fd;
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: bold;
    border-radius: 4px;
  }
  
  .areas-main-c3d4e {
    grid-area: main;
    background: white;
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: bold;
    border: 2px dashed #ddd;
    border-radius: 4px;
  }
  
  .areas-footer-c3d4e {
    grid-area: footer;
    background: #333;
    color: white;
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: bold;
    border-radius: 4px;
  }
</style>

# 2.3 grid-template (简写)

grid-template-columns、grid-template-rows 和 grid-template-areas 的简写。

.container {
  /* 分别定义行列 */
  grid-template: 
    50px 1fr 50px / 
    1fr 3fr 1fr;
    
  /* 包含命名区域 */
  grid-template: 
    "header header header" 50px
    "sidebar main main" 1fr
    "footer footer footer" 50px
    / 1fr 3fr 1fr;
}

# 2.4 gap / row-gap / column-gap (间距)

设置网格线之间的间距。

.container {
  gap: 20px;           /* 行列间距相同 */
  gap: 10px 20px;      /* 行间距 列间距 */
  row-gap: 10px;       /* 只设置行间距 */
  column-gap: 20px;    /* 只设置列间距 */
}
<html>
  <div class="gap-demo-e5f6g">
    <div class="gap-section-e5f6g">
      <div class="gap-label-e5f6g">无间距</div>
      <div class="gap-container-e5f6g no-gap-e5f6g">
        <div class="gap-item-e5f6g item1-e5f6g">1</div>
        <div class="gap-item-e5f6g item2-e5f6g">2</div>
        <div class="gap-item-e5f6g item3-e5f6g">3</div>
        <div class="gap-item-e5f6g item4-e5f6g">4</div>
      </div>
    </div>
    
    <div class="gap-section-e5f6g">
      <div class="gap-label-e5f6g">gap: 10px</div>
      <div class="gap-container-e5f6g gap-10-e5f6g">
        <div class="gap-item-e5f6g item1-e5f6g">1</div>
        <div class="gap-item-e5f6g item2-e5f6g">2</div>
        <div class="gap-item-e5f6g item3-e5f6g">3</div>
        <div class="gap-item-e5f6g item4-e5f6g">4</div>
      </div>
    </div>
    
    <div class="gap-section-e5f6g">
      <div class="gap-label-e5f6g">gap: 5px 20px</div>
      <div class="gap-container-e5f6g gap-custom-e5f6g">
        <div class="gap-item-e5f6g item1-e5f6g">1</div>
        <div class="gap-item-e5f6g item2-e5f6g">2</div>
        <div class="gap-item-e5f6g item3-e5f6g">3</div>
        <div class="gap-item-e5f6g item4-e5f6g">4</div>
      </div>
    </div>
  </div>
</html>
<style>
  .gap-demo-e5f6g .gap-section-e5f6g {
    margin-bottom: 20px;
  }
  
  .gap-demo-e5f6g .gap-label-e5f6g {
    font-weight: bold;
    margin-bottom: 10px;
    color: #333;
  }
  
  .gap-container-e5f6g {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    grid-template-rows: repeat(2, 1fr);
    background: #e3f2fd;
    padding: 15px;
    border: 2px solid #2196f3;
    height: 150px;
  }
  
  .no-gap-e5f6g { gap: 0; }
  .gap-10-e5f6g { gap: 10px; }
  .gap-custom-e5f6g { gap: 5px 20px; }
  
  .gap-item-e5f6g {
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 4px;
    font-weight: bold;
    color: white;
  }
  
  .item1-e5f6g { background: #2196f3; }
  .item2-e5f6g { background: #ff5722; }
  .item3-e5f6g { background: #4caf50; }
  .item4-e5f6g { background: #9c27b0; }
</style>

# 2.5 justify-items / align-items (项目对齐)

控制网格项目在单元格内的对齐方式。

.container {
  justify-items: start | end | center | stretch; /* 水平对齐 */
  align-items: start | end | center | stretch;   /* 垂直对齐 */
}
<html>
  <div class="items-demo-h7i8j">
    <div class="items-section-h7i8j">
      <div class="items-label-h7i8j">stretch (默认)</div>
      <div class="items-container-h7i8j stretch-h7i8j">
        <div class="items-item-h7i8j item1-h7i8j">1</div>
        <div class="items-item-h7i8j item2-h7i8j" style="font-size: 20px;">2</div>
        <div class="items-item-h7i8j item3-h7i8j">3</div>
        <div class="items-item-h7i8j item4-h7i8j" style="font-size: 18px;">4</div>
      </div>
    </div>
    
    <div class="items-section-h7i8j">
      <div class="items-label-h7i8j">center</div>
      <div class="items-container-h7i8j center-h7i8j">
        <div class="items-item-h7i8j item1-h7i8j">1</div>
        <div class="items-item-h7i8j item2-h7i8j" style="font-size: 20px;">2</div>
        <div class="items-item-h7i8j item3-h7i8j">3</div>
        <div class="items-item-h7i8j item4-h7i8j" style="font-size: 18px;">4</div>
      </div>
    </div>
  </div>
</html>
<style>
  .items-demo-h7i8j .items-section-h7i8j {
    margin-bottom: 20px;
  }
  
  .items-demo-h7i8j .items-label-h7i8j {
    font-weight: bold;
    margin-bottom: 10px;
    color: #333;
  }
  
  .items-container-h7i8j {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    grid-template-rows: repeat(2, 80px);
    gap: 10px;
    background: #e3f2fd;
    padding: 15px;
    border: 2px solid #2196f3;
  }
  
  .stretch-h7i8j {
    justify-items: stretch;
    align-items: stretch;
  }
  
  .center-h7i8j {
    justify-items: center;
    align-items: center;
  }
  
  .items-item-h7i8j {
    border-radius: 4px;
    font-weight: bold;
    color: white;
    padding: 10px;
    text-align: center;
  }
  
  .item1-h7i8j { background: #2196f3; }
  .item2-h7i8j { background: #ff5722; }
  .item3-h7i8j { background: #4caf50; }
  .item4-h7i8j { background: #9c27b0; }
</style>

# 2.6 justify-content / align-content (内容对齐)

控制整个网格在容器内的对齐方式。

.container {
  justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
  align-content: start | end | center | stretch | space-around | space-between | space-evenly;
}
<html>
  <div class="content-demo-k9l0m">
    <div class="content-section-k9l0m">
      <div class="content-label-k9l0m">start</div>
      <div class="content-container-k9l0m start-k9l0m">
        <div class="content-item-k9l0m item1-k9l0m">1</div>
        <div class="content-item-k9l0m item2-k9l0m">2</div>
        <div class="content-item-k9l0m item3-k9l0m">3</div>
      </div>
    </div>
    
    <div class="content-section-k9l0m">
      <div class="content-label-k9l0m">center</div>
      <div class="content-container-k9l0m center-k9l0m">
        <div class="content-item-k9l0m item1-k9l0m">1</div>
        <div class="content-item-k9l0m item2-k9l0m">2</div>
        <div class="content-item-k9l0m item3-k9l0m">3</div>
      </div>
    </div>
    
    <div class="content-section-k9l0m">
      <div class="content-label-k9l0m">space-between</div>
      <div class="content-container-k9l0m space-between-k9l0m">
        <div class="content-item-k9l0m item1-k9l0m">1</div>
        <div class="content-item-k9l0m item2-k9l0m">2</div>
        <div class="content-item-k9l0m item3-k9l0m">3</div>
      </div>
    </div>
  </div>
</html>
<style>
  .content-demo-k9l0m .content-section-k9l0m {
    margin-bottom: 20px;
  }
  
  .content-demo-k9l0m .content-label-k9l0m {
    font-weight: bold;
    margin-bottom: 10px;
    color: #333;
  }
  
  .content-container-k9l0m {
    display: grid;
    grid-template-columns: repeat(3, 80px);
    grid-template-rows: 60px;
    background: #e3f2fd;
    padding: 15px;
    border: 2px solid #2196f3;
    height: 120px;
    width: 300px;
  }
  
  .start-k9l0m {
    justify-content: start;
  }
  
  .center-k9l0m {
    justify-content: center;
  }
  
  .space-between-k9l0m {
    justify-content: space-between;
  }
  
  .content-item-k9l0m {
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 4px;
    font-weight: bold;
    color: white;
  }
  
  .item1-k9l0m { background: #2196f3; }
  .item2-k9l0m { background: #ff5722; }
  .item3-k9l0m { background: #4caf50; }
</style>

# 2.7 grid-auto-columns / grid-auto-rows (自动轨道)

定义隐式网格轨道的大小。

.container {
  grid-auto-columns: 100px;  /* 隐式列轨道大小 */
  grid-auto-rows: 50px;      /* 隐式行轨道大小 */
  
  /* 使用fr单位 */
  grid-auto-columns: 1fr;
  grid-auto-rows: 1fr;
}

# 2.8 grid-auto-flow (自动流)

控制自动放置算法如何工作。

.container {
  grid-auto-flow: row;        /* 默认:先行后列 */
  grid-auto-flow: column;     /* 先列后行 */
  grid-auto-flow: row dense;  /* 紧凑填充 */
  grid-auto-flow: column dense;
}
<html>
  <div class="flow-demo-n1o2p">
    <div class="flow-section-n1o2p">
      <div class="flow-label-n1o2p">row (默认)</div>
      <div class="flow-container-n1o2p row-n1o2p">
        <div class="flow-item-n1o2p item1-n1o2p">1</div>
        <div class="flow-item-n1o2p item2-n1o2p">2</div>
        <div class="flow-item-n1o2p item3-n1o2p">3</div>
        <div class="flow-item-n1o2p item4-n1o2p">4</div>
        <div class="flow-item-n1o2p item5-n1o2p">5</div>
      </div>
    </div>
    
    <div class="flow-section-n1o2p">
      <div class="flow-label-n1o2p">column</div>
      <div class="flow-container-n1o2p column-n1o2p">
        <div class="flow-item-n1o2p item1-n1o2p">1</div>
        <div class="flow-item-n1o2p item2-n1o2p">2</div>
        <div class="flow-item-n1o2p item3-n1o2p">3</div>
        <div class="flow-item-n1o2p item4-n1o2p">4</div>
        <div class="flow-item-n1o2p item5-n1o2p">5</div>
      </div>
    </div>
  </div>
</html>
<style>
  .flow-demo-n1o2p .flow-section-n1o2p {
    margin-bottom: 20px;
  }
  
  .flow-demo-n1o2p .flow-label-n1o2p {
    font-weight: bold;
    margin-bottom: 10px;
    color: #333;
  }
  
  .flow-container-n1o2p {
    display: grid;
    grid-template-columns: repeat(3, 60px);
    grid-template-rows: repeat(2, 60px);
    gap: 5px;
    background: #e3f2fd;
    padding: 15px;
    border: 2px solid #2196f3;
  }
  
  .row-n1o2p {
    grid-auto-flow: row;
  }
  
  .column-n1o2p {
    grid-auto-flow: column;
  }
  
  .flow-item-n1o2p {
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 4px;
    font-weight: bold;
    color: white;
  }
  
  .item1-n1o2p { background: #2196f3; }
  .item2-n1o2p { background: #ff5722; }
  .item3-n1o2p { background: #4caf50; }
  .item4-n1o2p { background: #9c27b0; }
  .item5-n1o2p { background: #ff9800; }
</style>

# 三、项目属性

# 3.1 grid-column-start / grid-column-end / grid-row-start / grid-row-end (网格线定位)

通过网格线来定位项目。

.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 3;
}
<html>
  <div class="lines-demo-q3r4s">
    <div class="lines-container-q3r4s">
      <div class="lines-item-q3r4s item1-q3r4s">1<br>(1/3, 1/2)</div>
      <div class="lines-item-q3r4s item2-q3r4s">2<br>(3/4, 1/3)</div>
      <div class="lines-item-q3r4s item3-q3r4s">3<br>(1/2, 2/4)</div>
      <div class="lines-item-q3r4s item4-q3r4s">4<br>(2/4, 3/4)</div>
    </div>
  </div>
</html>
<style>
  .lines-demo-q3r4s {
    padding: 15px;
    background: #f5f5f5;
  }
  
  .lines-container-q3r4s {
    display: grid;
    grid-template-columns: repeat(3, 100px);
    grid-template-rows: repeat(3, 60px);
    gap: 5px;
    background: #e3f2fd;
    padding: 15px;
    border: 2px solid #2196f3;
  }
  
  .item1-q3r4s {
    grid-column: 1 / 3;
    grid-row: 1 / 2;
    background: #2196f3;
    color: white;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 4px;
    font-weight: bold;
    text-align: center;
  }
  
  .item2-q3r4s {
    grid-column: 3 / 4;
    grid-row: 1 / 3;
    background: #ff5722;
    color: white;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 4px;
    font-weight: bold;
    text-align: center;
  }
  
  .item3-q3r4s {
    grid-column: 1 / 2;
    grid-row: 2 / 4;
    background: #4caf50;
    color: white;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 4px;
    font-weight: bold;
    text-align: center;
  }
  
  .item4-q3r4s {
    grid-column: 2 / 4;
    grid-row: 3 / 4;
    background: #9c27b0;
    color: white;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 4px;
    font-weight: bold;
    text-align: center;
  }
</style>

# 3.2 grid-column / grid-row (简写)

grid-column-start/grid-column-end 和 grid-row-start/grid-row-end 的简写。

.item {
  grid-column: 1 / 3;        /* 从第1条线到第3条线 */
  grid-column: 1 / span 2;   /* 从第1条线开始,跨越2个轨道 */
  grid-row: 2 / 4;
  grid-row: 2 / span 2;
}

# 3.3 grid-area (区域定位)

grid-row-start/grid-column-start/grid-row-end/grid-column-end 的简写。

.item {
  /* grid-area: row-start / column-start / row-end / column-end */
  grid-area: 1 / 2 / 3 / 4;
  
  /* 使用命名区域 */
  grid-area: header;
}

# 3.4 justify-self / align-self (单独对齐)

允许单个项目有与其他项目不同的对齐方式。

.item {
  justify-self: start | end | center | stretch; /* 水平对齐 */
  align-self: start | end | center | stretch;   /* 垂直对齐 */
}
<html>
  <div class="self-demo-t5u6v">
    <div class="self-container-t5u6v">
      <div class="self-item-t5u6v item1-t5u6v">默认对齐</div>
      <div class="self-item-t5u6v item2-t5u6v" style="justify-self: start; align-self: start;">start</div>
      <div class="self-item-t5u6v item3-t5u6v" style="justify-self: end; align-self: end;">end</div>
      <div class="self-item-t5u6v item4-t5u6v" style="justify-self: center; align-self: center;">center</div>
    </div>
  </div>
</html>
<style>
  .self-demo-t5u6v {
    padding: 15px;
    background: #f5f5f5;
  }
  
  .self-container-t5u6v {
    display: grid;
    grid-template-columns: repeat(2, 120px);
    grid-template-rows: repeat(2, 100px);
    gap: 10px;
    background: #e3f2fd;
    padding: 15px;
    border: 2px solid #2196f3;
    justify-items: stretch;
    align-items: stretch;
  }
  
  .self-item-t5u6v {
    border-radius: 4px;
    font-weight: bold;
    color: white;
    padding: 10px;
    display: flex;
    align-items: center;
    justify-content: center;
    text-align: center;
  }
  
  .item1-t5u6v { background: #2196f3; }
  .item2-t5u6v { background: #ff5722; }
  .item3-t5u6v { background: #4caf50; }
  .item4-t5u6v { background: #9c27b0; }
</style>

# 四、fr 单位和函数

# 4.1 fr 单位

fr(fraction)单位代表网格容器中可用空间的一部分。

.container {
  /* 1fr + 2fr + 1fr = 4fr 总空间 */
  grid-template-columns: 1fr 2fr 1fr;
  
  /* 混合单位 */
  grid-template-columns: 100px 1fr 2fr;
  
  /* 最小值 */
  grid-template-columns: minmax(100px, 1fr) 2fr;
}

# 4.2 repeat() 函数

重复定义网格轨道。

.container {
  grid-template-columns: repeat(3, 1fr);           /* 3个1fr列 */
  grid-template-columns: repeat(4, 100px);         /* 4个100px列 */
  grid-template-columns: repeat(auto-fill, 200px); /* 自动填充 */
  grid-template-columns: repeat(2, 1fr 2fr);       /* 重复模式 */
}

# 4.3 minmax() 函数

定义轨道大小的范围。

.container {
  grid-template-columns: minmax(100px, 1fr) 2fr;
  grid-template-columns: repeat(3, minmax(150px, 1fr));
}

# 4.4 auto-fit / auto-fill

自动适应可用空间。

.container {
  /* auto-fill: 尽可能多地创建轨道 */
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  
  /* auto-fit: 创建轨道后拉伸填满容器 */
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
<html>
  <div class="functions-demo-w7x8y">
    <div class="functions-section-w7x8y">
      <div class="functions-label-w7x8y">auto-fill (尽可能多轨道)</div>
      <div class="functions-container-w7x8y auto-fill-w7x8y">
        <div class="functions-item-w7x8y">1</div>
        <div class="functions-item-w7x8y">2</div>
        <div class="functions-item-w7x8y">3</div>
        <div class="functions-item-w7x8y">4</div>
        <div class="functions-item-w7x8y">5</div>
      </div>
    </div>
    
    <div class="functions-section-w7x8y">
      <div class="functions-label-w7x8y">auto-fit (拉伸填满)</div>
      <div class="functions-container-w7x8y auto-fit-w7x8y">
        <div class="functions-item-w7x8y">1</div>
        <div class="functions-item-w7x8y">2</div>
        <div class="functions-item-w7x8y">3</div>
        <div class="functions-item-w7x8y">4</div>
        <div class="functions-item-w7x8y">5</div>
      </div>
    </div>
    
    <div class="functions-section-w7x8y">
      <div class="functions-label-w7x8y">minmax(100px, 1fr)</div>
      <div class="functions-container-w7x8y minmax-w7x8y">
        <div class="functions-item-w7x8y">1</div>
        <div class="functions-item-w7x8y">2</div>
        <div class="functions-item-w7x8y">3</div>
      </div>
    </div>
  </div>
</html>
<style>
  .functions-demo-w7x8y .functions-section-w7x8y {
    margin-bottom: 20px;
  }
  
  .functions-demo-w7x8y .functions-label-w7x8y {
    font-weight: bold;
    margin-bottom: 10px;
    color: #333;
  }
  
  .functions-container-w7x8y {
    display: grid;
    gap: 10px;
    background: #e3f2fd;
    padding: 15px;
    border: 2px solid #2196f3;
  }
  
  .auto-fill-w7x8y {
    grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
  }
  
  .auto-fit-w7x8y {
    grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
  }
  
  .minmax-w7x8y {
    grid-template-columns: repeat(3, minmax(80px, 1fr));
  }
  
  .functions-item-w7x8y {
    background: #2196f3;
    color: white;
    padding: 20px;
    border-radius: 4px;
    font-weight: bold;
    text-align: center;
  }
</style>

# 五、实战案例

# 5.1 响应式卡片网格

<html>
  <div class="card-grid-demo-z9a0b">
    <div class="card-grid-container-z9a0b">
      <div class="card-grid-item-z9a0b">
        <div class="card-grid-icon-z9a0b">📱</div>
        <h3 class="card-grid-title-z9a0b">响应式设计</h3>
        <p class="card-grid-desc-z9a0b">适配各种设备屏幕</p>
      </div>
      <div class="card-grid-item-z9a0b">
        <div class="card-grid-icon-z9a0b">⚡</div>
        <h3 class="card-grid-title-z9a0b">高性能</h3>
        <p class="card-grid-desc-z9a0b">优化加载速度和渲染性能</p>
      </div>
      <div class="card-grid-item-z9a0b">
        <div class="card-grid-icon-z9a0b">🎨</div>
        <h3 class="card-grid-title-z9a0b">美观UI</h3>
        <p class="card-grid-desc-z9a0b">精美的界面设计和交互</p>
      </div>
      <div class="card-grid-item-z9a0b">
        <div class="card-grid-icon-z9a0b">🔒</div>
        <h3 class="card-grid-title-z9a0b">安全可靠</h3>
        <p class="card-grid-desc-z9a0b">数据加密和权限控制</p>
      </div>
      <div class="card-grid-item-z9a0b">
        <div class="card-grid-icon-z9a0b">🔄</div>
        <h3 class="card-grid-title-z9a0b">实时同步</h3>
        <p class="card-grid-desc-z9a0b">多端数据实时同步</p>
      </div>
      <div class="card-grid-item-z9a0b">
        <div class="card-grid-icon-z9a0b">☁️</div>
        <h3 class="card-grid-title-z9a0b">云端存储</h3>
        <p class="card-grid-desc-z9a0b">安全可靠的云端数据存储</p>
      </div>
    </div>
  </div>
</html>
<style>
  .card-grid-demo-z9a0b {
    padding: 15px;
    background: #f5f5f5;
  }
  
  .card-grid-container-z9a0b {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
    gap: 20px;
    padding: 20px;
    background: white;
    border-radius: 8px;
    box-shadow: 0 2px 10px rgba(0,0,0,0.1);
  }
  
  .card-grid-item-z9a0b {
    background: #f8f9fa;
    border: 1px solid #e9ecef;
    border-radius: 8px;
    padding: 25px;
    text-align: center;
    transition: transform 0.3s, box-shadow 0.3s;
  }
  
  .card-grid-item-z9a0b:hover {
    transform: translateY(-5px);
    box-shadow: 0 4px 15px rgba(0,0,0,0.15);
  }
  
  .card-grid-icon-z9a0b {
    font-size: 48px;
    margin-bottom: 15px;
  }
  
  .card-grid-title-z9a0b {
    margin: 0 0 10px 0;
    color: #212529;
    font-size: 18px;
  }
  
  .card-grid-desc-z9a0b {
    margin: 0;
    color: #6c757d;
    font-size: 14px;
    line-height: 1.5;
  }
</style>

# 5.2 圣杯布局

<html>
  <div class="holy-grail-demo-c1d2e">
    <div class="holy-grail-container-c1d2e">
      <header class="holy-grail-header-c1d2e">Header</header>
      <main class="holy-grail-main-c1d2e">Main Content</main>
      <aside class="holy-grail-left-c1d2e">Left Sidebar</aside>
      <aside class="holy-grail-right-c1d2e">Right Sidebar</aside>
      <footer class="holy-grail-footer-c1d2e">Footer</footer>
    </div>
  </div>
</html>
<style>
  .holy-grail-demo-c1d2e {
    padding: 15px;
    background: #f5f5f5;
  }
  
  .holy-grail-container-c1d2e {
    display: grid;
    grid-template-columns: 150px 1fr 200px;
    grid-template-rows: 60px 1fr 50px;
    grid-template-areas: 
      "header header header"
      "left main right"
      "footer footer footer";
    gap: 10px;
    height: 300px;
    background: white;
    border-radius: 8px;
    overflow: hidden;
  }
  
  .holy-grail-header-c1d2e {
    grid-area: header;
    background: #333;
    color: white;
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: bold;
  }
  
  .holy-grail-main-c1d2e {
    grid-area: main;
    background: #f8f9fa;
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: bold;
    color: #495057;
    border: 2px dashed #dee2e6;
  }
  
  .holy-grail-left-c1d2e {
    grid-area: left;
    background: #e3f2fd;
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: bold;
    color: #1976d2;
  }
  
  .holy-grail-right-c1d2e {
    grid-area: right;
    background: #fff3e0;
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: bold;
    color: #ef6c00;
  }
  
  .holy-grail-footer-c1d2e {
    grid-area: footer;
    background: #333;
    color: white;
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: bold;
  }
</style>

# 5.3 产品展示页面

<html>
  <div class="product-demo-f3g4h">
    <div class="product-container-f3g4h">
      <div class="product-header-f3g4h">
        <h1 class="product-title-f3g4h">产品展示</h1>
        <nav class="product-nav-f3g4h">
          <a href="#" class="product-nav-link-f3g4h">首页</a>
          <a href="#" class="product-nav-link-f3g4h">产品</a>
          <a href="#" class="product-nav-link-f3g4h">关于我们</a>
          <a href="#" class="product-nav-link-f3g4h">联系</a>
        </nav>
      </div>
      
      <div class="product-hero-f3g4h">
        <div class="product-hero-content-f3g4h">
          <h2 class="product-hero-title-f3g4h">创新产品</h2>
          <p class="product-hero-desc-f3g4h">体验前所未有的功能和设计</p>
          <button class="product-hero-btn-f3g4h">立即购买</button>
        </div>
      </div>
      
      <div class="product-features-f3g4h">
        <div class="product-feature-f3g4h">
          <div class="product-feature-icon-f3g4h">⚡</div>
          <h3 class="product-feature-title-f3g4h">高性能</h3>
          <p class="product-feature-desc-f3g4h">卓越的性能表现</p>
        </div>
        <div class="product-feature-f3g4h">
          <div class="product-feature-icon-f3g4h">🛡️</div>
          <h3 class="product-feature-title-f3g4h">安全可靠</h3>
          <p class="product-feature-desc-f3g4h">多重安全保障</p>
        </div>
        <div class="product-feature-f3g4h">
          <div class="product-feature-icon-f3g4h">📱</div>
          <h3 class="product-feature-title-f3g4h">跨平台</h3>
          <p class="product-feature-desc-f3g4h">支持多设备使用</p>
        </div>
      </div>
      
      <div class="product-sidebar-f3g4h">
        <div class="product-sidebar-item-f3g4h">最新动态</div>
        <div class="product-sidebar-item-f3g4h">用户评价</div>
        <div class="product-sidebar-item-f3g4h">技术文档</div>
      </div>
      
      <div class="product-footer-f3g4h">
        <p class="product-footer-text-f3g4h">© 2023 产品公司. 保留所有权利.</p>
      </div>
    </div>
  </div>
</html>
<style>
  .product-demo-f3g4h {
    padding: 15px;
    background: #f5f5f5;
  }
  
  .product-container-f3g4h {
    display: grid;
    grid-template-columns: 1fr 250px;
    grid-template-rows: auto 300px auto 50px;
    grid-template-areas: 
      "header header"
      "hero sidebar"
      "features sidebar"
      "footer footer";
    gap: 20px;
    max-width: 1200px;
    margin: 0 auto;
    background: white;
    border-radius: 8px;
    overflow: hidden;
    box-shadow: 0 2px 10px rgba(0,0,0,0.1);
  }
  
  .product-header-f3g4h {
    grid-area: header;
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 20px;
    background: #333;
    color: white;
  }
  
  .product-title-f3g4h {
    margin: 0;
    font-size: 24px;
  }
  
  .product-nav-f3g4h {
    display: flex;
    gap: 20px;
  }
  
  .product-nav-link-f3g4h {
    color: white;
    text-decoration: none;
    padding: 8px 12px;
    border-radius: 4px;
    transition: background 0.3s;
  }
  
  .product-nav-link-f3g4h:hover {
    background: rgba(255,255,255,0.1);
  }
  
  .product-hero-f3g4h {
    grid-area: hero;
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    display: flex;
    align-items: center;
    justify-content: center;
    color: white;
    border-radius: 8px;
  }
  
  .product-hero-content-f3g4h {
    text-align: center;
    max-width: 80%;
  }
  
  .product-hero-title-f3g4h {
    font-size: 32px;
    margin: 0 0 15px 0;
  }
  
  .product-hero-desc-f3g4h {
    font-size: 18px;
    margin: 0 0 25px 0;
  }
  
  .product-hero-btn-f3g4h {
    padding: 12px 30px;
    background: white;
    color: #667eea;
    border: none;
    border-radius: 30px;
    font-size: 16px;
    font-weight: bold;
    cursor: pointer;
    transition: transform 0.3s;
  }
  
  .product-hero-btn-f3g4h:hover {
    transform: translateY(-2px);
  }
  
  .product-features-f3g4h {
    grid-area: features;
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 20px;
    padding: 20px;
  }
  
  .product-feature-f3g4h {
    text-align: center;
    padding: 20px;
    background: #f8f9fa;
    border-radius: 8px;
    transition: transform 0.3s;
  }
  
  .product-feature-f3g4h:hover {
    transform: translateY(-5px);
  }
  
  .product-feature-icon-f3g4h {
    font-size: 40px;
    margin-bottom: 15px;
  }
  
  .product-feature-title-f3g4h {
    margin: 0 0 10px 0;
    color: #212529;
  }
  
  .product-feature-desc-f3g4h {
    margin: 0;
    color: #6c757d;
    font-size: 14px;
  }
  
  .product-sidebar-f3g4h {
    grid-area: sidebar;
    background: #e3f2fd;
    padding: 20px;
    border-radius: 8px;
  }
  
  .product-sidebar-item-f3g4h {
    padding: 15px;
    margin-bottom: 10px;
    background: white;
    border-radius: 4px;
    cursor: pointer;
    transition: background 0.3s;
  }
  
  .product-sidebar-item-f3g4h:hover {
    background: #bbdefb;
  }
  
  .product-footer-f3g4h {
    grid-area: footer;
    background: #333;
    display: flex;
    align-items: center;
    justify-content: center;
    color: white;
  }
  
  .product-footer-text-f3g4h {
    margin: 0;
  }
</style>

# 5.4 仪表盘布局

<html>
  <div class="dashboard-demo-j5k6l">
    <div class="dashboard-container-j5k6l">
      <header class="dashboard-header-j5k6l">
        <h1 class="dashboard-title-j5k6l">数据分析仪表盘</h1>
        <div class="dashboard-user-j5k6l">👤 管理员</div>
      </header>
      
      <nav class="dashboard-nav-j5k6l">
        <a href="#" class="dashboard-nav-item-j5k6l active-j5k6l">概览</a>
        <a href="#" class="dashboard-nav-item-j5k6l">用户</a>
        <a href="#" class="dashboard-nav-item-j5k6l">订单</a>
        <a href="#" class="dashboard-nav-item-j5k6l">设置</a>
      </nav>
      
      <div class="dashboard-main-j5k6l">
        <div class="dashboard-card-j5k6l card1-j5k6l">
          <div class="card-header-j5k6l">总用户数</div>
          <div class="card-value-j5k6l">12,345</div>
          <div class="card-trend-j5k6l">↗ 12% 上升</div>
        </div>
        
        <div class="dashboard-card-j5k6l card2-j5k6l">
          <div class="card-header-j5k6l">总订单数</div>
          <div class="card-value-j5k6l">5,678</div>
          <div class="card-trend-j5k6l">↗ 8% 上升</div>
        </div>
        
        <div class="dashboard-card-j5k6l card3-j5k6l">
          <div class="card-header-j5k6l">总收入</div>
          <div class="card-value-j5k6l">¥1,234,567</div>
          <div class="card-trend-j5k6l">↗ 15% 上升</div>
        </div>
        
        <div class="dashboard-card-j5k6l card4-j5k6l">
          <div class="card-header-j5k6l">转化率</div>
          <div class="card-value-j5k6l">3.2%</div>
          <div class="card-trend-j5k6l">↘ 2% 下降</div>
        </div>
        
        <div class="dashboard-chart-j5k6l">
          <div class="chart-placeholder-j5k6l">📊 图表区域</div>
        </div>
        
        <div class="dashboard-table-j5k6l">
          <div class="table-placeholder-j5k6l">📋 数据表格</div>
        </div>
      </div>
    </div>
  </div>
</html>
<style>
  .dashboard-demo-j5k6l {
    padding: 15px;
    background: #f5f5f5;
  }
  
  .dashboard-container-j5k6l {
    display: grid;
    grid-template-columns: 0px 1fr;
    grid-template-rows: 60px 50px 1fr;
    grid-template-areas: 
      "header header"
      "nav nav"
      "sidebar main";
    gap: 20px;
    max-width: 1200px;
    margin: 0 auto;
    background: white;
    border-radius: 8px;
    overflow: hidden;
    box-shadow: 0 2px 10px rgba(0,0,0,0.1);
    height: 500px;
  }
  
  .dashboard-header-j5k6l {
    grid-area: header;
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 0 20px;
    background: #333;
    color: white;
  }
  
  .dashboard-title-j5k6l {
    margin: 0;
    font-size: 20px;
  }
  
  .dashboard-user-j5k6l {
    font-size: 14px;
  }
  
  .dashboard-nav-j5k6l {
    grid-area: nav;
    display: flex;
    background: #f8f9fa;
    padding: 0 20px;
  }
  
  .dashboard-nav-item-j5k6l {
    padding: 15px 20px;
    text-decoration: none;
    color: #495057;
    font-weight: 500;
    border-bottom: 3px solid transparent;
    transition: all 0.3s;
  }
  
  .dashboard-nav-item-j5k6l:hover,
  .active-j5k6l {
    color: #007bff;
    border-bottom: 3px solid #007bff;
  }
  
  .dashboard-main-j5k6l {
    grid-area: main;
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    grid-template-rows: auto 1fr 1fr;
    grid-template-areas: 
      "card1 card2 card3 card4"
      "chart chart chart chart"
      "table table table table";
    gap: 20px;
    padding: 20px;
    overflow: auto;
  }
  
  .dashboard-card-j5k6l {
    padding: 20px;
    border-radius: 8px;
    color: white;
  }
  
  .card1-j5k6l {
    grid-area: card1;
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  }
  
  .card2-j5k6l {
    grid-area: card2;
    background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
  }
  
  .card3-j5k6l {
    grid-area: card3;
    background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
  }
  
  .card4-j5k6l {
    grid-area: card4;
    background: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%);
  }
  
  .card-header-j5k6l {
    font-size: 14px;
    opacity: 0.9;
    margin-bottom: 10px;
  }
  
  .card-value-j5k6l {
    font-size: 24px;
    font-weight: bold;
    margin-bottom: 5px;
  }
  
  .card-trend-j5k6l {
    font-size: 12px;
  }
  
  .dashboard-chart-j5k6l {
    grid-area: chart;
    background: #f8f9fa;
    border-radius: 8px;
    display: flex;
    align-items: center;
    justify-content: center;
  }
  
  .chart-placeholder-j5k6l {
    font-size: 24px;
    color: #6c757d;
  }
  
  .dashboard-table-j5k6l {
    grid-area: table;
    background: #f8f9fa;
    border-radius: 8px;
    display: flex;
    align-items: center;
    justify-content: center;
  }
  
  .table-placeholder-j5k6l {
    font-size: 24px;
    color: #6c757d;
  }
</style>

# 六、常见布局模式

# 6.1 基本网格布局

/* 简单的三列网格 */
.grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 20px;
}

/* 响应式网格 */
.responsive-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 20px;
}

# 6.2 侧边栏布局

/* 左侧边栏 */
.layout {
  display: grid;
  grid-template-columns: 250px 1fr;
  grid-template-rows: 60px 1fr 50px;
  grid-template-areas: 
    "header header"
    "sidebar main"
    "footer footer";
  height: 100vh;
}

# 6.3 卡片网格

/* 自适应卡片网格 */
.card-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 20px;
}

# 6.4 表单布局

/* 响应式表单 */
.form-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 20px;
}

/* 复杂表单 */
.complex-form {
  display: grid;
  grid-template-columns: 150px 1fr 150px 1fr;
  grid-auto-rows: minmax(50px, auto);
  gap: 15px;
}

# 七、最佳实践

# 7.1 何时使用 Grid

✅ 适合使用 Grid:

  • 复杂的二维布局
  • 需要精确控制行和列
  • 卡片网格布局
  • 仪表盘和管理界面
  • 复杂的表单布局

❌ 不适合使用 Grid:

  • 简单的一维布局(使用 Flexbox)
  • 内容流式布局(使用正常文档流)

# 7.2 Grid 与 Flexbox 结合

/* Grid容器内的Flexbox项目 */
.dashboard {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 20px;
}

.card {
  display: flex;
  flex-direction: column;
}

.card-header {
  flex: 0 0 auto; /* 不放大不缩小 */
}

.card-content {
  flex: 1; /* 占据剩余空间 */
}

# 7.3 响应式设计

/* 移动优先 */
.grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 15px;
}

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

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

# 7.4 性能优化

/* ✅ 推荐:使用命名区域 */
.container {
  grid-template-areas: 
    "header header"
    "main sidebar"
    "footer footer";
}

.header { grid-area: header; }

/* ❌ 不推荐:复杂的网格线定位 */
.item {
  grid-column: 1 / span 2;
  grid-row: 3 / span 1;
}

# 7.5 可访问性

/* 保持逻辑顺序与视觉顺序一致 */
.grid {
  display: grid;
  /* 确保tab顺序符合阅读顺序 */
}

/* 使用语义化HTML */
<article class="grid-item">
  <h2>标题</h2>
  <p>内容</p>
</article>

# 八、浏览器兼容性

特性 Chrome Firefox Safari Edge IE
基础Grid ✅ 57+ ✅ 52+ ✅ 10.1+ ✅ 16+ ⚠️ 11 (部分)
gap属性 ✅ 57+ ✅ 52+ ✅ 10.1+ ✅ 16+ ❌
auto-fit/fill ✅ 57+ ✅ 52+ ✅ 10.1+ ✅ 16+ ❌
命名区域 ✅ 57+ ✅ 52+ ✅ 10.1+ ✅ 16+ ⚠️ 11 (部分)

兼容性注意事项:

  • IE11 需要 -ms- 前缀和支持有限
  • 使用 Autoprefixer 自动添加前缀
  • 考虑使用 CSS Grid polyfill
/* Autoprefixer 会自动添加前缀 */
.container {
  display: grid;
  /* 编译后会添加:
  display: -ms-grid;
  display: grid;
  */
}

# 九、总结

CSS Grid是现代网页布局的强大工具,掌握以下要点:

  1. 核心概念:理解网格线、轨道、单元格、区域
  2. 容器属性:grid-template-*、gap、justify/align-*
  3. 项目属性:grid-column/grid-row、grid-area、justify/align-self
  4. fr单位:灵活的空间分配
  5. 函数:repeat()、minmax()、auto-fit/auto-fill
  6. 实战应用:卡片网格、圣杯布局、仪表盘等
  7. 最佳实践:合理选择、性能优化、响应式设计

Grid与Flexbox相辅相成,Grid处理二维布局,Flexbox处理一维布局,两者结合能创建出强大而灵活的现代网页布局!

祝你变得更强!

编辑 (opens new window)
#CSS
上次更新: 2025/11/20
CSS布局-Flexbox完全指南
CSS布局-响应式设计实践

← CSS布局-Flexbox完全指南 CSS布局-响应式设计实践→

最近更新
01
AI编程时代的一些心得
09-11
02
Claude Code与Codex的协同工作
09-01
03
Claude Code 最佳实践(个人版)
08-01
更多文章>
Theme by Vdoing | Copyright © 2018-2025 京ICP备2021021832号-2 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式