居中是页面开发中常常遇到的问题。css
使用合适的、简单的、兼容性好的居中方式是咱们页面仔在整个工做生涯中都要面对的问题。html
来看这个例子,一张图片和文字进行居中。以下图所示:
img
与文字内容都是行内元素,所以直接使用text-align
就好了。代码以下图所示: 前端
在最外层的div
中使用text-align:center
的问题是,会致使全部的子元素都会继承这个属性。若是还有一段文字用做介绍该图片的做用时,这段文字也会被居中。
而咱们但愿这段文字是左对齐的,就不得不单独设置其text-align:left
属性,以覆盖其父元素的属性。而且若是还有更多的子元素也须要这样作,覆盖属性自己就是下策,所以要采用其余方法。git
因为显示的图片多是变化的,宽高是不定的,但显示区域是固定的,因此通常会显式地给图片设置一个宽高。这个时候知道宽度就能够设置margin:0 auto
方法,左右的margin
设置为auto
,浏览器就会自动设置左右的margin
值为容器剩余宽度的一半。github
使用margin: 0 auto
能够说是最经常使用的左右居中的方法,不只适用于块级元素也适用于行内元素。不少网页的布局都是使用margin: 0 auto
,例如淘宝pc端,以下图所示:web
第一个垂直居中的方法是借助table-cell
属性,效果图以下:编程
table-cell
的一个好处就是它能够兼容到IE8
。浏览器
table-cell
属性的缺点:bash
margin
属性失效,由于margin
不适用于表格布局。因此使用margin: 0 auto
属性是不能使container
左右居中的。解决的方法也很简单:只须要在container
外层再多套一个div容器,而后设置这个外层容器的margin: 0 auto
便可。table-cell
的元素再设置宽高为百分比是不起做用的。常见的场景是要将宽度属性设置为外层容器宽度的100%,解决方法是将container
的宽度设置成一个很大的值,例如5000px
,这样就达到100%的目的。container
须要设置position
为absolute
,table-cell
属性就会失效。由于设置position: absolute
就会把元素display
强制设置为block
类型。解决办法仍是在外层套一层div
容器,将position: absolute
属性做用于这个容器上。上面所说table-cell
的第三缺点的解决方法有一个反作用,就是设置内层container
的height
和width
为百分比时会失效。因为这个缘由,致使有一种状况不能使用display:table-cell
垂直居中。布局
就是须要在页面弹出一个框,这个框的位置须要在当前屏幕中左右上下居中。这时候一般须要将这个框的position
设置为absolute
,这个时候table-cell
就不能发挥做用了。
解决办法是使用relative
定位,设置top
为50%,将弹窗的起始位置放到页面中间,再设置margin-top
为元素高度的负一半,这样使得弹窗在页面中间位置再往上移到一半自身的高度,这就正好在中间了,左右居中也可相似处理。
使用此方法的缺点是须要知道具体的高度,没法根据内容长短自适应。
用tranform
方法,将margin-top
一个具体像素的负值改为transform: translate(0, -50%)
,由于translate
里面的百分比是根据元素自己的高度计算的,因此就能够达到自适应的效果。
这个办法十分方便,并且加上-webkit-
前缀,能够兼容到IE9。
而margin-top:-100px
与transform:translate(0, -50%)
都有一个缺点,就是若是设置left
为50%是借助position
为absolute
的话,可能会致使换行
原本应该是一行显式的p
元素却换行了,这是由于在一个relative
元素里面的absolute
定位的子元素会经过行内元素换行的方式,尽量不超过容器的边界。因为设置left
为50%,致使p
元素超了边界,因此就换行了,即便再设置translate:-50%
也已经晚了。
flex
布局十分容器和方便,只需在副容器设置3个属性就好了
.container{
display: flex;
align-items: center;
justify-content: center;
}
复制代码
但flex
的缺点是不支持IE
vertical-aligin:middle
主要是运用在行内元素中的。
若是不作任何处理,那么默认的垂直居中是以baseline
为基准的。
为了可以垂直居中,须要改变居中方式。
要每一个元素都要设置。
若是container
的高度比图片要高,就会有留空的效果,以下:
为了让中间的内容可以在container
里上下居中,能够设置文字的line-height
为container
的高度,这样文字就上下居中了。因为图片与文字是垂直居中的,因此图片在container
里也是上下居中了。
也就是说,若是须要垂直居中一个div
里的比div
高度小的图片,能够添加一个元素,让它的line-height
等于div
的高度。下面使用伪元素::before
来添加line-height
。
或者使用display: inline-block
属性,加上height: 100%
。这个方法兼容性更好。
使用absolute
定位与margin:auto
方法也能够实现居中。
若是图片比container
大,这种方法就不适用了。由于有一个种比较常见的场景:图片有一边和contianer
同样大,另外一边按图片的比例缩放,图片居中显示,超出的截断。这种状况下,只需把left/right/top/bottom
设置为一个很大的负值便可。
以上就是css
中经常使用的居中方法,若是有更好的方法能够在评论区留言教教我。
本文参考如下资料
更多文章请移步楼主github,若是喜欢请点一下star,对做者也是一种鼓励。