居中的效果是Web开发中常见的需求,几乎和阴影、圆角可以并列为产品三大法宝,本文的目的是捋顺开发中常用的居中计较,方便记忆和日后查阅。为了方便演示,本文所有 demo 使用 React 的 CSS-in-JS 语法完成。

单行文本

height、lineHeight、textAlign

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div
style={{
boxSizing: 'border-box',
height: '100px',
width: '300px',
background: 'purple',
color: '#fff',
textAlign: 'center',
lineHeight: '98px',
border: '1px solid red',
}}
>
单行文本
</div>

Flex

1
2
3
4
5
6
7
8
9
10
11
12
13
<div
style={{
height: '100px',
width: '300px',
background: 'purple',
color: '#fff',
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
}}
>
单行文本
</div>

多行文本居中

table-cell、vertical-align

1
2
3
4
5
6
7
8
9
10
11
12
13
<div
style={{
boxSizing: 'border-box',
height: '100px',
width: '300px',
background: 'purple',
color: '#fff',
display: 'table-cell',
verticalAlign: 'middle',
}}
>
多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本
</div>

Flex

1
2
3
4
5
6
7
8
9
10
11
12
13
<div
style={{
height: '100px',
width: '300px',
background: 'purple',
color: '#fff',
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
}}
>
多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本多行文本
</div>

图片居中

table-cell、verticalAlign、textAlign

1
2
3
4
5
6
7
8
9
10
11
12
<div
style={{
height: '100px',
width: '300px',
background: 'purple',
display: 'table-cell',
verticalAlign: 'middle',
textAlign: 'center',
}}
>
<img src="http://iph.href.lu/50x50" alt="" />
</div>

Flex

1
2
3
4
5
6
7
8
9
10
11
12
<div
style={{
height: '100px',
width: '300px',
background: 'purple',
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
}}
>
<img src="http://iph.href.lu/50x50" alt="" />
</div>

块级元素

子绝父相

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<div
style={{
height: '100px',
width: '300px',
background: 'purple',
position: 'relative',
}}
>
<div
style={{
background: '#fff',
width: '50px',
height: '50px',
position: 'absolute',
left: '50%',
top: '50%',
transform: 'translate(-50%,-50%)',
}}
/>
</div>

Flex

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<div
style={{
height: '100px',
width: '300px',
background: 'purple',
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
}}
>
<div
style={{
background: '#fff',
width: '50px',
height: '50px',
}}
/>
</div>