源本科技 | 码上会

Tailwind CSS 网格布局(列进阶)

2026/03/12
19
0

学习目标

  • 理解 CSS Grid 中 grid-column 属性的核心概念,包括网格线(Grid Lines)与轨道(Tracks)

  • 掌握 Tailwind CSS 中 col-span-{n} 类的使用,实现元素跨越多列的布局效果

  • 学会利用 col-start-{n}col-end-{n} 精确控制元素在网格中的起始和结束位置

  • 能够组合使用跨列与定位类,构建复杂的非对称网格布局(如杂志式排版、仪表盘)


核心概念

网格线与跨度

在 CSS Grid 布局中,理解“网格线”是掌握列控制的关键。

  • 网格线:想象网格是由垂直线划分的。在一个 grid-cols-4 的容器中,实际上有 5 条垂直线(从第 1 条到第 5 条)。

  • 跨度:指一个元素占据了多少个“轨道”(列宽)。

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

Tailwind CSS 将这些复杂的 CSS 属性简化为直观的类名,让开发者可以像搭积木一样控制每个网格项的位置和大小。

主要工具类

类别

类名示例

对应 CSS

作用

跨列 (Span)

col-span-1col-span-12

grid-column: span n / span n

让元素跨越 n 个列轨道

全宽跨列

col-span-full

grid-column: 1 / -1

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

自动跨列

col-auto

grid-column: auto

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

起始定位

col-start-1col-start-13

grid-column-start: n

强制元素从第 n 条网格线开始

结束定位

col-end-1col-end-13

grid-column-end: n

强制元素在第 n 条网格线结束

自动定位

col-start-auto, col-end-auto

grid-column-start/end: auto

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

注意:网格线的编号从 1 开始。如果容器定义为 grid-cols-3,则存在的网格线编号为 1, 2, 3, 4。使用 col-start-4 意味着从最后一根线开始(即最后一列的末尾),通常用于将元素推到最右侧。


跨列布局

col-span 是最常用的网格控制类,用于让某个元素占据多个列的宽度。这在创建“通栏标题”、“大卡片”或“侧边栏”时非常有用。

语法与用法

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

代码示例

混合跨度布局

本示例展示了一个 3 列网格,其中某些元素跨越了多列,打破了规整的矩阵结构。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>Tailwind Col 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 col-span 类应用</p>
    <p class="mb-4 text-sm text-gray-500">
        观察下方网格:元素 4 跨越 2 列,元素 6 跨越 3 列(整行)。
    </p>

    <!-- 
      主容器:
      - grid: 启用网格
      - grid-cols-3: 定义 3 列基础结构
      - gap-4: 间距
    -->
    <div class="grid grid-cols-3 gap-4 max-w-3xl mx-auto border p-4 bg-white shadow-lg rounded-lg">
        
        <!-- 普通元素:各占 1 列 -->
        <div class="bg-green-300 text-green-900 h-12 flex items-center justify-center rounded font-bold">1</div>
        <div class="bg-green-300 text-green-900 h-12 flex items-center justify-center rounded font-bold">2</div>
        <div class="bg-green-300 text-green-900 h-12 flex items-center justify-center rounded font-bold">3</div>

        <!-- 跨 2 列元素 -->
        <!-- 它将占据原本属于第 4 和第 5 个位置的空间(如果按流式排列) -->
        <div class="bg-green-500 text-white col-span-2 h-12 flex items-center justify-center rounded font-bold shadow-md">
            4 (跨 2 列)
        </div>

        <!-- 普通元素:自动填充剩余空间 -->
        <div class="bg-green-300 text-green-900 h-12 flex items-center justify-center rounded font-bold">5</div>

        <!-- 跨 3 列元素 (整行) -->
        <div class="bg-green-500 text-white col-span-3 h-12 flex items-center justify-center rounded font-bold shadow-md">
            6 (跨 3 列 / 整行)
        </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>前三个元素 (1, 2, 3) 填满第一行。</li>
            <li>元素 4 设置了 <code>col-span-2</code>,因此它占据第二行的前两列。</li>
            <li>元素 5 自动填入第二行的最后一列。</li>
            <li>元素 6 设置了 <code>col-span-3</code>,强制独占第三行。</li>
        </ul>
    </div>

</body>
</html>

精确定位

Col Start / End

如果说 col-span 是控制元素的“宽度”,那么 col-startcol-end 就是控制元素的“坐标”。它们允许你指定元素从哪条网格线开始,或在哪个网格线结束。

核心技巧

  • col-start-n:元素从第 n 条线开始向右延伸。

  • col-end-n:元素在第 n 条线处结束(不包含第 n 条线本身,即结束于 n-1 列)。

  • 组合使用:可以同时指定 start 和 end,或者指定 start + span,或者 end + span。

代码示例

自定义起始与结束位置

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

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

    <!-- 
      主容器:
      - grid-cols-4: 定义 4 列,意味着有 5 条垂直网格线 (1, 2, 3, 4, 5)
    -->
    <div class="grid grid-cols-4 gap-4 max-w-4xl mx-auto border p-4 bg-white shadow-lg rounded-lg relative">
        
        <!-- 网格线标记 (仅用于视觉辅助,实际开发不需要) -->
        <div class="absolute inset-0 pointer-events-none flex justify-between px-2 text-xs text-gray-400 font-mono">
            <span>| Line 1</span><span>| Line 2</span><span>| Line 3</span><span>| Line 4</span><span>| Line 5</span>
        </div>

        <!-- 元素 1: 从第 2 条线开始,跨越 2 列 (占据第 2, 3 列) -->
        <div class="bg-green-500 text-white col-start-2 col-span-2 h-12 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 h-12 flex items-center justify-center rounded font-bold z-10">2</div>
        <div class="bg-green-300 text-green-900 h-12 flex items-center justify-center rounded font-bold z-10">3</div>

        <!-- 元素 4: 从第 2 条线开始,到第 4 条线结束 (占据第 2, 3 列) -->
        <!-- 等价于 col-span-2 但显式指定了结束线 -->
        <div class="bg-green-600 text-white col-start-2 col-end-4 h-12 flex items-center justify-center rounded font-bold shadow-md z-10">
            4 (Start: 2, End: 4)
        </div>

        <!-- 元素 5, 6, 7: 正常排列 -->
        <div class="bg-green-300 text-green-900 h-12 flex items-center justify-center rounded font-bold z-10">5</div>
        <div class="bg-green-300 text-green-900 h-12 flex items-center justify-center rounded font-bold z-10">6</div>
        <div class="bg-green-300 text-green-900 h-12 flex items-center justify-center rounded font-bold z-10">7</div>

        <!-- 元素 8: 从第 2 条线开始,跨越 3 列 (占据第 2, 3, 4 列) -->
        <div class="bg-green-700 text-white col-start-2 col-span-3 h-12 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>col-start-2</code>: 忽略前面的空位,强制从第 2 条网格线开始。</li>
            <li><code>col-end-4</code>: 强制在第 4 条网格线前结束(即占用到第 3 列末尾)。</li>
            <li>当同时使用 <code>col-start</code> 和 <code>col-span</code> 时,结束位置由起始位置 + 跨度计算得出。</li>
            <li>网格线编号总是比列数多 1。</li>
        </ul>
    </div>

</body>
</html>

总结

  • Span vs Position

    • col-span-{n} 关注“宽度”(占据多少列)。

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

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

  • col-span-full:这是一个非常有用的快捷方式,等同于 col-start-1 col-end-13(在 12 列系统中),用于创建通栏布局,且无需关心具体的列数配置。

  • 灵活性:通过组合这些类,可以轻松实现“圣杯布局”、“媒体对象”或复杂的仪表盘设计,而无需修改 HTML 结构顺序。

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


思考题

  1. 在一个 grid-cols-4 的容器中,如果你想让一个元素从第 2 列开始,并一直延伸到容器的最右边缘(不管容器有多少列),你应该使用哪两个类的组合?(提示:考虑使用 col-startcol-end 的特殊值或 span)。

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

  3. 假设你有一个 grid-cols-12 的布局,想要创建一个侧边栏占据左侧 3 列,主内容占据右侧 9 列。请使用 col-startcol-span ( 或 col-end) 写出这两个元素的类名配置方案。