跳到主要内容

居中

水平方向

行内元素

行内元素一般被放在块级元素内部,可以使用text-align进行水平方向的居中

实时编辑器
结果
Loading...

块级元素

具有固定宽度的块级元素,可以使用margin:auto来居中

实时编辑器
结果
Loading...

垂直方向

单行文本

利用flex布局属性

.parent {
display: flex;
align-items: center;
}
实时编辑器
结果
Loading...

利用line-height,如果父容器高度固定,需要让line-height等于父容器高度,但是如果父容器高度未设置,直接随便给一个line-height就能垂直居中。

如果在 JSX 中使用line-height一定要注意是否带上单位,因为line-height的值允许不带单位,那样它会被当作字体font-size的倍数看待

.parent {
line-height: 150px;
height: 150px;
}
实时编辑器
结果
Loading...

多行行内元素

多行文本不要想用line-height去解决,因为它影响的是每行的高度!

如果是多行文本,也即是<p>里面包了一堆纯文本的,可以像上面那样用flex去解决,但是如果文本和行内元素混排,不能用flex,那样会破坏行内元素的排版。

这时候最好是用table-cellvertical-align

.parent {
display: table-cell;
vertical-align: middle;
}
实时编辑器
结果
Loading...

块级元素

总是能用flex布局来解决

实时编辑器
结果
Loading...

对于高度一定的块级元素,也使用绝对定位和负margin来解决,注意

  • 如果使用box-sizing:border-box,负margin的值计算需要加上paddingborder
  • 设置position: absolute的同时,需要设置父元素position:relative,否则position: absolute的元素将是相对于body进行偏移
.parent {
position: relative;
}
.child {
position: absolute;
top: 50%;
height: 100px;
margin-top: -50px;
}
实时编辑器
结果
Loading...

对于高度不固定的块级元素,使用绝对定位和transform

.parent {
position: relative;
}
.child {
position: absolute;
top: 50%;
transform: translateY(-50%);
}
实时编辑器
结果
Loading...

水平垂直居中

flex

flex布局配合justify-contentalign-items总能水平垂直居中一个元素

.parent {
display: flex;
justify-content: center;
align-items: center;
}
实时编辑器
结果
Loading...

父元素使用flex,然后在子元素上加margin:auto也可以

.parent {
display: flex;
}

.child {
margin: auto;
}
实时编辑器
结果
Loading...

固定宽高

可以使用上面的绝对定位和负 margin

.parent {
position: relative;
}

.child {
position: absolute;
top: 50%;
left : 50%
height: 100px;
width: 100px
margin-top: -50px;
margin-left: -50px;
}
实时编辑器
结果
Loading...

对于绝对定位并且给定高度和宽度的子元素,也可以使用margin:auto来做到水平和垂直居中

image-20201227095655747

未知宽高

使用绝对定位和transform

.parent {
position: relative;
}

.child {
position: absolute;
top: 50%;
left : 50%
transform: translate(-50%,-50%);
}
实时编辑器
结果
Loading...