翻译自https://css-tricks.com/centering-css-com...css
我将原做者的代码整理成了Github Repo,而且在持续更新使用CSS居中的方法,欢迎fork和star个人项目css-center-complete。git
你们老是会抱怨如何在CSS中居中一个元素。为何会这么难呢?呵呵(使用这个来词翻译再好不过了)。我认为问题不在有多难,而是居中在不一样的场景中有那么多种方式,很难抉择到底该使用哪种。github
因此,咱们把这些选择作成一棵树状,但愿使用起来更简单吧。浏览器
你能够将行内元素居中在块级元素中,就像这样:ide
.center-children { text-align: center; }
代码连接布局
这个方法对于display
属性为inline, inline-block, inline-table, inline-flex
等的元素都有做用。flex
对于块级元素,能够经过设置他的margin
属性为auto
来达到居中的效果。前提是要设置一个宽度。若是不设置宽度的话,默认为100%,就用不着居中了。就像这样:ui
.center-me { margin: 0 auto; }
代码连接flexbox
若是须要在一行中居中两个及以上的块级元素,最好给他们设置display
属性为inline-block
。下面这个例子是在flexbox中给他们设置display: inline-block;
的:spa
除非你是想多个块级元素都在各自的顶部,若是是这样的话,那么使用amrgin: 0 auto;
也能够;
有的时候行内元素很明显能够垂直居中。只须要设置它们的上下padding
值相等:
.link { padding-top: 30px; padding-bottom: 30px; }
若是设置padding
不行,并且你想居中的是文本的话,那么,能够设置文本的line-height
与元素的height
相等。
.center-text-trick { height: 100px; line-height: 100px; white-space: nowrap; }
一、相等的padding
对多行的状况也适用。若是不起做用的话,那么这个元素或者文本的display
属性多是table-cell
。这种状况下,vertical-align
就有做用了。与其它状况不一样,这个是用来处理一行内的元素居中的。
二、若是类表格元素的居中不起做用,那么是否考虑使用flexbox?在flexbox的父元素中居中flexbox子元素就太简单了。
.flex-center-vertically { display: flex; justify-content: center; flex-direction: column; height: 400px; }
记住只有父级元素有固定的高度,这样写才有意义。
三、若是前面两种方法都不起做用,可使用ghost element
方法。在包含块里放置一个高度为100%的伪元素,这样,文本就居中了。
.ghost-center { position: relative; } .ghost-center::before { content: " "; display: inline-block; height: 100%; width: 1%; vertical-align: middle; } .ghost-center p { display: inline-block; vertical-align: middle; }
不知道网页布局的高度简直是太习觉得常的事情了。各类状况都会出现:
宽度改变,文字重排,高度会改变
不一样的文字样式的高度也不同
不一样文本的数量的高度也不同
固定比例的元素,好比图片啥的,在改变尺寸的时候也会改变高度等等
可是若是你知道元素的高度就好办了:
.parent { position: relative; } .child { position: absolute; top: 50%; height: 100px; margin-top: -50px; /* 若是没有使用border-box的话就只须要关心padding和border了 */ }
不知道元素高度的状况下,经过先将他往下移动50%,而后再向上移动他的高度的一半来居中也仍是有可能的。
.parent { position: relative; } .child { position: absolute; top: 50%; transform: translateY(-50%); }
别太惊讶,使用flexbox就太简单了
.parent { display: flex; flex-direction: column; justify-content: center; }
你彻底能够用各类方式将上面的技术结合起来达到完美居中的效果。但我以为能够把这些状况分为下面三种:
在使用绝对定位分别设置上下50%和左右50%以后,使用分别等于宽高一半的负边距就可以跨浏览器实现彻底居中了:
.parent { position: relative; } .child { width: 300px; height: 100px; padding: 20px; position: absolute; top: 50%; left: 50%; margin: -70px 0 0 -170px; }
若是不知道元素的宽高,那么可使用transform
属性在两个不一样的方向上设置-50%
(基于当前元素的宽高)来居中:
.parent { position: relative; } .child { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); }
要在flexbox中居中,须要用到两个居中属性:
.parent { display: flex; justify-content: center; align-items: center; }
通过上面这些方法,咱们彻底可使用CSS来达到完美的居中。