约 6 分钟读完 · 更新于 2026-10-21 · 文中每条都能在下面的配套工具里动手验证
块级容器里的行内内容(文字、图片、inline / inline-block 元素)水平居中,用 text-align: center 加在容器上。注意它作用于「容器里的行内内容」,不是元素自己;给块级元素自己设 text-align 只会影响它的子内容。
.wrap { text-align: center; }
/* 图片记得设 display:inline-block 或保持默认 inline 才受 text-align 影响 */有确定宽度的块级元素水平居中用 margin: 0 auto——auto 把剩余空间平分给左右。不生效的最常见原因有两个:元素没有设宽度(auto 占满一行,没有剩余空间可分);或元素是 Flex/Grid 的子项,此时水平对齐由容器控制,margin auto 只在特殊用法里有意义。
.card {
width: 320px;
margin: 0 auto; /* 左右 auto 平分剩余空间 */
}2016 年之后,垂直居中的默认答案是 Flex:容器三行,子项无论尺寸未知、多行还是动态高度都成立。水平垂直同时居中就两个属性一起上。Grid 同样可以:place-items: center 一行等价于两个轴一起居中,容器只有一个子项时最简洁。
.wrap {
display: flex;
justify-content: center; /* 主轴(默认水平) */
align-items: center; /* 交叉轴(默认垂直) */
}.wrap {
display: grid;
place-items: center; /* align + justify 一步到位 */
}必须脱离文档流的浮层用绝对定位居中。经典写法是 top 50% + translate(-50%, -50%),位移基于自身尺寸,宽高未知也成立;现代写法 inset: 0 + margin: auto 配合定宽高,或干脆 inset: 0 + display: grid + place-items: center 让容器自己当居中层。transform 方案的唯一坑:translate 会创建层叠上下文,内部再写 z-index 时要意识到这一点。
.modal {
position: fixed;
top: 50%; left: 50%;
transform: translate(-50%, -50%);
}.modal {
position: fixed;
inset: 0;
margin: auto;
width: fit-content; height: fit-content;
}| 症状 | 最可能的原因 | 修复 |
|---|---|---|
| margin: auto 不居中 | 元素没有定宽,或 display 不是 block | 设 width;行内元素先改 display: block |
| text-align: center 不生效 | 目标不是行内内容,而是块级子元素 | 给子元素 margin auto,或把容器改 Flex |
| Flex 里 align-items 没垂直居中 | flex-direction: column 后主轴变成了垂直 | 列方向用 justify-content,行方向用 align-items |
| 子项被拉伸而不是居中 | align-items 默认值 stretch 生效 | 显式写 align-items: center |
| 绝对定位偏移到一个角落 | 父级没有 position: relative | 给最近的定位祖先补 relative |
| 百分比 top 时有时无 | 父级高度不定,百分比解析为 auto | 给父级定高,或改用 Flex/Grid 居中 |
文字用 text-align,定宽块用 margin auto,其余一律 Flex(单子项可用 Grid place-items),浮层用绝对定位三件套。把「十种居中方法」收敛成这四条,以后写居中不需要回忆,只需要判断场景。
只有单个子项时两者等价,Grid 的 place-items: center 更短;多个子项要按主轴排列时用 Flex。性能差异可以忽略,选表达力更强的那个。
会创建层叠上下文:元素内部的 z-index 只在这个上下文里比较。浮层本身与页面其他浮层的层级关系要在更外层控制。
把父容器设为 Flex 后 align-items: center + justify-content: center,行内元素无需改 display 即可居中;或给行内元素 line-height 等于容器高(仅单行文字)。