CSS让元素居中是个经典的问题,那么问题来了,共有哪几种方式?不同的居中方式又分别适用于哪些情况?12种CSS居中方式来看看都有哪些哒~
##1.使用自动外边距margin:0 auto
实现水平居中
.container{
margin: 0 auto;//简写形式
background: red;
width: 800px;
}
可以为需要居中的元素创建一个起容器作用的div,添加一个如上所示的类,但要注意为该容器指定宽度。这是为什么捏?因为没有宽度会自动扩展到两端,也就看不出居中效果了,当然咯,对块级元素有效
##2.使用text-aling
实现水平居中
.container{
text-align: center;
}
把例如a标签,p标签等用一个class为container的div包起来,单独对行内元素应用text-aling:center;
没有效果,可以考虑外面包一层div。可用于文字的居中
##3.单行行内垂直居中:height=line-height
div{
height:100px;
line-height:100px;
}
将行高和高度设置一样达到居中效果,适用于单行行内元素居中的情况。
##4.多行行内垂直居中,把容器当做表格单元
div{
width: 100px;
height: 100px;
background: red;
display: table-cell;
vertical-align: middle;
}
当行内元素内容过多时会换行,这时候使用行高=高度就会发生错误,可以使用display:table-cell;vertical-aling:middle;当然长宽也是必要的,否则收缩包裹后依然看不出效果,此div可以包裹a标签或p标签。
display table 实现垂直居中的浏览器支持情况:ie8+ webkit firefox opera
##5.父元素相对定位,子元素绝对定位的居中,负外边距的居中
.div1{
width: 100px;
height: 100px;
background: red;
position: relative;
}
.div2{
height: 50px;
width: 50px;
background: yellow;
position: absolute;
left: 50%;
top: 50%;
margin-left: -25px;
margin-top: -25px;
}
通过让子元素相对于父元素绝对定位,并移动left,top形成居中效果,若只是想左右或者垂直居中,left,top只写一方面就好了。此方法要求元素有确定的宽高值。否则的话就要通过JavaScript来进行一些小计算了。在IE6上也可以哦~
##6.多行内容居中,且容器高度可变:设置上下padding
div{
background: red;
width: 100px;
padding-top: 20px;
padding-bottom: 20px;
}
原理很简单通过给上下增加相同的间距使得看起来像是居中一样。此样式的要求是容器不能有固定的高度
##7.背景图片的居中:background-position:center;
div{
background-image:url('/i/eg_bg_03.gif');
background-repeat:no-repeat;
background-attachment:fixed;
background-position:center;
}
注意需要把 background-attachment
属性设置为 “fixed”,才能保证该属性在 Firefox 和 Opera 中正常工作。在火狐浏览器(37.0.1)中试过的确没有fixed是不行的,但是chrome和IE都是可以的
##8.CSS3弹性盒模型flex
div{
background: red;
height: 100px;
display: flex;
justify-content:center;
/* 左右居中 */
align-items:center;
/* 上下居中 */
}
display:flex;是CSS3新增的一个布局方式,IE10不支持,但IE11上已经可以使用了, flex布局以前需要增加前缀,IE 11+,Firefox 22+,Chrome 29+,Opera 12.1 支持无前缀最新,亲测在最新的chrome和IE,火狐上都可用不必在添加前缀,语法说到display:flex;以前有用display:box;
有兴趣的还可以看看大漠这篇关于flex的讲解:Flexbox——快速布局神器
一丝的demo跨浏览器的CSS flex
flex 实现不固定大小垂直居中浏览器支持情况:ie10+ webkit opera firefox
##9.使用CSS3的translate属性
div{
width:100px;
height:100px;
background:red;
position:absolute;
top:50%;
left:50%;
transform:translate(-50%,-50%);
}
transform:translate()含义是变动,位移;如transform:translate(50px,0)表示向右位移50像素,都为正表示向右上位移,都为负表示向左向下位移。 transform是CSS3新增的一个属性,还可以用它别的属性形成旋转,放大等效果
translate 实现垂直居中的浏览器支持情况 ie9+ webkit firefox opera,实测IE8无效
##10.用:before伪元素实现水平垂直居中 关键代码:
body{
min-width:500px;
background:#999;
font-size:100%;
}
.wrap {
text-align: center;
height:100%;
}
.wrap:before {
content: '';
display: inline-block;
height: 100%;
vertical-align: middle;
margin-right: -0.25em;
}
.centered {
display: inline-block;
vertical-align: middle;
width: 480px;
background:#eee;
text-align:left;
}
要查看完整效果可查看在偶jsbin上写的一个例子用:before伪元素实现居中
或者放在codepen上的例子codepen:用before伪元素实现居中
##11.利用margin:auto;实现水平垂直居中
我们知道margin:0 auto
可以实现居中,而margin:auto 0
这样的的垂直居中不存在,可是margin:auto;
却是能实现居中效果的哟~
.div1{
margin: auto;
position: absolute;
top: 0; left: 0; bottom: 0; right: 0;
}
要注意的就是需要声明元素高度
##12.inline-block实现元素水平居中
.div1{
text-align: center;
background: red;
}
.div2{
display: inline-block;
border: 1px black solid;
}
适用于不定宽的元素,当margin:0 auto
等确定宽度的方法没有用了,那么就可以用inline-block。要注意的就是元素如果有宽就不起作用啦~
inline-block具有一些特殊的混合行为.正如他的名字所暗示的,它具有块级元素的特点,也有行内元素的行为.从块级元素角度来说,可以为他设定外边距和内边距,也可以通过它简便而有效的包围其他块级元素.从行内元素角度看,他会收缩包裹自己的内容,而不是扩展填充父元素.换句话说,inline-block元素的宽度始终等于其内容宽度.
解决方案就是为要居中元素的父元素应用text-align:center
,为要居中的元素设定display:inline-block
.这样设定就可以得到我们想要的结果:没有宽度的元素也能在其父元素内居中.要再垂直居中此时可用line-height=height