【CSS】居中

299 阅读7分钟

水平居中

外边距

当元素的左右外边距相等的时候,元素就处在中间位置,让两边的间隔相等,最简单的方式就是把左右外边距都设为auto,如果是块级元素通常还需定义宽度。

section {
    width: 40px;
    margin: 0 auto;
}

注意:如果把上下外边距设为auto,并不能实现垂直居中,因为这时候的auto相当于0.

行内块

改变需要居中元素的盒类型,调整为行内块(inline-block),在父元素中将text-align设置为center,就能实现水平居中。

<div style="text-align: center">
    <section style="display:inline-block"></section>
</div>

在section元素内,如果有子元素,那么子元素会继承居中,里面内容默认就不再是左对齐。

定位

要绝对定位或固定定位, 如果是绝对定位,那么容器将会被定义为相对定位,作为元素的包含块; 如果是固定定位,那么元素相对视口(此时视口为包含块)居中

由于使用了这两种定位后,元素会脱离正常流,所以容器需要固定高度,避免高度塌陷导致后面的元素挤上来。

这种方法通常将定位元素从包含块的左边界向右偏移50%的距离(也就是容器一般宽度的距离),再反向偏移元素一半宽度的距离,最后实现居中。

<div style="position:relative;height:100px">
    <section style="position:absolute;left:50%"></section>
</div>

接下来用两种方式实现效果,分别是外边距和位移

如果定位元素的宽度已定义,那么可以用负外边距实现反向偏移,例如宽度是40px,左外边距设为负的二分之一宽度(也就是-20px)

section {
    width: 40px;
    margin-left: -20px;
}

如果定位元素的宽度未知,那么就不能用外边距,这种情况就需要使用css3新增的位移,在水平方向反向位移50%。水平位移中百分数参照的是自身宽度,所以50%就是元素宽度的一半。

section {
    transform: translateX(-50%)
}

伸缩盒

伸缩盒是CSS3引入的新功能,当普通容器被调整为伸缩容器后,如果要让里面的子元素水平居中,那么就相当于主轴的居中对齐。

<div style="display:flex;justify-content: center">
    <section></section>
</div>

伸缩盒不用借助偏移来实现居中,但是使用伸缩盒后,里面的子元素就需要按它的规则来,例如子元素的高度自动等于容器的高度,虽然能解决多列等高问题,但是有时候不需要这样的福利。伸缩盒的兼容性也不容乐观。

垂直居中

行高

只有当容器的高度已知,并且是单行文本时,才能用行高(line-height)实现垂直居中。如果有两行,那么第一行和第二行之间会有行间距,当这个行高和容器高度相等时,第二行就会被挤到容器外。

<div style="height:100px;line-height:100px">
    <p>垂直居中</p>
</div>

注意:如果单行文本改为图像,行高不能实现图像的垂直居中。

内边距

当容器的上下边距相同的时候,容器中的内容就变成了垂直居中。使用这种方法后,容器不能有固定高度,它的高度需要内容撑起。

<div style="padding:50px 0">
    <p>垂直居中</p>
</div>

表格盒类型

在表格的单元格中,用vertical-align属性就能让元素垂直居中,现在用这种方法把普通元素调整为表格元素,模拟出表格的效果。用CSS模拟的表格除了包含表格元素的普通规则之外,还拥有特殊规则,它能够以匿名方式创建缺少的表格元素,例如单元格本来必须在表格行之内,而在模拟的表格中,将元素调整为单元格(使用盒类型table-cell)后,不用把父元素变为表格行(使用盒类型table-row),浏览器会自动创建出表格行。

<div style="display:table">
    <p style="display:table-cell;vertical-align:center">垂直居中</p>
</div>

虽然模拟表格能带来很多便捷,但同时也受到了限制。例如调整过的元素不能用定位和浮动;使用盒类型table-cell时,必须同时有个祖先元素的盒类型是table,变为表格的元素,它的默认宽度不再占一行,因为表格本质上是行内元素。

定位

垂直居中的定位方法和水平居中的定位方法很类似,只是方向不同。例如原先定位元素从包含块的左边界向右偏移,现在改为从顶部向下偏移50%的距离,其它都一样。

<div style="position:relative">
    <section style="position:absolute;top:50%"></section>
</div>

接下来也同样使用两种方法来实现反向偏移。 反向偏移的距离根据定位元素来定义,例如元素高度为40px,那么上外边距就是负的二分之高度(也就是-20px)

section {
    height: 40px;
    margin-top: -20px;
}

如果定位元素的高度未知,那么就得用位移,在垂直方向反向位移50%,垂直位移中的百分数参照的是自身高度,所以50%就是元素高度的一半。

section {
    transform: translateY(-50%);
}

伸缩盒

在伸缩容器里,子元素垂直居中,相当于侧轴的居中对齐

<div style="display:flex;align-items:center">
    <section></section>
</div>

常见笔试题

如何让一个浮动元素水平居中?

浮动元素通常会在水平方向上向左或向右移动,如果要居中,首先需要向反方向偏移一定的距离,元素的偏移可以用相对定位和偏移属性实现,代码如下。

.float {
    float: left;
    position: relative;
    /* 偏移容器宽度的一半 */
    left: 50%; 
}

如果容器和浮动元素的宽度都已定义,那么偏移距离可以计算得到。 如果浮动元素的宽度未知,那就不能用计算的方式,这时候只能用百分数来实现。

上面的代码把偏移距离设为50%,元素的左边缘被移动到了容器中间的位置,要得到元素居中的效果,可以借用子元素或使用CSS3新增的位移功能。

下面首先介绍子元素的方法,这个方法需要在浮动元素内增加子元素,子元素再做相对定位的反向偏移。例如下面的HTML文档中,子元素section反向偏移了50%,也就是偏移浮动元素一般宽度的距离后,就能实现内容居中。不过,此时需要将原先在浮动元素上的样式迁移到这个子元素中,例如宽度、高度、背景色等。

<div>
    <div class="float">
        <section style="position:relative;left:-50%"></section>
    </div>
</div>

使用CSS3新增的位移功能不需要添加子元素,而是直接让浮动元素反向位移50%就能实现居中,水平位移中的百分数参照的是自身宽度,所以50%就是自身宽度的一半,如下所示。

<div>
    <div class="float" style="transform:translateX(-50%)"></div>
</div>