推荐用 display: flex 实现垂直+水平居中,父容器需设 display: flex、justify-content: center、align-items: center 且必须有明确高度(如 height: 100vh),否则 align-items: center 失效。

用 display: flex 实现垂直+水平居中(推荐)
Flex 是目前最直接、兼容性足够好(IE10+)、语义清晰的方案。关键不是“怎么写”,而是父容器必须有明确高度或可计算高度,否则子元素可能撑不开、看起来没居中。
- 父元素需设置
display: flex、justify-content: center(水平)、align-items: center(垂直) - 如果父容器高度依赖内容(比如
height: auto),且没有其他约束,align-items: center会失效——因为“垂直方向没空间可居中” - 单行文本或图标类元素,加
flex-direction: column就能自然垂直排列;多子元素也按顺序堆叠 - 示例:
.container { display: flex; flex-direction: column; justify-content: center; align-items: center; height: 100vh; /* 必须有高度 */ }
绝对定位 + transform 居中(适合脱离文档流)
适合模态框、提示层等需要脱离布局、不干扰其他元素的场景。它不要求父容器有高度,但父容器必须是相对定位上下文(position: relative),否则 top: 50% 会相对于 viewport 计算。
- 父元素加
position: relative - 子元素设
position: absolute、top: 50%、left: 50%,再用transform: translate(-50%, -50%)回拉自身宽高的一半 - 不写
transform是常见错误:只写top: 50%; left: 50%会让左上角落在中心,而非元素中心 - 垂直排列多个元素?得手动调
top或用flex套一层,纯绝对定位不适合动态数量的垂直列表
为什么不用 vertical-align: middle?
vertical-align 只对 inline、inline-block、表格单元格生效,对块级元素(div 默认)完全无效。很多人试了没反应,其实是用错了上下文。
- 常见误用:
div { vertical-align: middle; }→ 无效 - 正确姿势(极少用):把子元素设成
display: inline-block,父元素设font-size: 0消除基线间隙,再配vertical-align: middle——但代码冗长、易受字体影响,不如 flex 直接 - 表格布局(
display: table-cell)也能用vertical-align,但语义错位、响应式差,已不推荐
IE8–9 兼容怎么办?
Flex 和 transform 在 IE9 及以下基本不可用。如果真要支持:
- 用
display: table+display: table-cell模拟,父设display: table; width: 100%; height: 100%;,子设display: table-cell; vertical-align: middle; text-align: center; - 绝对定位退化方案:用
margin手动计算(需固定宽高),例如margin: -25px 0 0 -50px; width: 100px; height: 50px; - 但注意:这些方案在现代项目里成本远高于升级兼容要求——除非客户明确锁定旧 IE,否则别为它增加维护负担
居中本身简单,难的是判断「谁该有高度」「谁该脱离流」「要不要响应式」。很多问题其实出在父容器高度没控制好,而不是居中写法错了。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











