# 垂直居中
首先将``与`
`的高度设置为`100%`(为演示父元素不定宽高的效果),并清除``的默认样式。
```css
html,body{
margin: 0;
height: 100%;
}
```
垂直居中大致分为两类,父元素定宽高与父元素不定宽高,将两类样式以及子容器设定好。
```css
.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`水平居中。
```html
```
## 父元素定宽高 position+transform
原理与`position+margin`相同,CSS3的`transform`使得`div`向上平移自身高度的`50%`。
```html
```
## 父元素定宽高 position+calc
css3提供`calc`函数,能够进行动态计算。
```html
```
## 父元素不定宽高 flex
`flex`布局可以说是布局神器,极其强大,绝大部分现代浏览器都兼容性`flex`布局。
```html
```
## 父元素不定宽高 grid
`grid`布局将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,`grid`布局与`flex`布局有一定的相似性,都可以指定容器内部多个项目的位置。但是,它们也存在重大区别,`flex`布局是轴线布局,只能指定"项目"针对轴线的位置,可以看作是一维布局,`grid`布局则是将容器划分成"行"和"列",产生单元格,然后指定"项目"所在的单元格,可以看作是二维布局,可以认为`grid`布局比`flex`布局强大。
```html
```
## 父元素不定宽高 table
`table`中有`vertical-align`属性设置垂直对齐方式。
```html
```
## 示例
```html
垂直居中
```
## 每日一题
```
https://github.com/WindrunnerMax/EveryDay
```