vertical-align: middle 对普通流中的 input 无效,因其仅作用于行内级元素且依赖父容器行高;最稳方案是用 flex 布局(display: flex + align-items: center)包裹输入框,确保父容器有明确高度。

验证码输入框(input)本身不能靠 vertical-align: middle 在普通流中实现“容器内垂直居中”,它只是行内替换元素,对齐行为依赖父容器的行高和上下文——直接给 input 加 vertical-align 只在表格单元格或 inline-block 父容器里才有效,且效果不可靠。
为什么 vertical-align: middle 对单独的 input 常失效?
常见错误是把 input 放在普通 <div> 里,然后写:
<pre class="brush:php;toolbar:false;">input { vertical-align: middle; }</pre>
<p>这几乎没用,因为:<br>• <code>vertical-align 不作用于块级上下文中的独立块元素
• 它只影响行内级(display: inline 或 inline-block)元素在行框内的对齐位置
• 若父 <div> 没设 <code>line-height、没内容撑起行框,或里面混有块级元素,对齐就彻底失控
最稳的方案:用 Flex 布局包裹输入框
把验证码输入框和按钮等控件一起放进一个容器,用 Flex 控制对齐。这是现代项目首选,不依赖宽度、不需 JS 计算。
- 确保父容器有明确高度(如
min-height: 100vh),否则align-items: center无参考基准 - 容器设
display: flex+align-items: center+justify-content: center,即可同时水平+垂直居中 - 若只需垂直居中(比如表单已水平居中),去掉
justify-content即可 - 避免把
form自身设为flex容器——它语义是表单,不是布局单元;应包一层<div class="form-wrapper"> <p>示例结构:</p> <pre class="brush:php;toolbar:false;"><div class="form-wrapper"> <input type="text" id="captcha-input" placeholder="请输入验证码"><button id="submit-btn">提交</button> </div></pre> <pre class="brush:php;toolbar:false;">.form-wrapper { display: flex; align-items: center; min-height: 100vh; gap: 12px; }</pre> <h3>如果必须用表格布局(老系统兼容场景)</h3> <p>某些遗留系统仍用 <code><table> 布局表单,此时 <code>vertical-align: middle才真正生效,但要注意:- 必须作用于
<td>,而不是 <code><input>—— 写td { vertical-align: middle; } <tr> 或 <code><td> 需有足够高度(如 <code>height: 48px或padding: 12px),否则“居中”无空间可言- 禁用
valign="middle"属性(HTML5 已废弃,React/Vue 中会被忽略) - 若
<td> 里嵌了 <code><div> 或多行内容,<code>vertical-align失效,得改用display: flex覆盖该单元格真正容易被忽略的是:垂直居中不是输入框自己的事,而是它所处容器的布局责任。别在
input上死磕vertical-align,先确认它的父容器是否具备可对齐的上下文——Flex 是目前唯一无需猜高度、不依赖浏览器默认行高的解法。
- 必须作用于











