使用 CSS 转换

CSS 变换基于元素的大小,因此如果你不知道元素的高度或宽度,可以将它从相对容器的顶部和左侧绝对定位 50%并将其向左和向上平移 50%使其垂直和水平居中。

请记住,使用此技术,元素可能会在非整数像素边界处渲染,使其看起来模糊。请参阅 SO 中的此答案以获取解决方法。

HTML

<div class="container">
  <div class="element"></div>
</div>

CSS

.container {
  position: relative;
}

.element {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

查看 JSFiddle 中的示例

交叉浏览器的兼容性

transform 属性需要旧版浏览器支持的前缀。Chrome <= 35,Safari <= 8,Opera <= 22,Android Browser <= 4.4.4 和 IE9 需要前缀。IE8 和旧版本不支持 CSS 转换。

以下是上一个示例的常见转换声明:

-webkit-transform: translate(-50%, -50%); /* Chrome, Safari, Opera, Android */
    -ms-transform: translate(-50%, -50%); /* IE 9 */
        transform: translate(-50%, -50%);

有关更多信息,请参阅 canIuse

更多信息

  • 元素根据第一个非静态父级(position: relativeabsolutefixed)定位。在这个小提琴和本文档主题中探索更多内容

  • 对于仅水平居中,请使用 left: 50%transform: translateX(-50%)。垂直居中也是如此:以 top: 50%transform: translateY(-50%) 为中心。

  • 使用这种居中方法的非静态宽度/高度元素可能会导致居中元素出现挤压。这主要发生在包含文本的元素中,可以通过添加:margin-right: -50%;margin-bottom: -50%; 来修复。查看此小提琴获取更多信息。