元素水平居中需求比较常见,常见的作法是经过margin来完成。css
元素默认的margin-left和margin-right应该都是0。flex
而元素水平居中其实只须要把margin-left和margin-right都设置成auto就能够了。spa
.demo { margin-left:auto; margin-right:auto; }
网上有一种常见的写法是:code
.demo { margin: 0 auto; }
这样写简短些,不过在设置margin-left和margin-right为auto时,也设置了margin-top和margin-bottom为0。it
垂直居中作起来比较麻烦,常见的一种方法是经过vertical-align:middle来实现。class
但是vertical-align的效用很奇怪,竟然是让兄弟元素向本身对齐(竟然是做用在别的元素身上)。方法
下面使用 伪元素first-child 和 before 配合vertical-align实现垂直居中:demo
.demo-parent > * { display: inline; vertical-align:middle; } .demo-parent:first-child:before { content: ""; height: 100%; display:inline-block; vertical-align:middle; }
0.因为vertical-align做用于“同行”兄弟元素,因此兄弟元素至少是display:inline这样可共行的。因为是相互对其,因此也须要vertical-align属性。margin
1.因为vertical-align对齐是以本身的高度作参照,伪元素height:100%是为了和父元素同样宽,display:inline-block是使内容为空的该伪元素能够有高度。伪元素
2.注意vertical-align实际上是一个伪元素的属性,并不是demo-parent的。
demo-parent的子元素因为这个兄弟伪元素而垂直居中。
前提是同行,若是元素被挤到下一行,这个伪元素的vertical-align并不对其起做用。
CSS3为display属性添加了flex这个新的可用值,在该值下只须要简单地给父元素设置几个属性就能够实现居中。
justify-content:center;使得子元素水平居中
align-items:center;使得子元素垂直居中
.demo-parent { display:flex; justify-content:center; align-items:center; }