absolute元素用left:50% top:50%偏右下因定位的是左上角;需配合transform:translate(-50%,-50%)反向平移自身宽高50%才能真正居中,且该百分比基于元素自身尺寸。
这是因为 left: 50% 和 top: 50% 是把元素**左上角**定位到父容器中心点,不是整个元素居中。视觉上明显偏右下,尤其在宽高不一时特别明显。
解决核心:先用 left: 50% + top: 50% 把左上角“锚”到中心,再用 transform: translate(-50%, -50%) 反向平移自身宽高的 50%。
translate(-50%, -50%) 中的百分比是相对于元素自身尺寸计算的,不是父容器left/top 和 transform,缺一不可不是必须,但常见组合是:position: absolute + left/top: 50% + transform: translate(-50%, -50%)。单独用 transform 无法脱离文档流,会和其他元素重叠或影响布局。
display: flex,直接用 justify-content: center; align-items: center 更简单,无需 absolute
absolute 是合理选择,此时 transform 是最可靠居中手段margin: -Xpx 手动反推,宽度变化时容易错位IE9+ 支持 transform,但需要加 -ms- 前缀;IE8 及以下完全不支持,且无优雅降级方案。
立即学习“前端免费学习笔记(深入)”;
-ms-transform: translate(-50%, -50%)
transform: translate(-50%, -50%) 放最后,确保覆盖前缀版本margin 计算(仅限固定宽高):margin: -20px 0 0 -30px(假设宽 60px、高 40px)transform 对 inline 元素行为异常,确保元素是 block 或 inline-block
.centered {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
}
居中本身不难,难的是记住 translate 的百分比参照
物是元素自己,不是父容器——这点漏掉,调十分钟也白调。