absolute + top/left + transform 居中是最常用稳妥方案,先用 top: 50%、left: 50% 将元素左上角移至容器中心,再通过 transform: translate(-50%, -50%) 反向偏移自身宽高一半,需父容器设 position: relative,且不触发回流、兼容性好。
这是最常用也最稳妥的方案,适用于已知或未知宽高的元素。核心思路是先用 top: 50% 和 left: 50%

transform: translate(-50%, -50%) 向左上反向偏移自身宽高的一半。
position: relative(或其他非 static 值),否则 absolute 会相对于最近定位祖先或 viewport 定位transform 的百分比基于元素自身尺寸,和 top/left 的基于父容器不同,这点容易混淆transform 属于合成层操作),性能优于修改 margin 或 top/left 数值.container {
position: relative;
width: 300px;
height: 200px;
}
.centered {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
当元素宽高固定时,可直接用负 margin 拉回一半尺寸。原理简单,但灵活性差,一旦宽高变化就必须同步改 CSS。
200px、高 100px,则需 margin: -50px 0 0 -100px(顺序为 top right bottom left)top: 50% 和 left: 50% 使用,否则负 margin 只是把元素往左上推,不保证居中.centered-fixed {
position: absolute;
top: 50%;
left: 50%;
width: 200px;
height: 100px;
margin: -50px 0 0 -100px;
}
inset 是 top/right/bottom/left 的简写,配合 margin: auto 可让浏览器自动计算偏移量完成居中。它本质上依赖块级元素的自动 margin 行为,所以必须同时设宽高(或至少限制尺寸)。
width/height 或 min-height),否则 inset: 0 会让子元素拉满,margin: auto 失效transform 方案少一次重绘,但不如后者兼容广泛.centered-inset {
position: absolute;
inset: 0;
width: 200px;
height: 100px;
margin: auto;
}
单纯设置 top: 50px; left: 50px 或 top: 50%; left: 50% 只是把元素左上角挪到中心点,不是让元素“整体居中”。除非元素本身宽高为 0,否则视觉上一定偏右下。
top: 50% 指的是父容器高度的 50%,不是元素自身的 50% —— 这个百分比基准容易误读transform 或负 margin),就永远只是“锚点居中”,不是“内容居中”height,top: 50% 可能计算为 0(取决于文档流和格式化上下文)top/left 看父容器,transform 看自己,margin 看盒模型约束 —— 混用时基准错位,居中就飘了。