第一种 借助inline-block的特点
#d1{
display:inline-block
width:500px
height:500px
border:1px solid red
text-align:center
}
#d1:after{
content:""
display:inline-block
height:100%
vertical-align:middle
background:#000
}
#d2{
display:inline-block
width:200px
height:200px
border:1px solid red
vertical-align:middle
}
<div id="d1">
<div id="d2"></div>
</div>
第二种 利用css的transform 好用但是兼容性不好,IE10+以及其他现代浏览器才支持(手机开发可忽略)
.box{width:300pxheight:300pxborder:1px solid redposition:relative}
.content{
position:absolute
width:100px
height:100px
border:1px solid red
margin:0 auto
top:50%left:50%
/* transform:translateY(-50%)仅垂直居中*/
/* transform:translateX(-50%)仅水平居中*/
transform: translate(-50%, -50%)
/*
若父容器下只有一个元素,且父元素设置了高度,则只需要使用相对定位即可
父元素{
height:xxx
}
.子元素 {
position: relative
top: 50%
transform: translateY(-50%)
}
*/
}
<div class="box">
<div class="content"></div>
</div>
第三种:绝对定位之后的偏移
.box{
border:1px solid red
width:300pxheight:300pxposition:relative
}
.content{
border:1px solid red
width: 200pxheight: 200px
position: absoluteleft: 50%top: 50%
margin-top: -100px /* 高度的一半 */
margin-left: -100px /* 宽度的一半 */
}
<div class="box">
<div class="content"></div>
</div>
第四种:定位之后的margin: auto
.box{
border:1px solid red
width:300pxheight:300pxposition:relative
}
.content{
width: 200px
height: 200px
position: absolute
left: 0
top: 0
right: 0
bottom: 0
margin: auto
border:1px solid red
}
<div class="box">
<div class="content"></div>
</div>
第五种 flex布局
<div style="display:flexdisplay: -webkit-flexjustify-content:centeralign-items:centerwidth: 300pxheight: 300pxborder:1px solid red">
<div style="width: 200pxheight: 200pxborder:1px solid red"></div>
</div>
第六种利用display:table-cell的vertical-align属性 子元素加上“display:inline-block”可水平居中
<div style="display:table-cellvertical-align:middletext-align:centerwidth:300pxheight:300pxborder:1px solid red">
<div style="border:1px solid redwidth:200pxheight:200pxdisplay:inline-block"></div>
</div>
第七种 使用css3中的display:-webkit-box的用法这种方法还没有得到浏览器的普遍支持,如有兴趣,自行学习
我们以一个面试题开始吧
这道题看似貌似很简单,但是我们需要分析具体的场景,因为不同的显示方式的使用利弊是不一样的。
以下的讨论都是子元素相对于其父元素的水平居中。垂直居中,以后会说到。
常见的行内元素有 span img 等,对这些元素居中设置,只需要在父元素的css中添加 text-align:center 即可。同样它也对行内块元素也是有效的。
但是,有个缺点,由于 text-align 是可继承属性,即父元素内部的所有元素都会继承这个属性,从而它的子元素内部的文本都会居中显示了。因此需要对子元素的文本居中方式单独设定。
针对块级元素的居中,我们将分为定宽和不定宽两种情况来讨论。
1.定宽
(1)子元素是正常流布局
若子元素的宽度是已知的,那么我们可以设置子元素的左右 margin 为 auto 即可
行内块元素也算块级元素,同样适用
目前所有浏览器都是支持的
(2)子元素绝对定位布局(absolute)
如果子元素是绝对定位的,由于子元素此时是脱离文档流,上面的方法就失效了。这时需要明确指出子元素的定位,四个方位均要指定。如下:
这样也可以实现绝对定位元素的居中。原因可点击 这里 。如果绝对定位子元素的margin为auto,你会发现它水平垂直居中了!此方法仅适用于IE8+浏览器中,IE7就挂了,不过你可以下面这个方法:
2.不定宽
不定宽元素如果要居中需要额外的辅助手段
(1)css3新特性 transform
如果你对浏览器并没有什么特别要求,那么可以使用css3提出的新属性 transform 完成居中需求
这里需要子元素是绝对定位
(2)借助table元素
上面定宽元素设定左右margin为auto之所以可以居中,原因是左右margin会平分父元素剩下的空间。有个元素除外,那就是tabel元素。table有趣的地方在于它本身并不是块级元素,如果不给它设定宽度的话,它的宽度由内部元素的宽度“撑起”,但即使不设定它的宽度,仅设置margin-left:auto和margin-right:auto就可以实现水平居中。
最大的缺点想必你也是知道,就是无关标签太多,加深了嵌套的层级,维护性很差。
(3)父元素使用float布局
这里需要多添加一层父元素,父子元素均float布局,之后设置position为relative,left为50%
缺点是你需要额外处理浮动所带来的一些问题。并且如果你设置了背景色,布局会有些混乱
以上是我对元素实现居中的一些方法,欢迎大家补充。
2017.6.11 晴
于上海浦东
前言:根据最近学习的课程,简单总结一下学习到的css左右布局以及居中方案。后期学习深入之后再回来进行css居中的完整总结。给所有子元素添加 float: left ,给父元素加 clearfix 类,清除浮动
html:
css:
将内联元素外部的块级元素的 text-align 设置为 center ,即可实现内联元素( inline 、 inline-block )的水平居中。
演示
将固定宽度的块级元素的 margin-left 和 margin-right 设置为 auto ,即可实现块级元素的水平居中。
演示
将每个块级元素的 display 设置为 inline-block ,然后将它们的父容器的 text-align 设置为 center ,即可使多个块级元素水平居中。
演示
设置内联元素的行高( line-heigt )和内联元素的父元素的高度( height )相等,且内联元素的字体大小远小于行高,即可使内联元素垂直居中。
演示
通过绝对定位元素距离顶部50%,并设置margin-top向上偏移元素高度的一半,即可实现垂直居中。
演示
借助CSS3中的transform属性向Y轴反向偏移50%的方法实现垂直居中
演示