align-items: center 必须设在 label 和 input 的直接父容器上,且父容器需设 display: flex 并有明确高度;否则因非 flex 容器、高度塌陷、轴向理解错误或元素脱离文档流而失效。
label 和 input 在表单里看起来“错位”,不是它们不听话,而是默认对齐基准不同——align-items 能统一这个基准,但必须用对地方、配对条件。
最常卡在这一步:父容器没设 display: flex,或者高度塌陷了。
display: flex —— align-items 只在 flex 容器上生效,加在 label 或 input 上完全无效auto 且没内容撑开它 —— 浏览器算不出“中间在哪”,align-items: center 就像在一张纸条上找中心点,物理上成立,视觉上没变化flex-direction: column 却还指望 align-items 垂直居中 —— 此时交叉轴是水平方向,align-items 管的是左右对齐,垂直对齐得靠 justify-content
label 或 input 被设了 position: absolute —— 脱离文档流后,flex 规则不作用于它必须设在 label 和 input 的直接父容器上,不能隔层。
.form 设了 align-items: center,但 label 和 input 包在 .field 里 —— align-items 不穿透,.field 内部仍按默认 baseline 对齐<div class="field"><label>用户名</label><input type="text"></div>然后对
.field 设 display: flex 和 align-items: center
label 加 vertical-align —— flex 布局下这个属性被忽略取决于你想要的视觉效果,不是“哪个更标准”。
align-items: center:适合希望文字中线和输入框中线对齐的场景(比如带 icon 的输入框、卡片式表单)align-items: flex-start:更符合多数表单设计规范——label 文字顶部与 input 边框顶部对齐,尤其当 input 有 padding 或 border 时更稳定stretch(默认值)——label 是内联元素,拉伸后会变形;input 是替换元素,拉伸可能破坏圆角或光标位置min-height + align-items: center,而不是依赖 stretch
只写 align-items 往往不够,几个隐式样式会悄悄干扰对齐效果。
box-sizing: border-box —— 否则 padding 和 border 计算方式不同,导致实际高度不一致line-height(尤其对 label)—— 默认值依赖字体,不同浏览器可能不同,影响基线位置em / rem 和 px 设置 font-size 或 padding —— 缩放或继承时容易失准input 用了 height,确保 label 行高能匹配,否则 align-items: center 会让文字“浮”在输入框中间偏上真正麻烦的不是 align-items 本身,而是它暴露了那些平时被忽略的隐式样式差异——一旦父容器高度、子元素盒模型、字体度量都明确下来,对齐就只是开关一开的事。但少一个条件,它就静默失效,连报错都没有。