源本科技 | 码上会

Tailwind CSS 网格布局(行)

2026/03/12
11
0

学习目标

  • 理解 CSS grid-template-rows 属性在定义网格行结构中的核心作用

  • 掌握 Tailwind CSS 中 grid-rows-{n} 工具类的用法,快速定义网格的行数与高度分布

  • 学会结合 grid-flow-col 实现“按列填充”的特殊布局模式(先填满列,再换列)

  • 能够区分 grid-cols(控制列宽)与 grid-rows(控制行高)在不同布局场景下的应用差异


核心概念

在 CSS Grid 布局中,grid-template-rows 属性用于显式定义网格容器中行的数量以及每一行的高度

虽然在实际开发中,大多数网格布局是“隐式行”的(即行数由内容自动决定,只定义列数),但在某些特定场景下,我们需要严格控制行数。例如:

  • 固定行数的仪表盘:确保布局始终为 3 行,无论内容多少。

  • 横向滚动布局:配合 grid-flow-col,让内容先垂直填满指定行数,再向右开启新列。

Tailwind CSS 提供了 grid-rows-{n} 系列工具类,将复杂的 CSS 语法简化为直观的类名,默认行为是将可用高度平均分配给指定的行数。

工作原理

  • 激活网格:父容器必须添加 grid 类。

  • 定义行数:添加 grid-rows-{n},Tailwind 会生成类似 grid-template-rows: repeat(n, minmax(0, 1fr)) 的样式。

  • 填充模式

    • 默认 (Row Flow):子元素从左到右填充,填满一行后换到下一行。此时 grid-rows 主要限制总行数,多余内容会创建隐式行(除非配合其他属性)。

    • 列优先 (Column Flow):当配合 grid-flow-col 使用时,grid-rows 变得至关重要。它定义了每列有多少行,内容会先从上到下填满这 N 行,然后再移动到下一列。


网格行工具类

Tailwind 提供了一套从 1 到 6 的预定义行数类,以及特殊控制类。

类名

对应 CSS 逻辑

说明

grid-rows-1

repeat(1, minmax(0, 1fr))

单行布局(所有内容压缩在一行,或作为列优先流的单列)

grid-rows-2

repeat(2, minmax(0, 1fr))

双行布局

grid-rows-3

repeat(3, minmax(0, 1fr))

三行布局

...

...

...

grid-rows-6

repeat(6, minmax(0, 1fr))

六行布局

grid-rows-none

none

禁用显式行模板,恢复由内容决定的隐式行

技术细节minmax(0, 1fr) 确保行可以收缩到比内容更小,防止网格溢出。这与标准的 1fr 略有不同,提供了更好的弹性。


列优先填充布局

这是 grid-rows 最经典的使用场景。当我们希望内容像报纸排版一样,先垂直填满指定行数,再向右换列时,必须同时使用 grid-rows-{n}grid-flow-col

场景描述

假设我们有一个容器,希望它始终只有 3 行

  • 如果有 6 个项目,它们应该排成 2 列 × 3 行

  • 如果有 9 个项目,它们应该排成 3 列 × 3 行

代码示例

3 行 × 多列布局

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Tailwind Grid Rows 演示</title>
    <script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="text-center p-10 bg-gray-50">

    <h1 class="text-green-600 text-5xl font-bold mb-8">
        前端技术教程
    </h1>

    <p class="font-bold text-lg mb-6 text-gray-700">Tailwind CSS grid-rows-3 + grid-flow-col 应用</p>
    <p class="mb-4 text-sm text-gray-500">
        容器被限制为 3 行。内容先垂直填充(1-2-3),然后换到下一列(4-5-6)。
    </p>

    <!-- 
      主容器配置:
      1. grid: 启用 Grid 布局
      2. grid-rows-3: 强制定义只有 3 行,每行等高
      3. grid-flow-col: 改变填充方向,先列后行 (Column First)
      4. auto-cols-fr: (可选) 让列自动均分剩余宽度
    -->
    <div class="grid grid-rows-3 grid-flow-col auto-cols-fr gap-4 max-w-3xl mx-auto border p-4 bg-white shadow-lg rounded-lg h-64">
        
        <!-- 第 1 列 (自动形成) -->
        <div class="bg-green-500 text-white flex items-center justify-center rounded font-bold shadow-md">1</div>
        <div class="bg-green-500 text-white flex items-center justify-center rounded font-bold shadow-md">2</div>
        <div class="bg-green-500 text-white flex items-center justify-center rounded font-bold shadow-md">3</div>

        <!-- 第 2 列 (自动形成) -->
        <div class="bg-green-600 text-white flex items-center justify-center rounded font-bold shadow-md">4</div>
        <div class="bg-green-600 text-white flex items-center justify-center rounded font-bold shadow-md">5</div>
        <div class="bg-green-600 text-white flex items-center justify-center rounded font-bold shadow-md">6</div>

    </div>

    <div class="mt-8 text-left max-w-3xl mx-auto bg-white p-4 rounded shadow text-sm text-gray-600">
        <h3 class="font-bold text-gray-800 mb-2">布局逻辑解析:</h3>
        <ul class="list-disc pl-5 space-y-1">
            <li><code>grid-rows-3</code>: 锁定了网格的高度结构,强制分为 3 等份。</li>
            <li><code>grid-flow-col</code>: 指示浏览器不要按行填充,而是按列填充。</li>
            <li>结果:元素 1, 2, 3 占据第一列;元素 4, 5, 6 占据第二列。</li>
            <li>如果不加 <code>grid-rows-3</code>,<code>grid-flow-col</code> 可能会导致所有元素排成一长列(取决于容器高度)。</li>
        </ul>
    </div>

</body>
</html>

固定行高的标准布局

除了列优先布局,grid-rows 也可用于标准流中,强制将容器高度平均分配给指定数量的行。这在创建高度一致的卡片列表或仪表盘行时非常有用。

代码示例

2 行固定布局

在此示例中,我们定义了一个 2 行的网格。即使内容量不同,两行的高度也会强制相等(各占 50%)。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Tailwind Grid Rows 标准布局</title>
    <script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="text-center p-10 bg-gray-50">

    <h1 class="text-green-600 text-5xl font-bold mb-8">
        前端技术教程
    </h1>

    <p class="font-bold text-lg mb-6 text-gray-700">Tailwind CSS grid-rows-2 应用</p>
    <p class="mb-4 text-sm text-gray-500">
        容器强制分为 2 行。注意:这里没有使用 grid-flow-col,所以是标准的从左到右填充。
    </p>

    <!-- 
      主容器:
      - grid-rows-2: 强制分为 2 行,每行高度为 50% (1fr)
      - grid-flow-row (默认): 正常从左到右,从上到下
    -->
    <div class="grid grid-rows-2 grid-cols-3 gap-4 max-w-3xl mx-auto border p-4 bg-white shadow-lg rounded-lg h-64">
        
        <!-- 第一行 (3 个元素) -->
        <div class="bg-green-500 text-white flex items-center justify-center rounded font-bold">1</div>
        <div class="bg-green-500 text-white flex items-center justify-center rounded font-bold">2</div>
        <div class="bg-green-500 text-white flex items-center justify-center rounded font-bold">3</div>

        <!-- 第二行 (3 个元素) -->
        <div class="bg-green-700 text-white flex items-center justify-center rounded font-bold">4</div>
        <div class="bg-green-700 text-white flex items-center justify-center justified-center rounded font-bold">5</div>
        <div class="bg-green-700 text-white flex items-center justify-center rounded font-bold">6</div>

    </div>

    <div class="mt-8 text-left max-w-3xl mx-auto bg-white p-4 rounded shadow text-sm text-gray-600">
        <h3 class="font-bold text-gray-800 mb-2">关键点:</h3>
        <p>在这个例子中,<code>grid-rows-2</code> 确保了上下两行的高度严格相等,各占容器高度的 50%。如果没有这个类,行高将由内容撑开。</p>
    </div>

</body>
</html>

注意事项

1. 隐式行 vs 显式行

  • 显式行 (grid-rows-n):你明确告诉浏览器“我要 N 行”,浏览器会尝试将内容塞进这 N 行中(如果配合 grid-flow-col)或平分高度。

  • 隐式行:如果你只设置了 grid-cols-3 而没有设置 grid-rows,当你放入第 4 个、第 5 个元素时,CSS Grid 会自动创建新的行来容纳它们。这些新行的高度默认由 grid-auto-rows 控制(Tailwind 中对应 auto-rows-{size})。

2. 响应式行控制

你可以针对不同屏幕尺寸改变行数策略。

<!-- 移动端:单列长滚动 (1 行或自动) -->
<!-- 桌面端:3 行 × 多列布局 -->
<div class="grid grid-rows-1 md:grid-rows-3 grid-flow-col md:grid-flow-col auto-cols-fr">
    <!-- 内容 -->
</div>

3. grid-rows-none

如果你在某个断点下想取消之前定义的固定行数,恢复为内容自适应高度,可以使用 lg:grid-rows-none。这将把 grid-template-rows 重置为 none


总结

  • 核心用途grid-rows-{n} 用于显式定义网格的行数和行高比例。

  • 最佳搭档:它与 grid-flow-col 是黄金组合,用于实现“报纸式”的多列垂直填充布局。

  • 高度分配:默认情况下,它会将容器高度平均分配给指定的行数 (1fr)。

  • grid-cols 的区别grid-cols 控制水平分割(列数),grid-rows 控制垂直分割(行数)。在响应式设计中,通常用 grid-cols 做主流布局,用 grid-rows 做特殊布局优化。

  • 数值范围:Tailwind 默认提供 1 到 6 的预设,更多需求可通过任意值语法 grid-rows-[10] 实现。


思考题

  1. 如果你想创建一个“瀑布流”效果的简化版(先填满第一列,再填第二列),且每列固定显示 4 个项目,你应该使用哪些 Tailwind 类组合?

  2. 在一个 grid-rows-3 的容器中,如果放入了 10 个子元素且没有设置 grid-flow-col,会发生什么情况?多出来的元素会如何排列?

  3. grid-rows-2h-1/2 应用在子元素上有什么本质区别?为什么在网格布局中推荐使用 grid-rows 而不是给每个子元素写高度?