垂直居中

首先将​​<html>​​​与​​<body>​​​的高度设置为​​100%​​​(为演示父元素不定宽高的效果),并清除​​<body>​​的默认样式。

html,body{
margin: 0;
height: 100%;
}

垂直居中大致分为两类,父元素定宽高与父元素不定宽高,将两类样式以及子容器设定好。

.set-parent,.dy-parent{
width: 300px;
height: 200px;
background: #eee;
margin: 10px 0;
}
.child{
width: 20px;
height: 10px;
background: #fff;
}
.dy-parent{
width: 30%;
height: 20%;
}

父元素定宽高 position+margin

使用​​margin: auto​​​使水平居中,将子容器设定为​​relative​​​以在不脱离文档流的情况下偏移​​50%​​​,由于本身子容器占用一定宽高,会将其撑下,使用​​margin​​​使其向上偏移。
若是子容器使用​​​absolute​​​定位,则父容器应设置为​​relative​​​,否则会其相对于​​static​​​定位以外的第一个父元素进行定位,在本示例中会以浏览器为基准定位,此外​​absolute​​​无法使用​​margin: auto​​水平居中。


<div class="set-parent" >
<div class="child" style="position: relative;top: 50%;margin: auto;margin-top: -5px;">div>
div>

父元素定宽高 position+transform

原理与​​position+margin​​​相同,CSS3的​​transform​​​使得​​div​​​向上平移自身高度的​​50%​​。


<div class="set-parent" >
<div class="child" style="position: relative;top: 50%;margin: auto;transform: translateY(-50%);">div>
div>

父元素定宽高 position+calc

css3提供​​calc​​函数,能够进行动态计算。

<div class="set-parent" >
<div class="child" style="position: relative;top: calc(50% - 5px);left: calc(50% - 10px);">div>
div>

父元素不定宽高 flex

​flex​​​布局可以说是布局神器,极其强大,绝大部分现代浏览器都兼容性​​flex​​布局。

<div class="dy-parent" style="display: flex;justify-content: center;align-items: center;">
<div class="child" >div>
div>

父元素不定宽高 grid

​grid​​​布局将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,​​grid​​​布局与​​flex​​​布局有一定的相似性,都可以指定容器内部多个项目的位置。但是,它们也存在重大区别,​​flex​​​布局是轴线布局,只能指定"项目"针对轴线的位置,可以看作是一维布局,​​grid​​​布局则是将容器划分成"行"和"列",产生单元格,然后指定"项目"所在的单元格,可以看作是二维布局,可以认为​​grid​​​布局比​​flex​​布局强大。

<div class="dy-parent" style="display: grid;justify-content: center;align-content: center;">
<div class="child" >div>
div>

父元素不定宽高 table

​table​​​中有​​vertical-align​​属性设置垂直对齐方式。

<div class="dy-parent" style="display: table;">
<div style="display: table-cell;vertical-align: middle;">
<div class="child" style="margin: auto;" >div>
div>
div>

示例


<html>
<head>
<title>垂直居中title>
<meta charset="utf-8">
head>
<body>


<div class="set-parent" >
<div class="child" style="position: relative;top: 50%;margin: auto;margin-top: -5px;">div>
div>


<div class="set-parent" >
<div class="child" style="position: relative;top: 50%;margin: auto;transform: translateY(-50%);">div>
div>


<div class="set-parent" >
<div class="child" style="position: relative;top: calc(50% - 5px);left: calc(50% - 10px);">div>
div>


<div class="dy-parent" style="display: flex;justify-content: center;align-items: center;">
<div class="child" >div>
div>


<div class="dy-parent" style="display: grid;justify-content: center;align-content: center;">
<div class="child" >div>
div>


<div class="dy-parent" style="display: table;">
<div style="display: table-cell;vertical-align: middle;">
<div class="child" style="margin: auto;" >div>
div>
div>


body>
<style type="text/css">
html,body{
margin: 0;
height: 100%;
}
.set-parent,.dy-parent{
width: 300px;
height: 200px;
background: #eee;
margin: 10px 0;
}
.child{
width: 20px;
height: 10px;
background: #fff;
}
.dy-parent{
width: 30%;
height: 20%;
}
style>
html>

每日一题

https://github.com/WindrunnerMax/EveryDay