源本科技 | 码上会

Tailwind CSS 网格布局(行进阶)

2026/03/12
12
0

学习目标

  • 理解 CSS Grid 中 grid-row 属性的核心概念,掌握水平网格线的编号规则

  • 掌握 Tailwind CSS 中 row-span-{n} 类的使用,实现元素垂直跨越多个行的效果

  • 学会利用 row-start-{n}row-end-{n} 精确控制元素在垂直方向上的起始和结束位置

  • 能够组合使用跨行与定位类,构建复杂的“圣杯布局”、仪表盘侧边栏或非对称杂志式排版


核心概念

与列控制类似,行控制的核心在于理解水平网格线

  • 水平网格线:想象网格是由水平线划分的。在一个定义了 grid-rows-3 的容器中,实际上有 4 条水平线(从第 1 条顶部线到第 4 条底部线)。

  • 跨度:指一个元素在垂直方向上占据了多少个“轨道”(行高)。

  • 定位:指元素从哪条水平线开始,到哪条水平线结束。

Tailwind CSS 将这些属性封装为直观的类名,让你能够轻松打破常规的行排列,创造出视觉冲击力强的布局。

类别

类名示例

对应 CSS

作用

跨行

row-span-1row-span-12

grid-row: span n / span n

让元素垂直跨越 n 个行轨道

全高跨行

row-span-full

grid-row: 1 / -1

让元素跨越所有行(无论总行数是多少)

自动跨行

row-auto

grid-row: auto

默认行为,不跨越,占据自动分配的行

起始定位

row-start-1row-start-13

grid-row-start: n

强制元素从第 n 条水平线开始

结束定位

row-end-1row-end-13

grid-row-end: n

强制元素在第 n 条水平线结束

自动定位

row-start-auto, row-end-auto

grid-row-start/end: auto

重置定位,恢复自动流式排列

注意:水平网格线的编号也是从 1 开始(顶部),向下递增。如果容器定义为 grid-rows-4,则存在的网格线编号为 1, 2, 3, 4, 5。


跨行布局

row-span 是最常用的行控制类,用于让某个元素在垂直方向上占据多个行的高度。这在创建“侧边导航栏”、“长图展示”或“突出显示的关键指标”时非常有用。

语法与用法

<div class="grid grid-rows-3 grid-flow-col gap-4">
  <div class="row-span-1">占 1 行</div>
  <div class="row-span-2">占 2 行</div>
  <div class="row-span-3">占 3 行 (整列)</div>
  <div class="row-span-full">占满整列高度 (响应式友好)</div>
</div>

代码示例

混合跨度布局

本示例展示了一个 3 行 × 多列的网格(使用 grid-flow-col),其中某些元素跨越了多行。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Tailwind Row Span 演示</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 row-span 类应用</p>
    <p class="mb-4 text-sm text-gray-500">
        容器定义为 3 行,采用列优先填充。观察元素 4 (跨 2 行) 和元素 6 (跨 3 行) 的效果。
    </p>

    <!-- 
      主容器:
      - grid: 启用网格
      - grid-rows-3: 显式定义 3 行 (关键!配合 grid-flow-col 使用)
      - grid-flow-col: 内容先垂直填充,再换列
      - auto-cols-fr: 列宽自动均分
    -->
    <div class="grid grid-rows-3 grid-flow-col auto-cols-fr gap-4 max-w-4xl mx-auto border p-4 bg-white shadow-lg rounded-lg h-96">
        
        <!-- 第 1 列 -->
        <div class="bg-green-300 text-green-900 flex items-center justify-center rounded font-bold shadow-sm">1</div>
        <div class="bg-green-300 text-green-900 flex items-center justify-center rounded font-bold shadow-sm">2</div>
        <div class="bg-green-300 text-green-900 flex items-center justify-center rounded font-bold shadow-sm">3</div>

        <!-- 第 2 列 -->
        <!-- 元素 4: 跨越 2 行 -->
        <div class="bg-green-500 text-white row-span-2 flex items-center justify-center rounded font-bold shadow-md">
            4 (跨 2 行)
        </div>
        
        <!-- 元素 5: 自动填补剩余的第 3 行位置 -->
        <div class="bg-green-300 text-green-900 flex items-center justify-center rounded font-bold shadow-sm">5</div>

        <!-- 第 3 列 -->
        <!-- 元素 6: 跨越 3 行 (整列) -->
        <div class="bg-green-600 text-white row-span-3 flex items-center justify-center rounded font-bold shadow-md">
            6 (跨 3 行)
        </div>

    </div>

    <div class="mt-8 text-left max-w-4xl 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>容器被强制分为 <strong>3 行</strong>。</li>
            <li><strong>第 1 列</strong>:元素 1, 2, 3 依次填满 3 行。</li>
            <li><strong>第 2 列</strong>:元素 4 设置 <code>row-span-2</code>,占据该列的第 1、2 行;元素 5 自动填入该列的第 3 行。</li>
            <li><strong>第 3 列</strong>:元素 6 设置 <code>row-span-3</code>,独占整列高度。</li>
        </ul>
    </div>

</body>
</html>

精确定位

如果说 row-span 是控制元素的“高度”,那么 row-startrow-end 就是控制元素的“垂直坐标”。它们允许你指定元素从哪条水平线开始,或在哪个水平线结束。

核心技巧

  • row-start-n:元素从第 n 条水平线开始向下延伸。

  • row-end-n:元素在第 n 条水平线处结束。

  • 组合使用:可以结合 row-span 使用,也可以单独指定 start 和 end 来精确控制位置,甚至制造“重叠”或“留白”效果。

代码示例

自定义起始与结束位置

本示例在一个 4 行网格中,演示了如何强制元素从特定位置开始或结束。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Tailwind Row Start/End 演示</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 row-start / row-end 类应用</p>
    <p class="mb-4 text-sm text-gray-500">
        容器为 4 行网格,列优先填充。观察元素如何通过定位类跳过或覆盖特定行区域。
    </p>

    <!-- 
      主容器:
      - grid-rows-4: 定义 4 行,意味着有 5 条水平网格线 (1-5)
      - grid-flow-col: 列优先填充
    -->
    <div class="grid grid-rows-4 grid-flow-col auto-cols-fr gap-4 max-w-4xl mx-auto border p-4 bg-white shadow-lg rounded-lg h-[500px] relative">
        
        <!-- 网格线标记 (仅用于视觉辅助) -->
        <div class="absolute inset-0 pointer-events-none flex flex-col justify-between py-2 text-xs text-gray-400 font-mono z-0">
            <span class="border-t border-dashed border-gray-300 w-full">Line 1 (Top)</span>
            <span class="border-t border-dashed border-gray-300 w-full">Line 2</span>
            <span class="border-t border-dashed border-gray-300 w-full">Line 3</span>
            <span class="border-t border-dashed border-gray-300 w-full">Line 4</span>
            <span class="border-t border-dashed border-gray-300 w-full">Line 5 (Bottom)</span>
        </div>

        <!-- 第 1 列 -->
        <!-- 元素 1: 从第 2 条线开始,跨越 2 行 (占据第 2, 3 行) -->
        <div class="bg-green-500 text-white row-start-2 row-span-2 flex items-center justify-center rounded font-bold shadow-md z-10">
            1 (Start: 2, Span: 2)
        </div>
        
        <!-- 元素 2, 3: 自动填充剩余空间 -->
        <!-- 由于元素 1 占据了中间,自动流可能会调整,具体取决于浏览器实现和空缺处理 -->
        <div class="bg-green-300 text-green-900 flex items-center justify-center rounded font-bold z-10">2</div>
        <div class="bg-green-300 text-green-900 flex items-center justify-center rounded font-bold z-10">3</div>

        <!-- 第 2 列 -->
        <!-- 元素 4: 从第 2 条线开始,到第 4 条线结束 (占据第 2, 3 行) -->
        <!-- 注意:这里原文示例用了 col-end-4,但在行控制语境下,我们主要关注 row-start/end。
             为了演示 row-end,我们假设它只控制行。如果同时控制列,需配合 col-start/end -->
        <div class="bg-green-600 text-white row-start-2 row-end-4 flex items-center justify-center rounded font-bold shadow-md z-10">
            4 (Start: 2, End: 4)
        </div>

        <div class="bg-green-300 text-green-900 flex items-center justify-center rounded font-bold z-10">5</div>
        <div class="bg-green-300 text-green-900 flex items-center justify-center rounded font-bold z-10">6</div>
        <div class="bg-green-300 text-green-900 flex items-center justify-center rounded font-bold z-10">7</div>

        <!-- 第 3 列 -->
        <!-- 元素 8: 从第 2 条线开始,跨越 3 行 (占据第 2, 3, 4 行) -->
        <div class="bg-green-700 text-white row-start-2 row-span-3 flex items-center justify-center rounded font-bold shadow-md z-10">
            8 (Start: 2, Span: 3)
        </div>

    </div>

    <div class="mt-8 text-left max-w-4xl 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>row-start-2</code>: 忽略第 1 行,强制从第 2 条水平线开始。</li>
            <li><code>row-end-4</code>: 强制在第 4 条水平线前结束(即占用到第 3 行底部)。</li>
            <li>网格线编号总是比行数多 1。</li>
            <li>在 <code>grid-flow-col</code> 模式下,<code>row-start</code> 非常有用,因为它可以打破默认的紧密堆积,创造垂直方向的留白或错位。</li>
        </ul>
    </div>

</body>
</html>

总结

  • Span vs Position

    • row-span-{n} 关注“高度”(占据多少行)。

    • row-start-{n}row-end-{n} 关注“垂直坐标”(从哪开始,在哪结束)。

  • 网格线编号:始终记住水平网格线数量 = 行数 + 1。对于 grid-rows-12,线号范围是 1 到 13。

  • row-span-full:快捷方式,等同于 row-start-1 row-end-13(在 12 行系统中),用于创建通栏高度的侧边栏或背景。

  • grid-flow-col 的配合row-startrow-span 在列优先布局(grid-flow-col)中威力最大,常用于创建错落有致的杂志风格布局或复杂的仪表盘组件。

  • 响应式支持:所有行控制类都支持响应式前缀(如 lg:row-span-2),允许在不同屏幕尺寸下动态调整元素的高度和位置。


思考题

  1. 在一个 grid-rows-4 的容器中,如果你想让一个元素从第 2 行开始,并一直延伸到容器的最底部(不管容器有多少行),你应该使用哪两个类的组合?

  2. row-span-2row-start-1 row-end-3 在视觉效果上是否相同?如果在响应式断点中,父容器的行数从 3 变为 6,这两个类的行为会有什么潜在的区别吗?

  3. 假设你有一个 grid-rows-12 的仪表盘布局,想要创建一个侧边栏占据顶部 3 行,主内容区域占据底部 9 行(在同一列中)。请使用 row-startrow-span ( 或 row-end) 写出这两个元素的类名配置方案。