写在前面
CSS中内容水平居中、垂直居中是经常有的需求,在不同的场景,居中的方式也不同,此篇文章就总结下CSS居中的各种方法。
水平居中
内联元素
爸爸身上写 text-align:center;
块级元素
此时的块级元素必须是 display: block 的纯块级元素,并且设置了最大宽度或者宽度的,才能使用此方法水平居中。 display: inline-block 的元素无法使用该方式水平居中。
margin-left: auto;margin-right: auto;
垂直居中
若父元素的 height 高度没有写,则默认是子元素撑开的高度,此时子元素若想垂直居中,直接在父元素内:padding: 20px 0; 即可。
忠告:父元素能不写高度就不写高度,否则垂直居中起来比较困难
若父元素的 height 高度写死了,垂直居中就比较麻烦了,有如下方法:
1. 使用 table 自带居中
table 的单元格(td)内的元素默认垂直居中,因此可以用 table
<table class="parent"><tr><td class="child">这是一个测试测试</td></tr></table>
.parent{border: 1px solid red;height: 300px;}.child{border: 1px solid blue;}

2. 巧用 类table + vertical-align: middle;
vertical-align: middle; 是只使用于内联元素或者内联块元素、或 table 表格中单元格的垂直居中的CSS属性,可巧用该属性进行垂直居中布局,如下:
2.1 改造 div 为 table 使用 vertical-align: middle;
<div class="table"><div class="td"><div class="child">这是一个测试</div></div></div>
div.table{display: table;border: 3px solid red;height: 200px;}div.tr{display: table-row;border: 1px solid green;}div.td{display: table-cell;border: 2px solid blue;vertical-align: middle; /*table-cell 单元格垂直居中,这句在起作用*/}.child{border: 1px solid black;}

2.2 设置元素为 inline-block 元素使用 vertical-align: middle;
1. 添加始末两个 span 元素
<div class="parent"><span class=before></span><div class="child">这是一个测试</div><span class=after></span></div>
.parent{border: 3px solid red;height: 200px;text-align: center;}.child{border: 3px solid black;display: inline-block;width: 300px;vertical-align: middle;}.parent .before{display: inline-block;height: 100%;vertical-align: middle;}.parent .after{display: inline-block;height: 100%;vertical-align: middle;}

2. 使用伪元素在始末添加元素
<div class="parent"><div class="child">这是一个测试</div></div>
.parent{border: 3px solid red;height: 200px;text-align: center;}.child{border: 3px solid black;display: inline-block;width: 300px;vertical-align: middle;}.parent:before{content: "";display: inline-block;height: 100%;vertical-align: middle;}.parent:after{content: "";display: inline-block;height: 100%;vertical-align: middle;}
效果和上述一样。
PS: 使用添加元素的方式一定要始末都要添加,添加一个看起来是水平居中,但其实有误差,左右都添加一个才是水平居中
3. 使用绝对定位 absolute
3.1 手动计算尺寸结合 margin
<div class="parent"><div class="child">这是一个测试</div></div>
.parent{height: 200px;border: 1px solid red;position: relative;}.child{border: 1px solid green;width: 300px;height: 100px;position: absolute;top: 50%;left: 50%;margin-left: -150px;margin-top: -50px;}

3.2 用 translate
还是上述的代码,将手动计算的 margin 改为 translate 就行
.child{border: 1px solid green;position: absolute;top: 50%;left: 50%;transform: translate(-50%,-50%);}
3.2 用 margin: auto
还是上述代码,将 margin 全为 auto,然后结合绝对定位值
.child{border: 1px solid green;position: absolute;width: 300px;height: 200px;margin: auto;top: 0;bottom: 0;left: 0;right: 0;}
4. 使用 flex 布局
.parent{height: 200px;border: 3px solid red;display: flex;justify-content: center;align-items: center;}.child{border: 3px solid green;width: 300px;}
5. 单行文字居中特别版
当涉及到文字居中时,一般情况下,父元素如果没有写死高度的话,文字默认是居中的,但是如果父元素将高度写死了的话,文字就不再居中了。
对于不确定的多行文字,只能按照常规的垂直居中布局来写了。
对于确定的单行文字,且父元素中只有一行文字的子元素,则有一种更简单的垂直居中方式就是将父元素的行高
line-height 设置为和高度 height 一样高即可垂直居中。
但是该种居中的方式,只适用于父元素没有 border 的情况,如果有 border ,则设置的 line-height 不应该是和 height 一样高,具体看 line-height 的相关定义。
