初級前端面試必考題,不少面試官都喜歡問這個問題。實習生的我面試遇到好幾回了,在這裏作一下總結。css
1.absolute + 負margin
2.absolute + margin auto
3.absolute + calc
複製代碼
1. absolute + transform
2. text-align + lineheight + vertical-align
3. css-table
4. flex
5. grid
複製代碼
<div class="parent">
<div class="child"></div>
</div>
複製代碼
.parent{
border: 1px solid cadetblue;
width:300px;
height:300px;
}
.child{
height: 100px;
width: 100px;
background: cornflowerblue;
}
複製代碼
.child{
height: 100px;
width: 100px;
background: cornflowerblue;
position: absolute;
top: 50%;
left: 50%;
margin-left: -50px;
margin-top: -50px;
}
複製代碼
絕對定位的百分比是相對於父元素的寬高,top:50% left:50%是基於子元素的左上角偏移的,效果以下圖:前端
在使用子元素的外邊距爲子元素寬高一半的負值進行相反方向偏移就能夠讓子元素居中了。css3
.child{
height: 100px;
width: 100px;
background: cornflowerblue;
position: absolute;
position: absolute;;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
}
複製代碼
設置各個方向的距離都是0,margin設爲auto表明子元素到父元素上下、左右的距離相同,就能夠實現水平垂直居中了。面試
.child{
height: 100px;
width: 100px;
background: cornflowerblue;
position: absolute;
top: calc(50% - 50px);
left: calc(50% - 50px);
}
複製代碼
css3的計算屬性,top、left的百分比是基於元素的左上角偏移,那麼在減去自身一半的寬高就行了。bash
.child{
height: 100px;
width: 100px;
background: cornflowerblue;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
複製代碼
transform的translate屬性也能夠設置百分比,其是相對於自身的寬高,因此translate設置爲(-50%,-50%),就能夠作到水平垂直居中了。編輯器
父元素添加樣式佈局
text-align: center;
line-height: 300px;
複製代碼
子元素添加樣式flex
display: inline-block;
vertical-align: middle;
複製代碼
middle:元素上下邊的中心點和行基線向上1/2x的高度位置對齊。url
圖中的紅線是我認爲的行高基線(這個知識點不太熟...)spa
.parent{
border: 1px solid cadetblue;
width:300px;
height:300px;
display: table-cell;
text-align: center;
vertical-align: middle;
}
.child{
height: 100px;
width: 100px;
background: cornflowerblue;
display: inline-block;
}
複製代碼
這是我最經常使用的一種方式,flex佈局除了水平垂直居中外還有不少屬性能夠了解。
.parent{
display: flex;
justify-content: center;
align-items: center;
}
複製代碼
css新出的網格佈局 ,兼容性不太好。
.parent {
display: grid;
}
.child {
align-self: center;
justify-self: center;
}
複製代碼