先记住这个答案
Grid 给显式网格的边界线编号。正数从起点线开始,负数从终点线往回数,-1 就是显式网格最后一条线。三列会有四条列线,1 / -1 从第一条到第四条,覆盖三列。负号数的是线,不是“倒数第一格”;后续创建的隐式列也不会简单把显式末端变成别的线。
-1是显式网格末端线- 负数按网格线而非格子倒数
1 / -1跨显式列范围- 隐式轨道不改变显式末端线的含义
跨全宽标题最常用的写法
在三列卡片布局中,标题要占满整行,不需要知道模板未来会改成四列还是五列。起点写 1,终点写 -1,仍覆盖显式网格的全部列。项目若只需占最后一列,则可使用 -2 / -1。这样写比数具体末尾正编号更方便维护。
.cards {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 12px;
}
.cards > h2 { grid-column: 1 / -1; }
.cards > .last { grid-column: -2 / -1; }
/* h2 跨三列,last 放在显式末列 */这里 -1 对应第四条列线,-2 对应第三条。格子的边界线数量总比轨道数量多一。改变列宽不会改变编号规则;改变显式列数后,-1 会自动指向新的显式末端。
隐式列与书写方向的边界
若某项目明确写 grid-column: 6 / 7,Grid 可能生成显式模板之外的隐式列。另一个项目仍写 1 / -1,它跨的是显式网格,而不是自动覆盖所有新增隐式列。想覆盖实际内容延伸的全部范围,应先修正模板或定位规则,不要误以为 -1 永远代表最远处的隐式边。
正负编号按网格的逻辑起止方向理解。横排从左到右的常见页面里,列起点在左、末端在右;换成 RTL 或不同书写模式,物理方位会变化。回答时说“显式网格末端线”比说“最右边”更准确。
有个容易混淆的情形:显式模板是三列,某张卡片用正线号放到第六列,页面看起来已有六列;此时标题写 grid-column: 1 / -1 仍只跨模板的三列。负线号锚在显式网格末端,不追着隐式列跑。调试时在浏览器 Grid 覆盖层里同时显示显式线和隐式轨道,再查看项目的起止线,比从截图推断 -1 对应物理最右边准确。
还有一种误会来自 repeat(auto-fill, ...):自动重复生成的列属于显式网格,视口变宽后重复次数增加,-1 指向的显式末端也会变化。这与项目定位到模板外创建隐式列不同。前者随模板计算扩展显式轨道,后者在显式边界外补轨道。判断 1 / -1 能跨到哪里,先看列是由模板生成还是由越界定位生成。
容易答错的地方
- 把
-1当最后一格 - 它是最后一条线。要放入最后一格,需用
-2 / -1两条边界线。 - 认为新增隐式列会被
1 / -1自动包含 - 负编号以显式网格边界为参照,显式模板外的轨道不能按这个写法自动覆盖。
面试官还会怎么问?
四列网格共有几条列线?
共有五条。-1 对应第五条,-2 对应第四条。
grid-row: 1 / -1 也成立吗?
成立,它按显式行网格的首尾线定位;若没有明确显式行,结果要结合当前网格定义判断。
RTL 布局里 -1 还在右边吗?
不一定。编号跟逻辑起止边走,列轴的物理方向可随书写方向变化。
参考资料
示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。