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>
相关推荐
拾光拾趣录16 分钟前
CSS常见问题深度解析与解决方案(第三波)
前端·css
轻语呢喃33 分钟前
JavaScript :字符串模板——优雅编程的基石
前端·javascript·后端
杨进军34 分钟前
React 协调器 render 阶段
前端·react.js·前端框架
中微子37 分钟前
Blob 对象及 Base64 转换指南
前端
风铃喵游37 分钟前
让大模型调用MCP服务变得超级简单
前端·人工智能
中微子38 分钟前
智能前端实践之 shot-word demo
前端
归于尽39 分钟前
智能前端小魔术,让图片开口说单词
前端·react.js
用户98738245810139 分钟前
vite 插件
前端
无数山42 分钟前
autorelease pool
前端
支撑前端荣耀42 分钟前
四、Cypress测试框架拆解
前端