用每组.field设display:grid并配grid-template-columns:max-content 1fr可稳定label-input配对;整form设grid会因语义扁平化导致错乱;label右对齐应使用justify-self:end而非text-align:right;小屏单列需重置grid-column和justify-self;统一行高须设置grid-auto-rows。
直接用每组 .field 独立启用 display: grid,配合 grid-template-columns: max-content 1fr,就能稳住 label 和 input 的配对与对齐,不用预估宽度、不破坏语义、响应式切换也可靠。
form 设 display: grid 会错乱常见错误是给 form 设置 display: grid 和 grid-template-columns: max-content 1fr,结果所有 label 挤进第一列、所有 input 挤进第二列。这会导致:
label 直接跳到第一个 input
label[for] 失效grid-auto-rows 隐式生成的行高不一致,视觉上 label “掉下去”根本问题不是列定义错了,而是语义结构被扁平化——label 和 input 不再属于同一逻辑单元。
justify-self: end 才是 label 右对齐的正确写法很多人试 text-align: right 或 margin-left: auto,结果 input 缩窄、换行、Safari 中失效。真正可控的方式是分离「定位」和「尺寸」:
立即学习“前端免费学习笔记(深入)”;
label 设 justify-self: end —— 内容右贴列右边缘,不扩大占据空间input 设 min-width: 0 —— 防止被长 label 撑变形white-space: nowrap; overflow: hidden; text-overflow: ellipsis,否则超长 label 换行后会破坏列宽计算text-align: right 是作用于块内文字流,会拉伸 label 实际宽度,干扰网格轨道分配grid-column 定位为什么会失效只改 grid-template-columns: 1fr 不够,因为 .field label 仍按原列号(第 1 列)渲染,.field input 还在第 2 列,两者叠在一起。必须同步重置列定位规则:
.field label, .field input { grid-column: 1; }
justify-self: end 改为 justify-self: start,否则 label 跑到最右边空白处flex-direction: column 回退——那会脱离 grid 上下文,丢失列对齐能力grid-template-areas 显式控制区域,比纯列定位更稳定最容易被忽略的是行高统一:没设 grid-auto-rows 或 grid-template-rows,不同 label 高度(比如带辅助文本或 placeholder 换行)会让整行被撑开,下一行 label 就“往下掉一截”。这不是列的问题,是行轨道失控。