普通文本
卡片宽度变化时,正文按允许的断行位置排版。
CSS Grid 响应式列宽先要明确两件事:列数是否固定,以及卡片内容能否换行。固定列数且允许轨道收缩时,可用 repeat(3, minmax(0, 1fr));希望卡片自动换列且窄容器不被固定下限撑开时,可用 repeat(auto-fit, minmax(min(100%, 16rem), 1fr))。这两种写法都不代替内容层的溢出处理。
CSS Grid 规范地址:https://drafts.csswg.org/css-grid-1/。下面只讨论轨道、最小宽度与溢出;示例代码未在本文中运行,图片为原创结构说明图,不是浏览器截图。
卡片列表出现横向滚动,可能是轨道总宽度超出容器,也可能是卡片内的一段长字符串伸出了自己的盒子。先看容器内容区宽度、列间 gap、列轨道尺寸和卡片自身的最小宽度,再看文字、图片或预格式化内容。不要第一步就给整个页面加 overflow-x:hidden,把被遮掉的内容当成问题已经消失。
例如三列各要求至少 16rem,再加两个 1rem 间隙,便需要至少 50rem 的内容区。这是按示例值作出的算术推导,不是设备断点或实测结果。容器不足时,固定三列不会自己变成两列;minmax 只给轨道范围,不负责改变重复次数。
.fixed-grid {
display: grid;
gap: 1rem;
/* 固定三列,轨道最小值为零,不让内容自动最小值决定列下限 */
grid-template-columns: repeat(3, minmax(0, 1fr));
}
裸写 1fr 的轨道隐含 auto 最小值,长内容可能影响它的最小尺寸。minmax(0, 1fr) 明确把轨道最小值设为零,但这不等于文字也变成零宽,更不表示三个卡片在任何屏幕上都适合阅读。如果产品需要窄屏减少列数,应另定列数规则,而不是强行坚持三列。
此外,1fr 是剩余空间分配因子,不是脱离其他约束的固定最大像素宽度;不能把 minmax(0, 1fr) 解释成“上限就是容器的三分之一,永远不会变”。定义见 Grid 轨道尺寸规范。

.cards {
display: grid;
gap: 1rem;
/* 16rem 是示例期望下限;更窄时允许采用容器宽度 */
grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr));
}
这里的 min() 先从容器宽度和 16rem 中取较小值,再作为 minmax 的最小参数。前提是容器在该轴上有可解析的可用宽度;复杂的固有尺寸嵌套不能简单套用一个“屏幕宽度除以卡片宽度”的公式。min() 的比较含义见 CSS Values 比较函数规范。
如果直接用 minmax(16rem, 1fr),auto-fit 即使只剩一列,也不会撤销 16rem 的下限;容器更窄仍可能超出。auto-fit 在放置项目后会折叠空的重复轨道,auto-fill 则保留这些轨道。它们的差别不只是“一个会换行,一个不会”,也不能通过更换关键字修复任意内容溢出。自动重复规则见 Grid 自动重复规范。
.card {
/* 允许项目本身收缩;不要把它误认为文本换行指令 */
min-width: 0;
box-sizing: border-box;
padding: 0.75rem;
border: 1px solid #d6dce5;
}
.card p {
/* 允许长标识在需要时断开,不改变实际字符串内容 */
overflow-wrap: anywhere;
}
.card img {
/* 图片不超过卡片内容区,保持比例 */
max-width: 100%;
height: auto;
}
.card pre {
/* 预格式化代码保留格式,在组件内提供横向滚动 */
max-width: 100%;
overflow-x: auto;
}
min-width:0 处理项目的最小宽度约束,overflow-wrap 处理文本断行,图片的 max-width 约束替换内容尺寸,pre 的 overflow-x 则保留代码格式。它们分别服务不同内容,不能拿一个属性代替全部。
卡片如果还被写死 width:420px,或者内部存在无法缩小的嵌套组件,上面的轨道公式并不会自动抹掉这些要求。也不要给所有后代强制断词:代码、编号和正文的可读性要求并不相同。最小尺寸定义见 CSS Sizing 规范,文本断行见 CSS Text 规范。

可以将前面的 .cards 与 .card 样式用于以下最小 HTML。它刻意同时包含普通文本、无空格标识和预格式化代码;读者可在自己的页面调整容器宽度观察。这里不声称已经得到任何浏览器运行结果。
普通文本
卡片宽度变化时,正文按允许的断行位置排版。
长标识
parcel_record_reference_without_spaces_abcdefghijklmnopqrstuv
代码内容
record = "a_preserved_line_that_can_scroll_inside_the_card"
观察重点是:网格容器是否超出父级,长标识是否仍撑开页面,代码是否仅在卡片内部滚动,以及剩余项目较少时卡片宽度是否符合设计。普通卡片数量减少不应被误判成 auto-fit 失效,空轨道折叠本来就可能让其余轨道分到更多空间。
| 检查项 | 对应处理 | 仍需关注 |
|---|---|---|
| 固定列轨道被内容顶宽 | minmax(0, 1fr) | 列数是否应随容器变化 |
| 单列仍超过窄容器 | min(100%, 16rem) 作为下限 | 父级宽度、gap 与盒模型 |
| 长标识伸出卡片 | 文本换行策略 | 是否有 nowrap 或固定宽度 |
| 代码不宜被折断 | 组件内横向滚动 | 滚动内容能否访问 |
不能。弹性长度不能放在 minmax 的最小参数位置。需要弹性轨道时,应选择合法的最小值再设置最大侧的弹性因子。
不一定。应辨别受到最小尺寸约束的是容器本身、直接网格项目还是内部嵌套组件;属性写在错误层级,可能完全没有触及问题。
auto-fit 折叠的是整条空轨道,不是把每一行独立变成弹性行。若上面某一行已经占据所有列,最后一行项目较少也不意味着这些列是空轨道。需要逐行独立铺满时,应重新选择布局策略,而不是继续叠加 minmax 参数。
CSS text-wrap: balance 怎样改善多行标题换行