前言css
爲何寫這篇總結?最近在文字圖標垂直對齊上用到css的vertical-align屬性,可是有的時候有效,有的時候無效,經常迷惑不解,反思這是本身對vertical-align的基本認知不夠形成的。因此想在本身理清問題來龍去脈的同時,加深對vertical-align的理解,產出以下筆記。html
vertical-align是自css1就存在的屬性,該屬性定義行內元素(也就是display值爲inline和inline-block的元素)、表格元素(table-cell)以及 ::first-letter、::first-line選擇的元素的基線相對於該元素所在行(line-box)的垂直對齊。segmentfault
行內元素:a, span, b, i, button, input, label, select, textarea 等
表格元素:display爲table-cell的元素 通常指td
其餘: ::first-letter、::first-line字體
取值ui
vertical-align: baseline | sub | super | text-top | text-bottom | middle | top | bottom | <percentage> | <length>
註釋: 根據MDN說明,取值可分爲三大類spa
相對父元素的值(使設置該屬性的元素相對其父元素垂直對其).net
<percentage> 元素基線對齊到父元素基線上方的對應百分比位置。該百分比相對於父元素的line-height,可取負值code
查看代碼htm
注:<length>,<percentage>取負值越多時距離上頂端越遠,和margin取值相反 沒有基線的元素,使用外邊距的下邊緣替代。
相對行(line-box)的值(使設置該屬性的元素相對整行垂直對齊)blog
表格單元格的值
baseline
baseline基線,字母'x'的下邊沿線
盒模型的上下邊界 與 baseline
如圖:
綠色:行高的上下邊界
紅色:文本的上下邊界
藍色:baseline位置
左、中、右分別爲行高一、二、0.5的表現,行高爲1時,文本邊界與行高邊界重合。內聯元素的外邊緣與該行高的頂部和底部邊緣對齊。若是行高小於字體的高度,不會受影響,但top, bottom 會對齊文本邊界。
inline-block元素的基線
圖中左、中、右都是inline-block元素,左圖inline-block元素內部存在未脫離文檔流的文本x,中圖在左圖包含文本基礎上添加overflow:hidden,右圖不包含任何文本。紅線表示margin-box邊界, 藍線表示baseline,黃色爲border, 白色爲padding區域,綠色爲content區域。
可見 inline-block元素的外邊緣就是margin-box的邊緣、inline-block元素的baseline的位置要看該元素有沒有處於正常流的內容以及元素的overflow屬性值是否是visible。
baseline的肯定規則
一、inline-table元素的baseline是它的table第一行的baseline。
二、父元素line-box的baseline是最後一個inline-box的baseline。
三、inline-block元素的baseline肯定規則
icon與文本對齊
上圖左爲icon設置vertical-align: middle沒有生效,很明顯圖標和文字沒有對齊。標註參考線後
緣由在於左邊文字vertical-align使用默認值baseline。而vertical-align:middle對應元素中部對齊於baseline加上半個x的距離(half of the x-height),文本會高出icon一段距離。
右圖中,文字與icon都對齊於一箇中點,line-box的行高增長,baseline位置不變,文字的baseline稍微下移,位於line-box的baseline的下方。此時文本與圖標對齊。
總結:查閱不少資料,算把vertical-align理解了。其中還有一些深刻的知識點沒有記錄,下面會貼上參考資料。
寫這篇筆記同時也解決了我以前的對inline-block元素間存在間隙的疑問以及對應的解決方案,點此進入。
總之 收穫多多 ( • ̀ω•́ )✧
參考資料:
深刻理解css中vertical-align屬性
關於Vertical-Align你須要知道的事情 [原] [譯]
深刻理解css之vertical-align
MDN vertical-align