写在前面

CSS中内容水平居中、垂直居中是经常有的需求,在不同的场景,居中的方式也不同,此篇文章就总结下CSS居中的各种方法。

水平居中

内联元素

爸爸身上写 text-align:center;

块级元素

此时的块级元素必须是 display: block 的纯块级元素,并且设置了最大宽度或者宽度的,才能使用此方法水平居中。 display: inline-block 的元素无法使用该方式水平居中。

  1. margin-left: auto;
  2. margin-right: auto;

垂直居中

若父元素的 height 高度没有写,则默认是子元素撑开的高度,此时子元素若想垂直居中,直接在父元素内:padding: 20px 0; 即可。

忠告:父元素能不写高度就不写高度,否则垂直居中起来比较困难

若父元素的 height 高度写死了,垂直居中就比较麻烦了,有如下方法:

1. 使用 table 自带居中

table 的单元格(td)内的元素默认垂直居中,因此可以用 table

  1. <table class="parent">
  2. <tr>
  3. <td class="child">
  4. 这是一个测试测试
  5. </td>
  6. </tr>
  7. </table>
  1. .parent{
  2. border: 1px solid red;
  3. height: 300px;
  4. }
  5. .child{
  6. border: 1px solid blue;
  7. }

居中布局 - 图1

2. 巧用 类table + vertical-align: middle;

vertical-align: middle; 是只使用于内联元素或者内联块元素、或 table 表格中单元格的垂直居中的CSS属性,可巧用该属性进行垂直居中布局,如下:

2.1 改造 div 为 table 使用 vertical-align: middle;

  1. <div class="table">
  2. <div class="td">
  3. <div class="child">
  4. 这是一个测试
  5. </div>
  6. </div>
  7. </div>
  1. div.table{
  2. display: table;
  3. border: 3px solid red;
  4. height: 200px;
  5. }
  6. div.tr{
  7. display: table-row;
  8. border: 1px solid green;
  9. }
  10. div.td{
  11. display: table-cell;
  12. border: 2px solid blue;
  13. vertical-align: middle; /*table-cell 单元格垂直居中,这句在起作用*/
  14. }
  15. .child{
  16. border: 1px solid black;
  17. }

居中布局 - 图2

2.2 设置元素为 inline-block 元素使用 vertical-align: middle;

1. 添加始末两个 span 元素

  1. <div class="parent">
  2. <span class=before></span>
  3. <div class="child">
  4. 这是一个测试
  5. </div>
  6. <span class=after></span>
  7. </div>
  1. .parent{
  2. border: 3px solid red;
  3. height: 200px;
  4. text-align: center;
  5. }
  6. .child{
  7. border: 3px solid black;
  8. display: inline-block;
  9. width: 300px;
  10. vertical-align: middle;
  11. }
  12. .parent .before{
  13. display: inline-block;
  14. height: 100%;
  15. vertical-align: middle;
  16. }
  17. .parent .after{
  18. display: inline-block;
  19. height: 100%;
  20. vertical-align: middle;
  21. }

居中布局 - 图3

2. 使用伪元素在始末添加元素

  1. <div class="parent">
  2. <div class="child">
  3. 这是一个测试
  4. </div>
  5. </div>
  1. .parent{
  2. border: 3px solid red;
  3. height: 200px;
  4. text-align: center;
  5. }
  6. .child{
  7. border: 3px solid black;
  8. display: inline-block;
  9. width: 300px;
  10. vertical-align: middle;
  11. }
  12. .parent:before{
  13. content: "";
  14. display: inline-block;
  15. height: 100%;
  16. vertical-align: middle;
  17. }
  18. .parent:after{
  19. content: "";
  20. display: inline-block;
  21. height: 100%;
  22. vertical-align: middle;
  23. }

效果和上述一样。

PS: 使用添加元素的方式一定要始末都要添加,添加一个看起来是水平居中,但其实有误差,左右都添加一个才是水平居中

3. 使用绝对定位 absolute

3.1 手动计算尺寸结合 margin

  1. <div class="parent">
  2. <div class="child">
  3. 这是一个测试
  4. </div>
  5. </div>
  1. .parent{
  2. height: 200px;
  3. border: 1px solid red;
  4. position: relative;
  5. }
  6. .child{
  7. border: 1px solid green;
  8. width: 300px;
  9. height: 100px;
  10. position: absolute;
  11. top: 50%;
  12. left: 50%;
  13. margin-left: -150px;
  14. margin-top: -50px;
  15. }

居中布局 - 图4

3.2 用 translate

还是上述的代码,将手动计算的 margin 改为 translate 就行

  1. .child{
  2. border: 1px solid green;
  3. position: absolute;
  4. top: 50%;
  5. left: 50%;
  6. transform: translate(-50%,-50%);
  7. }

3.2 用 margin: auto

还是上述代码,将 margin 全为 auto,然后结合绝对定位值

  1. .child{
  2. border: 1px solid green;
  3. position: absolute;
  4. width: 300px;
  5. height: 200px;
  6. margin: auto;
  7. top: 0;
  8. bottom: 0;
  9. left: 0;
  10. right: 0;
  11. }

4. 使用 flex 布局

  1. .parent{
  2. height: 200px;
  3. border: 3px solid red;
  4. display: flex;
  5. justify-content: center;
  6. align-items: center;
  7. }
  8. .child{
  9. border: 3px solid green;
  10. width: 300px;
  11. }

5. 单行文字居中特别版

当涉及到文字居中时,一般情况下,父元素如果没有写死高度的话,文字默认是居中的,但是如果父元素将高度写死了的话,文字就不再居中了。

对于不确定的多行文字,只能按照常规的垂直居中布局来写了。

对于确定的单行文字,且父元素中只有一行文字的子元素,则有一种更简单的垂直居中方式就是将父元素的行高
line-height 设置为和高度 height 一样高即可垂直居中。

但是该种居中的方式,只适用于父元素没有 border 的情况,如果有 border ,则设置的 line-height 不应该是和 height 一样高,具体看 line-height 的相关定义。