温馨提示:本文内嵌代码演示较多,可能会出现加载缓慢的现象。 如果演示框没有加载出来,可以尝试访问voezy’s public fiddles

水平居中


左右margin auto

适用情况:居中元素宽度已知;不要求现代浏览器

利用 margin: 0 auto 可以非常简便地使元素水平居中。
代码和结果如下。


绝对定位+margin(或transform)

适用情况:居中元素宽度已知(transform可以不用知道元素宽度);不要求现代浏览器

先使子元素绝对定位,向某个方向偏移容器宽度的一半,再设置子元素反方向的margin为子元素的一半宽度。
代码和结果如下。

其中,可以将margin-left改成transform的方式,效果相同。但这时候就要求浏览器的支持了。

transform: translate(-50%, 0);

当然用transform要注意浏览器兼容性(IE 9+,9需要浏览器前缀)。

还有个绝对定位+四方向归零+margin: auto实现的,见鑫大佬博客: 小tip: margin:auto实现绝对定位元素的水平垂直居中


转化为行内元素

适用情况:居中元素宽度已知或未知, 多个元素水平居中; 不要求现代浏览器

把居中元素设置为行内(块)元素,容器设置文字居中分布,就可以将行内元素居中显示。


弹性盒子(flex)

适用情况: 居中元素宽度已知或未知, 多个元素水平居中, 要求现代浏览器(IE10+)

display: flex; ,并且设置子元素的水平分布方式。与一般的盒子模型有很多差异。用它来使元素水平居中比较简单,而且还可以居中多个元素。但是桌面浏览器的兼容性也是一个问题,尤其是IE要求10+。

要注意的是,如果要水平居中的子元素如果未设置高度,那么它的高度将被拉伸到与容器元素高度相等。再设置一个垂直方向的对齐方式为center就可以解决。

上代码和结果:


垂直居中

行高法

适用情况: 行内元素,单行,容器元素高度已知; 不要求现代浏览器

行高设为容器元素本身的高度,即可使其中的单行行内元素垂直居中。


上下padding

适用情况: 行内元素, 单行或多行;不要求现代浏览器

容器高度未设置,上下padding设为相等的值,即可将其中的行内元素垂直居中。


绝对定位 + margin(或transform)

与水平居中时的情况和使用方法一样。


table-cell + vertical-align

适用情况: 要求IE8+

这个是将容器元素的显示方式设为table-cell,再设置垂直方向的对齐方式为middle即可。

又或者将容器元素的显示方式设置为table,需要垂直居中的元素设置为 display: table-cell, 并且 vertical-align: middle;


弹性盒子

适用情况: 要求现代浏览器(IE10+)

行内元素和块级元素垂直居中都适用。与水平居中时的情况和使用方法类似,区别是设置垂直方向元素对齐方式为center。

水平垂直居中

弹性盒子

适用情况:要求现代浏览器

将上述水平和垂直居中方式结合在一起就可以了。


绝对定位 + margin(或者transform)

适用情况: 使用margin时要知道子元素的尺寸,使用transform时要求现代浏览器

将上述水平和垂直方向居中的 绝对定位 + transform 一起使用即可。


text-align + line-height

适用情况:行内元素

text-align: center; 和 上述设置行内元素垂直居中的行高法结合,就可以将行内元素水平垂直居中。


还有 绝对定位 + 负值margin绝对定位 + 四个方向距离为0等方式,可以参考: 关于css水平垂直居中的总结

用得少就不罗列了,先熟悉最常用的方法。