CSS 居中是 CSS 布局里最常见的问题,本文总结在不同情况下的实现方法及其优缺点。
一、水平居中
1. inline 或 inline-* 元素
给块级父元素设置 text-align: center;,对 inline, inline-block, inline-table, inline-flex 等都奏效。
2. 一个 block level 元素
- 对该元素设置
margin:0 auto;。 - 使用定位属性,设置父元素为相对定位,子元素为绝对定位
left:50%,再设置绝对子元素的margin-left: -元素宽度的一半;或transform: translateX(-50%);。 flexbox布局,对父元素设置display: flex; justify-content: center;。
3. 多个 block level 元素
多个元素水平放置
- 子元素设置
display: inline-block;,父元素设置text-align: center;。 flexbox布局,对父元素设置display: flex; justify-content: center;。
多个元素垂直放置
- 子元素设置
margin:0 auto;。
二、垂直居中
1. inline 或 inline-* 元素
-
单行
- 设置上下
padding相等。 - 设置
line-height等于盒子的height。
- 设置上下
-
多行
- 设置上下
padding相等。 -
将元素转换成
table cell:<table> <tr> <td> I'm vertically centered multiple lines of text in a real table cell. I'm vertically centered multiple lines of text in a real table cell. I'm vertically centered multiple lines of text in a real table cell. </td> </tr> </table>或使用
CSS:.center-table { display: table; } .center-table p { display: table-cell; vertical-align: middle; } -
flexbox布局:.flex-center-vertically { display: flex; flex-direction: column; justify-content: center; } -
使用
ghost element:.ghost-center { position: relative; } .ghost-center::before { content: ''; display: inline-block; height: 100%; vertical-align: middle; } .ghost-center p { display: inline-block; vertical-align: middle; }
- 设置上下
2. 一个 block level 元素
- 使用定位属性,设置父元素为相对定位,子元素为绝对定位
top:50%,再设置绝对子元素的margin-top: -元素高度的一半;或transform: translateY(-50%);。 - 允许拉伸到容器高度:将元素转换为
table布局。 -
flexbox布局:.flex-center-vertically { display: flex; flex-direction: column; justify-content: center; }
三、水平垂直居中
-
table布局:<table style="width: 100%;"> <tr> <td style="text-align: center;"> Unknown stuff to be centered. </td> </tr> </table>或者:
<div class="something-semantic"> <div class="something-else-semantic"> Unknown stuff to be centered. </div> </div>.something-semantic { display: table; width: 100%; } .something-else-semantic { display: table-cell; text-align: center; vertical-align: middle; } - 使用
ghost element。 - 组合使用前述定位属性。
- 已知宽高:设置父元素为相对定位,子元素为绝对定位,
top: 0; right: 0; bottom: 0; left: 0; margin: auto;。 -
flexbox布局:<div class="parent"> <div class="child"></div> </div>div.parent { display: flex; justify-content: center; align-items: center; }或:
div.parent { display: flex; } div.child { margin: auto; } -
grid布局:<div class="parent"> <div class="child"></div> </div>div.parent { display: grid; } div.child { justify-self: center; align-self: center; }或:
div.parent { display: grid; } div.child { margin: auto; }
四、优缺点总结
1. 负 margin
优点:
- 跨浏览器兼容性好,包括 IE6-7
- 代码量少
缺点:
- 不能自适应。不支持百分比属性值和
min-/max-属性设置 - 内容可能溢出容器
- 需要补偿
padding或使用box-sizing: border-box;
2. Transforms
优点:
- 内容高度可变
- 代码量少
缺点:
- IE8 不支持
- 需要浏览器厂商前缀
- 可能影响其他
transform效果 - 某些情况下导致边界或文本渲染模糊
3. Absolute Center
.Absolute-Center {
margin: auto;
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
优点:
- 跨浏览器兼容性好
- 代码量少
- 支持百分比属性值和
min-/max-属性 - 不受
padding影响
缺点:
- 内容定高
- 设置
overflow:auto防止内容溢出
4. Table-Cell
优点:
- 内容高度可变
- 内容溢出会将父元素撑开
- 跨浏览器兼容性好
缺点:
- 需要更多的
html标记
5. Inline-Block
优点:
- 内容高度可变
- 内容溢出会将父元素撑开
- 跨浏览器兼容性好
缺点:
- 比较 hack,不好理解
6. Flexbox
优点:
- 内容可变宽高
- 可实现更复杂的布局
缺点:
- 不兼容 IE9(包括 IE9) 之前的版本