CSS Grid布局(Grid Layout) 4


一、 Grid 容器属性 (Properties for the Grid Container)

应用于设置了 display: grid 或 display: inline-grid 的元素。

  1. display

    • 作用:定义元素为 Grid 容器。

    • 值:

      • grid: 块级 Grid 容器。
      • inline-grid: 行内级 Grid 容器。
  2. grid-template-columns

    • 作用:定义网格列的数量和尺寸。

    • 值:

      • : 定义每列的尺寸。可以是:

        • : 如 100px, 2em。
        • : 相对于容器宽度的百分比,如 25%。
        • auto: 由内容或 minmax() 函数决定。
        • (即 fr 单位): 弹性系数,代表可用空间的一份。如 1fr, 2fr。
        • minmax(min, max): 定义一个尺寸范围,如 minmax(100px, 1fr) (最小100px,最大占1份可用空间)。
        • fit-content(): 根据内容尺寸调整,但不超过指定值。
      • repeat(, ): 重复定义轨道。如 repeat(3, 1fr) (3列,每列1fr), repeat(auto-fill, minmax(100px, 1fr)) (自动填充尽可能多的列,每列最小100px)。

      • none: (默认值,但通常会显式定义) 没有显式定义的列。

  3. grid-template-rows

    • 作用:定义网格行的数量和尺寸。
    • 值:同 grid-template-columns。
  4. grid-template-areas

    • 作用:通过命名网格区域来定义网格布局。

    • 值:

      • 字符串 (Strings): 每个字符串代表一行,字符串中的名字代表单元格所属区域名。用空格分隔名字。

      • . (点): 代表一个空单元格。

      • none: (默认值) 不使用命名区域。

      • 示例:

        css 复制代码
              grid-template-areas:
          "header header header"
          "nav main aside"
          "footer footer footer";
            
  5. grid-template

    • 作用:grid-template-rows, grid-template-columns, 和 grid-template-areas 的简写。

    • 值:组合上述三个属性的值,语法较复杂,通常分开写更清晰。

      • none: (默认值)
      • /
      • ? ? ? \]+ \[ / \]? (定义 area 和 row/col)

    • 作用:设置网格线之间的间距(沟槽)。

    • 值:

      • : 设置一个值,同时用于行间距和列间距,如 10px。
      • : 分别设置行间距和列间距,如 15px 10px。
  6. row-gap (或 grid-row-gap)

    • 作用:单独设置行间距。
    • 值:,如 20px。
  7. column-gap (或 grid-column-gap)

    • 作用:单独设置列间距。
    • 值:,如 10px。
  8. justify-items

    • 作用:定义网格项目在其分配的单元格内沿 行轴(水平方向) 的对齐方式。

    • 值:

      • start: 对齐到单元格的行起始边缘。
      • end: 对齐到单元格的行结束边缘。
      • center: 在单元格内水平居中。
      • stretch: (默认值) 项目填充单元格的整个宽度(如果项目未设置宽度)。
  9. align-items

    • 作用:定义网格项目在其分配的单元格内沿 列轴(垂直方向) 的对齐方式。

    • 值:

      • start: 对齐到单元格的列起始边缘。
      • end: 对齐到单元格的列结束边缘。
      • center: 在单元格内垂直居中。
      • stretch: (默认值) 项目填充单元格的整个高度(如果项目未设置高度)。
      • baseline: 基于项目内容的基线对齐。
  10. place-items

    • 作用:align-items 和 justify-items 的简写。

    • 值:

      • : 如果只提供一个值,justify-items 也使用相同的值。
      • : 分别设置。
  11. justify-content

    • 作用:定义 整个网格 在容器内沿 行轴(水平方向) 的对齐方式(当网格总宽度小于容器宽度时)。

    • 值:

      • start: 网格向容器的行起始边缘对齐。
      • end: 网格向容器的行结束边缘对齐。
      • center: 网格在容器内水平居中。
      • stretch: 拉伸网格轨道以填满容器宽度(如果轨道尺寸是 auto)。
      • space-around: 网格轨道均匀分布,轨道两侧空间相等。
      • space-between: 网格轨道均匀分布,首尾轨道贴边。
      • space-evenly: 网格轨道和它们与容器边缘之间的空间都均匀分布。
  12. align-content

    • 作用:定义 整个网格 在容器内沿 列轴(垂直方向) 的对齐方式(当网格总高度小于容器高度时)。
    • 值:同 justify-content(但作用于垂直方向)。
  13. place-content

    • 作用:align-content 和 justify-content 的简写。

    • 值:

      • : 如果只提供一个值,justify-content 也使用相同的值。
      • : 分别设置。
  14. grid-auto-columns

    • 作用:指定 隐式 创建的网格列的尺寸(当项目放置在显式定义的列之外时)。
    • 值: (同 grid-template-columns 的值)。
  15. grid-auto-rows

    • 作用:指定 隐式 创建的网格行的尺寸。
    • 值: (同 grid-template-rows 的值)。
  16. grid-auto-flow

    • 作用:指定自动布局算法如何放置没有明确放置在网格中的项目。

    • 值:

      • row: (默认值) 优先逐行填充。
      • column: 优先逐列填充。
      • dense: 尝试填补网格中较早出现的空隙,可能会打乱项目顺序。
  17. grid

    • 作用:一个复杂的简写属性,可以同时设置 grid-template-rows, grid-template-columns, grid-template-areas, grid-auto-rows, grid-auto-columns, grid-auto-flow。因其复杂性,通常不推荐使用,分开写更清晰。

二、 Grid 项目属性 (Properties for the Grid Items)

应用于 Grid 容器的直接子元素。

  1. grid-column-start

    • 作用:定义项目在列方向上开始的网格线。

    • 值:

      • : 线号 (如 1, 2, -1) 或线名。
      • span : 跨越指定数量的列。
      • auto: 自动放置。
  2. grid-column-end

    • 作用:定义项目在列方向上结束的网格线。
    • 值:同 grid-column-start。
  3. grid-row-start

    • 作用:定义项目在行方向上开始的网格线。
    • 值:同 grid-column-start。
  4. grid-row-end

    • 作用:定义项目在行方向上结束的网格线。
    • 值:同 grid-column-start。
  5. grid-column

    • 作用:grid-column-start 和 grid-column-end 的简写。

    • 值:

      • / : 如 1 / 3。
      • / span : 如 2 / span 3。
      • span / : 如 span 2 / 5。
      • : 如果只提供一个值,表示开始线,结束线自动推断(通常是下一条线)。
      • span : 如 span 2 (从自动放置位置开始跨越2列)。
  6. grid-row

    • 作用:grid-row-start 和 grid-row-end 的简写。
    • 值:同 grid-column。
  7. grid-area

    • 作用:给项目指定一个名称,使其放置在由 grid-template-areas 定义的同名区域中;或者是 grid-row-start / grid-column-start / grid-row-end / grid-column-end 的简写。

    • 值:

      • : 引用 grid-template-areas 中定义的区域名。
      • / / / : 如 2 / 1 / 4 / 3。
      • auto: 自动放置。
  8. justify-self

    • 作用:覆盖容器的 justify-items,定义 当前项目 在其单元格内沿 行轴(水平方向) 的对齐方式。
    • 值:start, end, center, stretch。
  9. align-self

    • 作用:覆盖容器的 align-items,定义 当前项目 在其单元格内沿 列轴(垂直方向) 的对齐方式。
    • 值:start, end, center, stretch, baseline。
  10. place-self

    • 作用:align-self 和 justify-self 的简写。

    • 值:

      • : 如果只提供一个值,justify-self 也使用相同的值。
      • : 分别设置。
  11. order (与 Flexbox 共享)

    • 作用:虽然 Grid 主要通过放置属性控制顺序,但 order 仍然可以影响未明确放置的项目的自动布局顺序,或在视觉顺序与 DOM 顺序需要分离时使用。数值越小越靠前。
    • 值: (默认为 0)。

案例 1

html 复制代码
    <!-- 11.html -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Grid 布局示例</title>
    <link rel="stylesheet" href="11.css">
</head>
<body>

<h1>Grid 布局示例</h1>

<!-- 示例 1: 基础的 3x2 网格 -->
<h2>示例 1: 基础的 3x2 网格</h2>
<div class="grid-container example1">
    <div class="grid-item">1</div>
    <div class="grid-item">2</div>
    <div class="grid-item">3</div>
    <div class="grid-item">4</div>
    <div class="grid-item">5</div>
    <div class="grid-item">6</div>
</div>

<!-- 示例 2: 使用 fr 单位的弹性列 -->
<h2>示例 2: 使用 fr 单位的弹性列</h2>
<div class="grid-container example2">
    <div class="grid-item">1 (1fr)</div>
    <div class="grid-item">2 (2fr)</div>
    <div class="grid-item">3 (1fr)</div>
</div>

<!-- 示例 3: 经典的圣杯布局 (Holy Grail Layout) 变体 -->
<h2>示例 3: 经典的圣杯布局变体 (使用命名区域)</h2>
<div class="grid-container example3">
    <header class="grid-item header">页眉 (Header)</header>
    <nav class="grid-item nav">导航 (Nav)</nav>
    <main class="grid-item main">主内容区域 (Main)</main>
    <aside class="grid-item aside">侧边栏 (Aside)</aside>
    <footer class="grid-item footer">页脚 (Footer)</footer>
</div>

<!-- 示例 4: 响应式卡片布局 -->
<h2>示例 4: 响应式卡片布局</h2>
<div class="grid-container example4">
    <div class="grid-item card">卡片 1</div>
    <div class="grid-item card">卡片 2</div>
    <div class="grid-item card">卡片 3</div>
    <div class="grid-item card">卡片 4</div>
    <div class="grid-item card">卡片 5</div>
    <div class="grid-item card">卡片 6</div>
    <div class="grid-item card">卡片 7</div>
    <div class="grid-item card">卡片 8</div>
</div>

<!-- 示例 5: 项目跨越与显式放置 -->
<h2>示例 5: 项目跨越与显式放置</h2>
<div class="grid-container example5">
    <div class="grid-item item-a">A (跨2列)</div>
    <div class="grid-item item-b">B</div>
    <div class="grid-item item-c">C (跨2行)</div>
    <div class="grid-item item-d">D</div>
    <div class="grid-item item-e">E</div>
</div>

<!-- 示例 6: 项目对齐 -->
<h2>示例 6: 项目对齐</h2>
<div class="grid-container example6">
    <div class="grid-item align-start">Start</div>
    <div class="grid-item justify-center">Center (Horiz)</div>
    <div class="grid-item place-end">End (Both)</div>
    <div class="grid-item baseline-align">Base<br>line</div>
</div>

</body>
</html>
css 复制代码
/* 11.css */
body {
  font-family: "Microsoft YaHei", sans-serif;
  margin: 20px;
}

h1, h2 {
  text-align: center;
  margin-bottom: 20px;
}

.grid-container {
  border: 3px solid steelblue;
  background-color: lightgray;
  padding: 10px;
  margin-bottom: 40px; /* 区分示例 */
  display: grid; /* !! 核心:启用 Grid 布局 !! */
}

.grid-item {
  border: 1px dashed #666;
  background-color: lightcoral;
  padding: 20px;
  text-align: center;
  font-size: 1.1em;
  color: white;
}

/* --- 各示例特定样式 --- */

/* 示例 1: 基础的 3x2 网格 */
.example1 {
  /* 定义 3 列,每列 100px */
  grid-template-columns: 100px 100px 100px;
  /* 定义 2 行,每行 50px */
  grid-template-rows: 50px 50px;
  /* 设置行和列的间距 */
  gap: 10px;
  /* 如果容器宽度大于 3*(100px + 10px) - 10px,网格会靠左对齐 */
  justify-content: start; /* 默认就是 start */
}

/* 示例 2: 使用 fr 单位的弹性列 */
.example2 {
  /* 定义 3 列,按 1:2:1 的比例分配可用宽度 */
  grid-template-columns: 1fr 2fr 1fr;
  /* 行高自动 */
  grid-template-rows: auto;
  gap: 15px;
}

/* 示例 3: 经典的圣杯布局变体 (使用命名区域) */
.example3 {
  /* 定义列:第一列固定宽度,第二、三列弹性 */
  grid-template-columns: 150px 1fr 150px;
  /* 定义行:页眉页脚高度自动,中间区域弹性 */
  grid-template-rows: auto 1fr auto;
  /* 定义区域名称 */
  grid-template-areas:
      "header header header"  /* 第一行:页眉跨越所有列 */
      "nav    main   aside"   /* 第二行:导航、主内容、侧边栏 */
      "footer footer footer"; /* 第三行:页脚跨越所有列 */
  gap: 10px;
  min-height: 400px; /* 给容器一个最小高度看效果 */
}
/* 将 HTML 元素分配到对应的区域 */
.example3 .header { grid-area: header; background-color: #16a085; }
.example3 .nav    { grid-area: nav;    background-color: #27ae60; }
.example3 .main   { grid-area: main;   background-color: #2ecc71; }
.example3 .aside  { grid-area: aside;  background-color: #f1c40f; }
.example3 .footer { grid-area: footer; background-color: #e67e22; }

/* 示例 4: 响应式卡片布局 */
.example4 {
  /* 关键:创建尽可能多的列,每列最小宽度180px,最大等分剩余空间 */
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 20px;
}
.example4 .card {
  background-color: #3498db;
  min-height: 100px; /* 卡片最小高度 */
}

/* 示例 5: 项目跨越与显式放置 */
.example5 {
  /* 定义一个 3 列 2 行的基础网格 */
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: repeat(2, 100px);
  gap: 10px;
}
.example5 .item-a {
  background-color: #8e44ad;
  /* 从第 1 条列线开始,跨越 2 列 (到第 3 条列线) */
  grid-column: 1 / span 2;
  /* 或者 grid-column: 1 / 3; */
  grid-row: 1; /* 放在第 1 行 (默认跨1行) */
}
.example5 .item-c {
  background-color: #c0392b;
  grid-column: 1; /* 放在第 1 列 */
   /* 从第 2 条行线开始,跨越 2 行 (到第 4 条行线) */
  grid-row: 2 / span 2;
  /* 或者 grid-row: 2 / 4; (如果只有2行,会自动适配) */
}
/* B, D, E 会自动填充剩余单元格 */

/* 示例 6: 项目对齐 */
.example6 {
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: 150px; /* 固定行高以观察垂直对齐 */
  gap: 10px;
  /* 可以设置容器默认对齐方式 */
  /* justify-items: center; */
  /* align-items: center; */
}
.example6 .align-start {
  align-self: start; /* 当前项目在单元格内顶部对齐 */
  background-color: #2980b9;
}
.example6 .justify-center {
  justify-self: center; /* 当前项目在单元格内水平居中 */
  background-color: #d35400;
  width: 60%; /* 设置宽度,否则 stretch 会覆盖 justify-self */
}
.example6 .place-end {
  place-self: end end; /* align-self: end; justify-self: end; 右下角对齐 */
  background-color: #2c3e50;
  width: 50%;
  height: 50%; /* 设置宽高看效果 */
}
.example6 .baseline-align {
  align-self: baseline; /* 基于基线对齐 */
  font-size: 1.5em;
  background-color: #7f8c8d;
}

案例 2

html 复制代码
<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Grid 博客布局</title>
  <style>
    * {
      box-sizing: border-box;
    }

    body {
      margin: 0;
      font-family: sans-serif;
    }

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

    header {
      grid-area: header;
      background: #4CAF50;
      color: white;
      padding: 20px;
      font-size: 24px;
    }

    nav {
      grid-area: sidebar;
      background: #f4f4f4;
      padding: 20px;
    }

    main {
      grid-area: main;
      background: #fff;
      padding: 20px;
    }

    aside {
      grid-area: aside;
      background: #f9f9f9;
      padding: 20px;
    }

    footer {
      grid-area: footer;
      background: #222;
      color: white;
      text-align: center;
      padding: 10px;
    }

    /* 响应式:小屏幕折叠侧栏 */
    @media (max-width: 768px) {
      .grid-container {
        grid-template-areas:
          "header"
          "main"
          "aside"
          "sidebar"
          "footer";
        grid-template-columns: 1fr;
      }

      nav, aside {
        order: 1;
      }
    }
  </style>
</head>
<body>

  <div class="grid-container">
    <header>我的博客</header>
    <nav>导航<br>首页<br>归档<br>关于我</nav>
    <main>
      <h2>文章标题</h2>
      <p>这是文章的内容段落......</p>
    </main>
    <aside>热门推荐<br>文章1<br>文章2</aside>
    <footer>© 2025 我的博客. 保留所有权利。</footer>
  </div>

</body>
</html>
相关推荐
崔庆才丨静觅1 天前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60611 天前
完成前端时间处理的另一块版图
前端·github·web components
掘了1 天前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅1 天前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅1 天前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅1 天前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment1 天前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅1 天前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊1 天前
jwt介绍
前端
爱敲代码的小鱼1 天前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax