各种垂直居中总结

各种垂直居中总结

这里总结各种垂直居中的方法。重点是在不知道宽高的情况下如何设置垂直居中。面试和平时工作会常用到,尤其是flex布局的垂直居中法将在未来会成为主流。

确保只有一行文字的垂直居中

.wrap-text {
    line-height: 100px;
    text-align: center;
    height: 100px;
    background-color: red;
}

<div class='wrap-text'>
    <p>只适合纯文本且只有一行</p>
</div>

关键点在于line-height的属性值要和父元素的高度相等,且文本只能一行。

padding法垂直居中

.wrap-padding {
    width: 400px;
    height: 200px;
    background-color: blue;
}

.wrap-padding-content {
    width: 100px;
    height: 100px;
    padding: 50px 150px;
    background-color: green;
    background-clip: content-box;
}

<div class="wrap-padding">
    <div class="wrap-padding-content"></div>
</div>

在子元素中,padding的属性值:上下=(父元素高度-子元素高度)/2;左右=(父元素宽度-子元素宽度度)/2,即50=(200-100)/2 150=(400-100)/2.且要设置background-clip的属性值为content-box.此方法需要知道父元素的宽高

margin法垂直居中

.wrap-margin {
    overflow: hidden; 
    width: 400px;
    height: 200px;
    background-color: pink;
}

.wrap-margin-content {
    width: 100px;
    height: 100px;
    /* 50=(200-100)/2 左右设为auto margin-bottom设为0 */
    margin: 50px auto 0 auto;
    background-color: orange;
}

<div class="wrap-margin">
    <div class="wrap-margin-content"></div>
</div>

此方法需要在父元素设置overflow的属性值为hidden ,且子元素的margin-top的值=(父元素高度-子元素高度)/2,margin-left和margin-right设为auto, margin-bottom设为0.此方法需要知道父元素的宽高

父元素设为相对对位,子元素设为绝对定位(但需要用到子元素的宽高)

.wrap-relative {
    position: relative;
    width: 400px;
    height: 200px;
    background-color: coral;
}

.wrap-absolute-content {
    position: absolute;
    width: 100px;
    height: 100px;
    /* 先让top和left设为50% */
    top: 50%;
    left: 50%;
    /*这里的-50px是子元素宽高的一半*/
    margin-top: -50px;
    margin-left: -50px;
    background-color: #fff;
}

<div class="wrap-relative">
    <div class="wrap-absolute-content"></div>
</div>

父元素设为相对对位,子元素设为绝对定位,子元素的top和left的属性值设为50%,并且margin-top的属性值设为(-子元素的高度/2),即-50px;margin-left的属性值设为(-子元素的宽度度/2),即-50px.这里就不用关心父元素的宽高,但仍然要计算子元素的宽高,牙败牙败。

父元素设为相对对位,子元素设为绝对定位(无需知道任何元素的宽高)

.wrap-relative-1 {
    position: relative;
    width: 400px;
    height: 200px;
    background-color: black;
}

.wrap-absolute-content-1 {
    position: absolute;
    width: 100px;
    height: 100px;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    margin: auto;
    background-color: #f2f2f2;
}

<div class="wrap-relative-1">
    <div class="wrap-absolute-content-1"></div>
</div>

这里将父元素设为相对对位,子元素设为绝对定位,而子元素的top, right, bottom, left的属性值都设为0, 且margin设为auto.这里无需关注任何相关元素的宽高。撒花 (✿◕‿◕✿)

父元素设为相对对位,子元素设为绝对定位(利用CSS3新属性,无需知道任何元素的宽高)

.wrap-relative-2 {
    position: relative;
    width: 400px;
    height: 200px;
    background-color: yellow;
}

.wrap-absolute-content-2 {
    position: absolute;
    width: 100px;
    height: 100px;
    left: 50%;
    top: 50%;
    transform: translate3d(-50%, -50%, 0);
    background-color: purple;
}

<div class="wrap-relative-2">
    <div class="wrap-absolute-content-2"></div>
</div>

这里利用了CSS3的新属性,先将父元素设为相对对位,子元素设为绝对定位。子元素的left和top的属性值分别设为50%,并且将 transform的属性值设为translate3d(-50%, -50%, 0).

憋大招 弹性布局垂直居中

.container {
    display: flex;
    /* 垂直居中 */
    align-items: center;
    /* 水平居中 */
    justify-content: center;
    width: 400px;
    height: 200px;
    background-color: black;
}

.item {
    width: 100px;
    height: 100px;
    background-color: pink;
}

*********************************************

/* 还可以这样写 */
.container {
    display: flex;
    width: 400px;
    height: 200px;
    background-color: black;
}

.item {
    width: 100px;
    height: 100px;
    margin: auto;
    background-color: pink;
}


<div class="container">
    <div class="item"></div>
</div>

这大抵是垂直居中的最优解决方案了,我在另一篇文章,弹性布局介绍了弹性布局的常见属性。

PS:

vh布局方式可以让元素相对于视口居中,特别是模态框这种东西更加适合,尤其在HTNML5.2新标准中增加了dialog标签之后。

dialog {
    position: fixed;
    margin-top: 50vh;
    margin-left: 50vw;
    transform: translate(-50%, -50%);
}

<dialog open>
    <h1>我是模态框</h1>
    用户名:<input type="text"><br>


    密码:<input type="password"><br data-tomark-pass>
    提交:<input type="submit">
</dialog>

/*这里假定一个高度,因为dialog的position设为了fixed,因为无论鼠标滚轮怎么变化,模态框都是相对于视口垂直居中*/

/*而且卧槽,浏览器窗口在resize时,仍然能保持垂直居中,js可以拜拜了*/
<div style="height: 1000px"></div>

注意:截至目前只有Chrome支持了dialog标签吼~

关于 css 优先级

PREVIOUS POST

关于 css 优先级

弹性布局

NEXT POST

弹性布局