CSS Grid 使用百分比 gap 时为什么会内容溢出?
结论
gap: 10% 5% 使用百分比间距,而 inline-grid 的宽度会根据内容进行固有尺寸计算。在这个计算阶段,百分比间距可能按 0 处理。网格尺寸确定后,浏览器再根据网格容器的内容盒宽度计算间距,实际间距因此会额外增加,导致内容溢出。
fr 会在网格可用空间中分配轨道尺寸,但不能保证百分比间距已计入 inline-grid 的固有宽度。
为什么会溢出
代码中的 gap: 10% 5% 分别设置行间距和列间距,其中列间距 5% 以网格容器的内容盒宽度为基准。display: inline-grid 会让网格参与行内格式化,因此网格宽度通常要根据内容计算,而不是直接填满父容器。
百分比间距和依赖内容的尺寸计算会形成循环关系:计算百分比间距需要先知道网格宽度,但网格宽度又会受到内容和间距的影响。为处理这种情况,固有尺寸计算阶段可能先按零计算百分比间距,等到布局阶段再解析实际值。这样一来,网格实际需要的宽度就可能超过先前估算的宽度。
调整方式
如果不需要百分比间距,通常可以改用固定间距:
.grid {
display: inline-grid;
grid-auto-flow: column;
grid-template-columns: minmax(0, 1fr) max-content minmax(0, 1fr);
grid-template-rows: repeat(4, 1fr);
gap: 10px 5px;
}
.grid select {
grid-row: 1 / -1;
}
minmax(0, 1fr) 允许两侧的弹性轨道缩到内容最小宽度以下,有助于处理轨道自身最小尺寸导致的溢出。它无法单独解决百分比 gap 与固有尺寸计算之间的问题,因此示例也将间距改成了固定值。
如果必须使用百分比间距,可以为网格指定明确的宽度,让间距有稳定的百分比基准,例如:
.grid {
display: grid;
width: 100%;
box-sizing: border-box;
grid-auto-flow: column;
grid-template-columns: minmax(0, 1fr) max-content minmax(0, 1fr);
grid-template-rows: repeat(4, 1fr);
gap: 10% 5%;
}
.grid select {
grid-row: 1 / -1;
}
这种做法要求父容器的宽度可以确定。如果父容器的宽度也由内容决定,百分比间距仍可能遇到类似的尺寸计算问题。若要让网格占满父容器,通常可以直接设置网格宽度,而不让 inline-grid 根据内容收缩。
注意事项
示例中的 grid-row: 1 / -1 会让 select 跨越显式网格的全部行。如果仍有溢出,可以暂时移除这项设置,并检查内容的最小尺寸。minmax(0, 1fr) 主要用于处理弹性轨道的最小尺寸,不能自动修正所有子项溢出。
备注:内容仅供参考。
