理解 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 属性简化为直观的类名,让开发者可以像搭积木一样控制每个网格项的位置和大小。
注意:网格线的编号从 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-start 和 col-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),允许在不同屏幕尺寸下动态调整元素的跨度和位置。
在一个 grid-cols-4 的容器中,如果你想让一个元素从第 2 列开始,并一直延伸到容器的最右边缘(不管容器有多少列),你应该使用哪两个类的组合?(提示:考虑使用 col-start 和 col-end 的特殊值或 span)。
col-span-2 和 col-start-1 col-end-3 在视觉效果上是否相同?如果在响应式断点中,父容器的列数从 3 变为 6,这两个类的行为会有什么潜在的区别吗?
假设你有一个 grid-cols-12 的布局,想要创建一个侧边栏占据左侧 3 列,主内容占据右侧 9 列。请使用 col-start 和 col-span ( 或 col-end) 写出这两个元素的类名配置方案。