公共html代码
1  | <div class="parent">  | 
水平居中
通用-元素宽高未知
transform absolute
1  | .parent {  | 
flex
利用 flex 布局的 justify-content 属性,适用于子元素为浮动,绝对定位,内联元素,均可水平居中。
1  | .parent {  | 
内联元素
常见的内联元素有:span, a, img, input, label 等等,此方法同样适用于 display: inline-block 的元素。
1  | .element {  | 
块级元素
常见的块元素:div, h1~h6, table, p, ul, li 等等
设置 margin
此方法只能进行水平的居中,且对 浮动元素 或 绝对定位 元素无效。
1  | .parent {  | 
修改为 inline-block 属性
1  | .parent {  | 
浮动元素
这里注意 relative 不能改为 absolute,因为 relative 是相对于自己原来的位置进行定位
1  | .child {  | 
绝对定位元素
left 负margin-left
1  | .parent {  | 
left right margin
1  | .parent {  | 
垂直居中
通用-元素宽高未知
transform absolute
1  | .parent {  | 
flex
利用 flex 布局的 align-items 属性,适用于子元素为浮动,绝对定位,内联元素,均可垂直居中。
1  | .parent {  | 
单行文本
利用 line-height = height
1  | .text {  | 
绝对定位元素
top 负margin-top
1  | .parent {  | 
top bottom margin
1  | .parent {  | 
水平+垂直居中
文本内容
1  | text {  | 
Flexbox
1  | .parent {  | 
absolute 负margin
灵活性差,不能自适应,宽高不支持百分比尺寸和 min-/max- 属性 ,需要知道子元素的宽高
1  | .parent {  | 
transform absolute
- 内容可自适应,可以封装为一个公共类,可做弹出层
 - 可能干扰其他 transform 效果
 
1  | .parent {  | 
absolute margin:auto
要求居中元素的宽高必须固定
- 不仅可以实现在正中间,还可以在正左方,正右方
 - 元素的宽高支持百分比 % 属性值和 min-/max- 属性
 - 可以封装为一个公共类,可做弹出层
 - 浏览器支持性好
 
1  | .parent{  | 
absolute calc
这种方式也要求居中元素的宽高必须固定,css3带来了计算属性,既然top的百分比是基于元素的左上角,那么在减去宽度的一半就好了
1  | .parent {  | 
table-cell
适用于子元素 display 为 inline-block, inline 类型的元素,需要已知父元素的宽高,且父元素的宽高不能设为百分比数。
1  | .parent {  | 
grid
兼容性不如flex,不推荐使用
1  | .parent {  | 
总结
推荐
- PC端有兼容性要求,宽高固定,推荐absolute + 负margin
 - PC端有兼容要求,宽高不固定,推荐table-cell
 - PC端无兼容性要求,推荐flex
 - 移动端推荐使用flex
 
比较
| 水平垂直居中方法 | 注意事项 | 
|---|---|
| flex | 通用:不需要知道居中元素的宽高 | 
| transform + absolute | 通用:不需要知道居中元素的宽高 | 
| table-cell | 适用于子元素 display 为 inline-block, inline 类型的元素,需要已知父元素的宽高,且父元素的宽高不能设为百分比数。 | 
| absolute + margin:auto | 要求居中元素的宽高必须固定 | 
| absolute + 负margin | 需要知道子元素的宽高,宽高不支持百分比尺寸和 min-/max- 属性 | 
| absolute + calc | 要求居中元素的宽高必须固定,依赖calc的兼容性 | 
| grid | 兼容性不如flex |