vertical-align只对inline-level和table-cell元素生效,div默认为block级,不参与行内格式化上下文,故该属性被忽略;其本质是控制行框内基线对齐,而非容器内居中。

vertical-align 只对 inline-level 和 table-cell 元素生效,td 默认是 display: table-cell,所以能用;但 div、p、span(没设 display: inline-block)等标签高度不同时,直接写 vertical-align: middle 会无效。
为什么 vertical-align 在 div 里不生效?
因为 vertical-align 不是“让元素在父容器里垂直居中”,而是控制行内框(line box)中各元素的基线对齐关系。它只作用于:
-
display: inline或inline-block的元素 -
display: table-cell的元素(比如td、th) - 表格相关 display 值(如
table-row)
而默认 div 是 display: block,p 也是块级,vertical-align 对它们完全没反应——浏览器会忽略该声明。
怎么让不同高度的 div 垂直对齐?
用 display: flex 是最直接可靠的解法,父容器设为 flex,子 div 自动按规则对齐:
- 父容器加
display: flex; align-items: center;→ 所有子div垂直居中(无视各自高度) - 加
justify-content: center;可同时水平居中 - 若需顶部/底部对齐,改用
align-items: flex-start或flex-end - 兼容性没问题:Chrome 29+ / Firefox 20+ / Edge 12+ / Safari 9+ / IE11(需
-ms-前缀)
示例:
<div style="display: flex; align-items: center; gap: 8px;"> <div style="height: 24px; background: #eee;">短</div> <div style="height: 48px; background: #ddd;">高</div> <div style="height: 36px; background: #ccc;">中等</div> </div>
如果必须用 vertical-align,怎么绕过限制?
把块级元素强制变成 inline-level 容器,再配合 vertical-align:
- 给每个
div加display: inline-block;,然后设vertical-align: middle; - 父容器要清除换行符产生的空白间隙(常见偏移源),可用
font-size: 0;或white-space: nowrap; - 注意:子元素若含文字,默认
line-height会影响实际对齐位置,建议显式设line-height: 1; - 此方案在 IE8+ 可用,但响应式布局中容易因宽度不足导致换行,不如 flex 稳定
示例:
<div style="font-size: 0;"> <div style="display: inline-block; vertical-align: middle; font-size: 14px;">A</div> <div style="display: inline-block; vertical-align: middle; font-size: 14px; height: 60px;">B</div> </div>
哪些场景下 vertical-align 看似有效,其实靠的是巧合?
比如在 span 里混用图标和文字时,vertical-align: middle 看起来“对齐了”,其实是:
-
img默认display: inline,且vertical-align: baseline,所以和文字基线对齐 - 设成
middle后,它对齐的是父行框的中线,而行框高度由其中最高元素决定——不是你想象的“整个容器中心” - 一旦插入
div或设置line-height,对齐就容易偏移 - 真正需要稳定对齐,还是得用 flex 或 grid
复杂内容、动态高度、多层嵌套——别硬扛 vertical-align,它设计初衷就不是干这个的。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











