
最近面試的時(shí)候,面試官問(wèn)到了CSS水平垂直居中布局的方式,對(duì)于剛?cè)肭岸藳](méi)多久的我,無(wú)疑是一臉懵逼,閑了趕緊查閱資料分析一波,給各位分享一下,避免落坑。
首先先說(shuō)明一下html和一些基礎(chǔ)css樣式,下面就不再贅述!
html
<body> <div class="div1"> <div class="box size">垂直水平居中</div> </div> </body>
公共css代碼如下
<style type="text/css">
/* 公共樣式 */
.div1{
width: 300px;
height: 300px;
border:1px solid aqua;
}
.box{
background: #00FFFF;
}
.box.size{
width:100px;
height:100px;
}
</style>這些css樣式在后續(xù)介紹中默認(rèn)帶上,不再贅述!
一、 absolute 和 margin auto(常用)
同樣居中元素的寬高必須固定,并且需要得知子元素的寬高
這種方式通過(guò)設(shè)置各個(gè)方向的距離都是0,此時(shí)再將margin設(shè)為auto,就可以在各個(gè)方向上居中了
.div1{
position: relative;
}
.box{
position: absolute;
top:0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
}
二、absolute 和margin(負(fù)值)
簡(jiǎn)單說(shuō)一下原理,利用了絕對(duì)定位,絕對(duì)定位的百分比是相對(duì)于父元素的寬高,所以我們可以根據(jù)這個(gè)原理將元素居中顯示。但是要注意:絕對(duì)定位是基于子元素的左上角來(lái)說(shuō)的,但是要想讓子元素居中顯示,就要解決這個(gè)問(wèn)題。
此時(shí)可以利用margin的負(fù)值來(lái)實(shí)現(xiàn)效果,當(dāng)外邊距為負(fù)值時(shí),元素向相反方向定位,這樣我們將子元素的外邊距設(shè)置為子元素的寬高的一半就可以實(shí)現(xiàn)了。(PS:缺點(diǎn)就是必須得到子元素的寬高)
.div1{
position: relative;
}
.box{
top: 50%;
left: 50%;
position: absolute;
margin-top: -50px;
margin-left: -50px;
}三、absolute 和 calc
同樣需要子元素的寬高固定,并知道寬高,css3具有計(jì)算屬性。
top的百分比是基于元素左上角減去寬度的一半即可(PS:依賴(lài)calc的兼容性)
.div1{
position: relative;
}
.box{
position: absolute;
top: calc(50% - 50px );
/* 減號(hào)前后沒(méi)有空格,該樣式不生效*/
left: calc(50% - 50px );
}
當(dāng)我在寫(xiě)這段代碼的時(shí)候,發(fā)現(xiàn)一個(gè)有趣的事情,calc(50%-50px)如果減號(hào)前后沒(méi)有空格的話(huà),樣式就不會(huì)生效,寫(xiě)上空格的話(huà),就會(huì)正常生效了,具體原因我也不太清楚emmmmm
下面的方法將不需要知曉子元素的寬高即可設(shè)置
html修改為:
<body> <div class="div1"> <div class="box">水平垂直居中,不需要子元素固定寬高</div> </div> </body>
公共css如下
.div1{
width: 300px;
height: 300px;
border: 1px solid red;
}
.box{
background: #00FFFF;
}四、flex(常用)
flex是現(xiàn)代的布局方案僅僅需要幾行代碼即可實(shí)現(xiàn)居中效果
.div1{
display: flex;
justify-content: center;
align-items: center;
}五、line-height
利用行內(nèi)元素居中屬性也可以做到水平垂直居中。把box設(shè)置為行內(nèi)元素,通過(guò)text-align就可以實(shí)現(xiàn)水平居中vertical-align 也可以在垂直方向做到居中(PS:這種方法需要在子元素中將文字顯示重置為想要的效果)
.div1{
line-height: 300px;
text-align: center;
font-size: 0px;
}
.box{
font-size: 10px;
display: inline-block;
vertical-align: middle;
line-height:initial;
/* 修正文字 */
text-align: left;
}六、absolute 和 transform
不需要子元素寬高固定,但是依賴(lài)于translate2d的兼容性
.div1{
position: relative;
}
.box{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
}七、css-table
css新增的table屬性,可以把普通元素改變?yōu)閠able元素的顯示效果,也可以實(shí)現(xiàn)水平居中
.div1{
display:table-cell;
text-align: center;
vertical-align: middle;
}
.box{
display:inline-block;
}以上就是我總結(jié)的一些居中布局的方法了,還有什么其他的歡迎補(bǔ)充!
個(gè)人感覺(jué): 我比較喜歡 absolute +margin auto 、flex、absolute 和 transform,移動(dòng)端最好用flex吧,pc端我喜歡 absolute +margin auto






