HTML+CSS33 关于居中的总结
关于CSS中水平、垂直居中的总结
准备工作
HTML结构:
1 | <div class="container"> |
公共样式:
1 | .container { |
水平居中的方法
(1)使用text-align: center
对于行内元素,可以直接使用text-align: center来水平居中
1 | .container { |
(2)使用margin: 0 auto
对于宽度确定的块级元素,可以使用margin: 0 auto来水平居中,原理和后面的绝对定位加margin: auto的原理类似,后面单独结合总结。
1 | .text { |
(3)flex布局
如果不考虑兼容性,很完美的方案:
1 | .container { |
(4)grid布局
显然兼容性有着问题的方案:
1 | .container { |
(5)绝对定位+移动
父元素相对定位,子元素绝对定位,并且使用transfrom移动自身宽度的-50%(如果子元素的高度已知也可以通过margin向左移动自身高度的一半
1 | .container { |
(6)绝对定位和margin: auto
1 | .container { |
一定要指定子元素的宽度,否则子元素就会充满父元素
垂直居中的方法
(1)vertical-align: middle
针对行内元素,并且需要有一个兄弟行内元素,撑满父元素:
1 | .container:after { |
(2)line-height === height
让父元素的height和line-height相等,一般适用于文字的居中
1 | .container { |
(3)padding
适用于父元素高度不确定,或者说父元素高度是根据子元素高度确定的情况:
1 | /* container 不能指定 height */ |
(4)绝对定位+移动
父元素相对定位,子元素绝对定位,并且使用transfrom移动自身高度的-50%(如果子元素的高度已知也可以通过margin向上移动自身高度的一半
1 | .container { |
(5)flex布局
如果不考虑兼容性,很完美的方案:
1 | .container { |
(6)grid布局
显然兼容性有着问题的方案:
1 | .container { |
(7)display: table-cell + vertical-align: middle
1 | .container { |
平时没怎么用,不知道有什么缺点呢~
(8)绝对定位和margin: auto
1 | .container { |
一定要指定子元素的高度,否则子元素就会充满父元素。
利用margin: auto居中的原理
1 | .father { |
- 优点:兼容性好
- 缺点:子元素需要指定宽高(否则会充满父元素)
原理:以水平方向举例,垂直方向相同。
当绝对定位的元素只定义了一个方向属性时(比如left),并且元素没有利用width指定宽度,宽度是0;当同时指定了相反的两个方向的属性时且相等(left和right都为0),此时如果没有指定width,则宽度会充满父元素,自定宽度会沿着left摆放。
此时指定marign:
- 如果一侧定值,一侧
auto,auto为剩余空间大小 - 如果两侧均是
auto,则平分剩余空间,所以就居中了。
块级元素利用margin: 0 auto水平居中的原理也是这样。