今天面試了一個前端實習生,我問了一個比較簡單的問題,就是css如何實現元素垂直居中的問題,但是要說出多種方案。其實他說的不錯,基本上說到了flex佈局,grid佈局等下麵提到的佈局。還不錯,但是這幾種都是已經經常用的,老生常談,但是我想聽到他說一種用的比較少的解決方案,瞭解一下他學習的深度和廣度。但 ...
今天就給大家講一講這個解決方案吧
眾所周知,“css如何實現元素垂直居中?”已經是一個老生常談的問題了,這個問題目前已經有了許多解決方案,這些方案也都有各自適用的場景以及優缺點,大致如下:
-
flex佈局
-
grid佈局
-
table佈局
-
line-height搭配height
-
position搭配margin
-
position搭配transform
那麼今天我們就來瞭解其中一種有效但不常被使用的方案的原理,它就是:偽元素:before
搭配vertical-align:middle
實現元素垂直居中,先來看一下具體的代碼實現:
<style type="text/css">
.parent {
display: inline-block;
width: 300px;
height: 300px;
font-size: 0;
background: #80848f;
text-align: center;
}
.parent:before {
display: inline-block;
width: 20px;
height: 100%;
content: '';
background: #ff9900;
vertical-align: middle;
}
.child {
display: inline-block;
width: 50px;
height: 50px;
background: #19be6b;
vertical-align: middle;
}
</style>
<div class="parent">
<div class="child">child</div>
</div>
上面的代碼運行結果是這樣的:
相信代碼大家已經很熟悉了,但是你真正理解其中的原理嗎?下麵我們就看一下它是如何怎樣一步步實現垂直居中的
分析
首先我們要知道一個關鍵知識點,那就是:父元素基線(baseline)的位置是可以改變的,它不是固定的,記住這一點很重要
接著,我們精簡一下代碼,去掉關鍵部分
<style type="text/css">
.parent {
display: inline-block;
width: 300px;
height: 300px;
/* font-size: 0; */
background: #80848f;
text-align: center;
}
.parent:before {
display: inline-block;
width: 20px;
height: 100%;
content: '';
background: #ff9900;
/* vertical-align: middle; */
}
.child {
display: inline-block;
width: 50px;
height: 50px;
background: #19be6b;
/* vertical-align: middle; */
}
</style>
<div class="parent">
<div class="child">child</div>
</div>
我們將font-size:0
和vertical-align:middle
註釋後,運行結果如下:
從圖中不難看出,對於:before
偽元素(以下簡稱偽元素)來說,加與不加vertical-align:middle
,結果都是一樣的,在垂直方向它始終會占滿父元素;但對於.child
元素情況就不同了,它在垂直方向的位置發生了改變,那麼這是為什麼呢?
其實偽元素在此處的作用就是為了改變(或者叫重新定義)父元素baseline的位置,我們來回顧一下vertical-align:middle
在MDN文檔中的定義
註:middle: 使元素的中部與父元素的基線加上父元素x-height的一半對齊
那麼,對比上面的示例:
-
偽元素的中部就是它垂直方向的中點,這不難理解
-
父元素的基線我們暫且不管它在哪裡,我們只要記住它是可以改變的就足夠了
-
x-height的一半,因為我們在父元素中將font-size置為0,所以x-height(小寫x字母的高度)的一半也是0,即沒有高度
這樣一下,就相當於偽元素的中點只要與父元素的基線對齊就可以了,因為x-height是0,所以加與不加無所謂;再加上css中元素預設是左上方對齊的,對於這個限制,也就是說當偽元素加上vertical-align:middle
後,預設情況下它是不會超出父元素的範圍顯示的,那麼這時偽元素高度已確定:父元素高度的100%,中點也已確定
接下來偽元素就會對父元素說:我垂直方向的中點已經確定了,變是不可能變的,這輩子都不可能變,但我的中點想和你的基線對齊,你自己看著辦吧
然後父元素妥協了,將它自身的基線移動到與偽元素中點水平對齊的位置,到此父元素基線的位置也已確定,近似其高度的一半
最後.child元素添加了自己的vertical-align:middle
,按照middle: 使元素的中部與父元素的基線加上父元素x-height的一半對齊這句定義,.child元素的font-size由於繼承關係也是0,所以它的中點也就自然而然與早已確定的父元素基線對齊,從而實現垂直居中,到此結束
總結
其實這種垂直居中方式的原理主要有以下幾個要點:
-
css中元素預設是左上方對齊的
-
-
父元素將font-size置為0,進而x-height也被置為0
-
父元素基線的位置可改變
只要理解了原理,我們就不用死記硬背代碼,也不會忘記如何實現;文中如有錯誤,歡迎指正~
對於垂直居中這種常見問題,哪種方案是你的最愛呢,歡迎留言討論~
對了,小編為大家準備了一套2020最新的web前端資料,需要點擊下方鏈接獲取方式