CSS垂直居中的另類實現(xiàn)代碼詳解(不走尋常路)

前言
眾所周知,“css如何實現(xiàn)元素垂直居中?”已經(jīng)是一個老生常談的問題了,這個問題目前已經(jīng)有了許多解決方案,這些方案也都有各自適用的場景以及優(yōu)缺點,大致如下:
- flex布局
- grid布局
- table布局
- line-height搭配height
- position搭配margin
- position搭配transform
- ...
那么今天我們就來理解其中一種有效但不常被使用的方案的原理,它就是:偽元素:before
搭配vertical-align:middle
實現(xiàn)元素垂直居中,先來看一下具體的代碼實現(xiàn):
<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>
上面的代碼運行結果是這樣的:
相信代碼大家已經(jīng)很熟悉了,但是你真正理解其中的原理嗎?下面我們就看一下它是如何怎樣一步步實現(xiàn)垂直居中的
分析
首先我們要知道一個關鍵知識點,那就是:父元素基線(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元素情況就不同了,它在垂直方向的位置發(fā)生了改變,那么這是為什么呢?
其實偽元素在此處的作用就是為了改變(或者叫重新定義)父元素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%,中點也已確定
接下來偽元素就會對父元素說:我垂直方向的中點已經(jīng)確定了,變是不可能變的,這輩子都不可能變,但我的中點想和你的基線對齊,你自己看著辦吧
然后父元素妥協(xié)了,將它自身的基線移動到與偽元素中點水平對齊的位置,到此父元素基線的位置也已確定,近似其高度的一半
最后.child元素添加了自己的vertical-align:middle
,按照middle: 使元素的中部與父元素的基線加上父元素x-height
的一半對齊這句定義,.child元素的font-size
由于繼承關系也是0,所以它的中點也就自然而然與早已確定的父元素基線對齊,從而實現(xiàn)垂直居中,到此結束
總結
其實該種垂直居中方式的原理主要有以下幾個要點:
- Css中元素默認是左上方對齊的
- 偽元素高度與父元素保持統(tǒng)一
- 父元素將font-size置為0,進而x-height也被置為0
- 父元素基線的位置可改變
到此這篇關于CSS垂直居中的另類實現(xiàn)的文章就介紹到這了,更多相關css 垂直居中內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持腳本之家!
相關文章
- 這篇文章主要介紹了CSS3 不定高寬垂直水平居中的幾種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起2020-03-26
- 這篇文章主要介紹了利用css樣式實現(xiàn)表格中字體垂直居中的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-16
CSS3實現(xiàn)水平居中、垂直居中、水平垂直居中的實例代碼
在前端面試中經(jīng)常會遇到css居中效果的實現(xiàn),今天小編給大家分享幾種css垂直水平居中的方法,通過實例代碼給大家講解,需要的朋友參考下吧2020-02-27- 這篇文章主要介紹了手把手教你CSS水平、垂直居中的10種方式(小結),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著2019-11-07
- 這篇文章主要介紹了css常用元素水平垂直居中方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習2019-08-09
- 這篇文章主要給大家介紹了關于css布局教程之如何實現(xiàn)垂直居中的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用css具有一定的參考學習價值,需要的朋友們下2019-07-12
- 在前端布局過程中,我們實現(xiàn)水平居中比較簡單,一般通過margin:0 auto;和父元素 text-align: center;就能實現(xiàn)。今天小編給大家?guī)砹薈SS實現(xiàn)垂直居中的幾種方法小結,感興2019-05-14