CSS Grid 布局里的行列跨度,并不是直接给元素写一个“占几列”的独立数值,而是通过网格线来描述元素在网格中的起点和终点。只要确定元素从哪一条列网格线开始,到哪一条列网格线结束,就能算出它占据多少列;行方向同理。理解网格线编号、起止线关系以及 span 的语义,是准确计算行列跨度的关键。

网格线编号与跨度的本质
在 Grid 容器中,轨道之间会形成网格线。若使用 grid-template-columns 定义了 3 列,就会出现 4 条列网格线;若使用 grid-template-rows 定义了 2 行,就会出现 3 条行网格线。列网格线通常沿水平方向从左到右编号,行网格线沿垂直方向从上到下编号。正向编号从 1 开始,因此 3 列对应 1、2、3、4 四条列线,2 行对应 1、2、3 三条行线。
很多初学者容易把“第几个单元格”和“第几条网格线”混在一起。以 3 列网格为例,第 1 个单元格位于第 1 条列线和第 2 条列线之间,第 2 个单元格位于第 2 条列线和第 3 条列线之间。如果一个元素要从第 1 列开始连续占据 2 列,它并不是从第 1 条线到第 2 条线,而是从第 1 条线延伸到第 3 条线。也就是说,跨度计算看的是线之间的距离,而不是单纯看单元格序号。
行方向的逻辑完全一致。一个元素如果从第 1 行开始占 2 行,它的行网格线范围是从 1 到 3,因为第 1 行在第 1 条行线和第 2 条行线之间,第 2 行在第 2 条行线和第 3 条行线之间。把握住“元素边界落在网格线上”这一点,后续无论是使用数字编号、负数编号,还是使用 span 关键字,都不容易出错。
起止网格线、span 与跨度公式
设置元素跨度的常用属性是 grid-column 和 grid-row。它们分别是 grid-column-start、grid-column-end 以及 grid-row-start、grid-row-end 的简写形式,常见语法是“起始线 / 结束线”。当起止线都是普通数字时,跨度公式非常直观:结束线编号减去起始线编号,等于元素占据的轨道数量。
例如,让某个元素从第 1 条列网格线开始,占据 2 列,可以写成 grid-column: 1 / 3。这里结束线是 3,起始线是 1,3 减 1 得到 2,因此元素横跨 2 列。若让元素从第 1 条行网格线开始占据 2 行,则写成 grid-row: 1 / 3。这种写法的优势是边界清晰,尤其适合在固定网格中做精确布局。
.grid-area {
display: grid;
grid-template-columns: repeat(3, 120px);
grid-template-rows: repeat(2, 120px);
gap: 12px;
}
/* 占据第 1 列和第 2 列,共 2 列 */
.area-item-a {
grid-column: 1 / 3;
}
/* 占据第 1 行和第 2 行,共 2 行 */
.area-item-b {
grid-row: 1 / 3;
}
除了直接写结束线,还可以使用 span 关键字表达“向后跨越多少条轨道”。例如 grid-column: 1 / span 2 表示从第 1 条列网格线开始,向后跨越 2 列,效果与 grid-column: 1 / 3 相同。若把 span 写在起始位置,如 grid-column: span 2 / 3,则表示结束线固定在第 3 条列网格线,向前推出 2 列。理解 span 的方向性,可以帮助我们在只知道“要占几列”但不知道准确结束线时快速布局。
.span-demo {
display: grid;
grid-template-columns: repeat(4, 100px);
grid-template-rows: repeat(3, 80px);
gap: 10px;
}
/* 从第 1 条列线开始,向后占 2 列 */
.span-item-a {
grid-column: 1 / span 2;
}
/* 从第 2 条行线开始,向后占 2 行 */
.span-item-b {
grid-row: 2 / span 2;
}
/* 结束在第 4 条列线,向前占 2 列 */
.span-item-c {
grid-column: span 2 / 4;
}
在实际项目中,起止线写法和 span 写法可以混合使用。若布局边界非常明确,比如页头必须从第 1 条列线到第 5 条列线,直接写数字更直观;若组件只是要求“占两列”,并且后续可能随自动布局流动,使用 span 会更有弹性。无论哪种写法,最终都要回到同一个计算逻辑:元素占据的轨道数,由它在网格线上的覆盖范围决定。
反向编号、隐式网格与常见换算
网格线除了正向编号,还支持负数编号。负数编号从网格末端开始,最右侧的列网格线是 -1,向左依次是 -2、-3;最底部的行网格线是 -1,向上依次是 -2、-3。使用负数编号时,跨度仍然可以用结束线减起始线来理解。例如在 3 列网格中,想让元素占据最后 2 列,可以让它从 -3 到 -1,计算结果是 (-1) - (-3) = 2。
.reverse-grid {
display: grid;
grid-template-columns: repeat(3, 120px);
grid-template-rows: repeat(3, 80px);
gap: 10px;
}
/* 占据最后 2 列 */
.reverse-item-a {
grid-column: -3 / -1;
}
/* 占据最后 1 行 */
.reverse-item-b {
grid-row: -2 / -1;
}
隐式网格是另一个需要纳入跨度理解的场景。当元素指定的网格线超出现有显式网格范围时,Grid 会自动生成新的轨道。例如容器只定义了 3 列,但某个元素设置 grid-column: 1 / 5,那么它仍然会按照 5 减 1 得到 4 列的跨度,同时容器会自动补足第 4 列轨道。此时,跨度计算规则没有变化,变化的是网格线总数和轨道生成方式。如果需要控制这些自动生成的轨道尺寸,可以配合 grid-auto-columns 和 grid-auto-rows 使用。
下面这张表整理了常见的列跨度写法。行方向只需把 grid-column 换成 grid-row,逻辑完全一致。
| 布局需求 | 常见写法 | 计算逻辑 | 占据列数 |
|---|---|---|---|
| 占 1 列 | 1 / 2 | 2 减 1 等于 1 | 1 |
| 占 2 列 | 1 / 3 或 1 / span 2 | 3 减 1 等于 2,或直接声明跨 2 列 | 2 |
| 从第 2 列开始占 2 列 | 2 / 4 或 2 / span 2 | 4 减 2 等于 2 | 2 |
| 占最后 1 列 | -2 / -1 | (-1) 减 (-2) 等于 1 | 1 |
| 占最后 2 列 | -3 / -1 | (-1) 减 (-3) 等于 2 | 2 |
完整示例与布局校验方法
把上述规则放到一个完整页面中,可以更清楚地看到行列跨度如何影响布局。下面的示例创建了一个网格容器,并安排若干子元素。第一个元素跨 2 列 2 行,第二个元素跨 2 列,第三个元素跨 2 行。为了减少自动布局带来的不确定性,这里显式定义了 4 列和 4 行,使每个元素都有明确的落点。
在阅读代码时,可以重点检查每个元素的起止网格线。例如第一个元素的列范围是 1 到 3,行范围也是 1 到 3,因此它占据 2 列 2 行。第二个元素的列范围是 3 到 5,占据 2 列。第三个元素的行范围是 3 到 5,占据 2 行。只要把每一条范围代入“结束线减起始线”的公式,就能快速验证布局是否符合预期。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>CSS Grid 行列跨度示例</title>
<style>
.grid-page {
display: grid;
grid-template-columns: repeat(4, 120px);
grid-template-rows: repeat(4, 80px);
gap: 12px;
}
.grid-page .cell {
background: #f2f2f2;
display: flex;
align-items: center;
justify-content: center;
border-radius: 6px;
}
/* 跨 2 列 2 行:列线 1 到 3,行线 1 到 3 */
.cell-large {
grid-column: 1 / 3;
grid-row: 1 / 3;
background: #dbeafe;
}
/* 跨 2 列:列线 3 到 5,行线 1 到 2 */
.cell-wide {
grid-column: 3 / 5;
grid-row: 1 / 2;
background: #e0f2fe;
}
/* 跨 2 行:列线 1 到 2,行线 3 到 5 */
.cell-tall {
grid-column: 1 / 2;
grid-row: 3 / 5;
background: #dcfce7;
}
/* 普通元素 */
.cell-normal-a {
grid-column: 2 / 3;
grid-row: 3 / 4;
}
/* 普通元素 */
.cell-normal-b {
grid-column: 2 / 4;
grid-row: 4 / 5;
}
</style>
</head>
<body>
<div class="grid-page">
<div class="cell cell-large">跨 2 列 2 行</div>
<div class="cell cell-wide">跨 2 列</div>
<div class="cell cell-tall">跨 2 行</div>
<div class="cell cell-normal-a">普通元素</div>
<div class="cell cell-normal-b">普通元素</div>
</div>
</body>
</html>
如果希望在保留原文隐式网格效果的同时练习跨度计算,也可以把容器定义为 3 列 3 行,再让部分元素使用超出显式网格的网格线。这样做时,浏览器会自动生成额外轨道,元素仍然按照起止线计算跨度。对于学习阶段,这种方式有助于理解显式网格和隐式网格的边界;对于生产环境,则建议尽量让关键布局落在明确的网格线范围内,必要时再使用自动轨道属性兜底。
调试 Grid 跨度时,最有效的方法是先在脑海中画出网格线,或者借助开发者工具的网格显示功能查看线条编号。确认元素的起始线、结束线以及是否触发隐式轨道后,再用公式核对一遍。只要能够稳定区分“网格线”和“单元格”,并且熟悉正数、负数、span 三类写法,行列跨度的计算就会变得非常直接。
总体来说,CSS Grid 的行列跨度计算并不复杂,核心在于把元素边界映射到网格线编号上。无论是使用数字起止线、负数边界,还是使用 span 声明轨道数量,最终都服务于同一个目标:让元素准确占据预期的行和列。掌握这一思路后,在面对复杂后台布局、卡片流布局或响应式栅格时,都能更从容地组织页面结构。
css_gridgrid_columngrid_rowgrid_template修改时间:2026-07-10 15:03:31