vertical-align: middle 必须作用于 或 (display: table-cell 元素)才生效;写在 或 上无效,因其仅对表格单元格生效;常见失效原因包括子元素为块级、单元格高度不足、使用废弃的 valign 属性或容器 display 被错误设为 block。

vertical-align: middle 必须作用在 <td> 或 <code><th> 上才有效,写在 <code><tr> 或 <code><table> 上完全没反应。
<h3>为什么 <code>vertical-align: middle 经常“不生效”
不是 CSS 写错了,而是被常见干扰项盖过去了:
<td> 里嵌套了 <code><div> 或 <code><p></p>:这些子元素默认是块级,vertical-align对它们无效;得把<td> 自己设成 <code>display: flex才能控制内部布局- 单元格高度太小,比如只有一行文本加默认
line-height:内容没空间“居中”,视觉上就看不出效果;加padding: 8px 12px或min-height: 40px就稳了 - 用了
border-collapse: collapse但没注意边框本身占像素:临时加outline: 1px solid red能看清真实单元格范围,避免误判 - 写了
valign="middle":HTML5 已废弃,React/Vue 会直接忽略,且和 CSS 冲突时行为不可预测
水平 + 垂直居中最轻量写法
纯文本表格用这个组合最省事、兼容性最好(IE9+ 都支持):
<td style="text-align: center; vertical-align: middle;">数据</td>
关键点:
- 两个声明必须同时存在,缺一不可
- 不能只写在
<tr> 上——<code>vertical-align只对display: table-cell生效,而<tr> 是 <code>table-row - 如果整张表都要居中,统一用 CSS 类更干净:
td, th { text-align: center; vertical-align: middle; } - 用 Flex:
<td style="display: flex; align-items: center; justify-content: center; min-height: 40px;"> <br>注意:<code>display: flex会覆盖vertical-align,二者不能共存 - 用 Grid(代码更短):
<td style="display: grid; place-items: center; min-height: 40px;"> <br>但 IE11 不支持 <code>place-items,老系统慎用 - 别给
<td> 设 <code>display: block——这会让它彻底失去表格单元格语义,vertical-align和 flex/grid 都救不回来表格整体居中别只靠
margin: 0 auto这个写法看似简单,但最容易踩坑:
- 必须配合明确宽度,比如
width: fit-content或width: 80%;写width: 100%+margin: 0 auto等于没写 - 父容器是
flex或grid时,优先用justify-content: center控制,别在<table> 上硬加样式 <li>检查有没有 <code>float、display: inline-table或overflow-x: auto的父容器——这些都会让margin: 0 auto失效
真正容易被忽略的是:垂直居中是否“可见”,取决于单元格是否有可感知的高度参考。没有
padding、没有min-height、也没有内容撑开,再标准的vertical-align: middle也出不来效果。 - 必须配合明确宽度,比如
复杂内容(图标+按钮+多行文本)怎么稳居中
一旦单元格里塞了 <img>、<button></button> 或多个 <p></p>,vertical-align 就失效了,得升级容器能力:











