web開發筆記之vertical-align

簡介

今天我打算對css樣式vertical-align的知識點進行一些總結,在我寫具體內容之前,我先要說明一下,就是關于vertical-align的已經有很多文章都有所解釋,但是我總覺得他們在某些點上解釋不夠清楚,所以我這次的總結是基于我看過的一些文章和自我的理解寫的,因此不具有權威性,甚至有些地方會有些出入,所以只能僅供參考.如果大家有什么好的提議,我希望可以告訴我.

內容

vertical-align樣式只對inline級的元素有效,即display為inline,inline-block,inline-table的元素. 所以這個屬性對塊級元素是無效的.
而在介紹該樣式前,我要先向大家介紹兩個至關重要的概念.

  • linebox

linebox是具有一個與該行最頂的元素的頂部邊緣對齊的頂部邊緣和一個與該行最底的元素的底部邊緣對齊的底部邊緣的區域.這句很拗口,下面見圖:

linebox.png

其中紅色的虛線區域便是linebox包圍的區域,linebox的高度取決于內容.許多個inline級元素一同構成一個linebox.
1.其中top對齊方式就是元素的頂部與linebox的頂部對齊(重合).

2.其中middle對齊方式就是元素的頂部和底部的中點與linebox的中點對(重合).

3.其中baseline對齊方式就是元素的頂部與linebox的baseline對齊(重合),但是關于linebox的baseline的位置并有一個固定的取值,它是會變化的,不過我們可以通過寫一個沒有設置任何對齊方式的內容為x文本來確定linebox的基線,緊貼x的底部的虛線便是linebox的基線.(可見上圖)

4.其中bottom對齊方式就是元素的頂部與linebox的底部對齊(重合).

5.其中sub對齊方式就是元素的baseline低于linebox的baseline.一般常用來做下標,例:


sub.png

6.其中super對齊方式就是元素的baseline略高于linebox的baseline.一般常用來做上標,例:

super.png
  • baseline.
    上述中提到了linebox的baseline的位置,所以下面便不再重復了,直入主題.
    我來說下inline級元素的baseline的位置,inline級元素的baseline的位置分為兩種:
  • inline元素

inline.png

在這里你看到三行的文本相鄰排布。行高的頂部和底部是由紅線表示的,字體的高度是由綠線來表示的,而baseline是由藍線表示的。在左邊,文本具有一個與字體大小相同的行高,綠色和紅線在上下都重疊了。在中間,行高(line-height)是字體大小的兩倍大。在右邊,行高是字體大小(font-size)的一半。
inline元素的外邊緣跟自己line-height的頂部和底部邊緣對齊,如果line-height小于font-size的話也不會改變。所以,在上面的圖中的行的外邊界是紅線。
inline元素的baseline字符底部所坐的線,就是圖中的藍線。粗略地說,baseline是在font-size中間下面的一個地方,看看W3C規范的詳細定義

  • inline-block元素

inline-block.png

從左到右,你看到的是一個擁有內容(一個“c”)的inline-block元素,一個擁有流內容且overflow: hidden;的inline-block元素和一個沒有流內容的inline-block元素(但內容區域有一個高度)。margin的邊界由紅線表示,以及黃色的border,綠色的padding和藍色的內容區域,藍線是每個inline-block元素的baseline。
inline-block元素的外邊緣是其margin-box的頂部和底部邊緣,即圖中的紅線。
inline-block的baseline取決于元素是否具有流內容:
在流內容的情況下,inline-block元素的baseline是正常流的最后一個內容元素的baseline(左邊的例子)。對于這最后一個元素,它的baseline位置由它自己的規則決定。
在流內容,但具有overflow:hidden的情況下,baseline是margin-box的底邊緣(中間的例子),也相當于inline-block元素的底邊緣。
如果沒有流內容,則跟上一個一樣,baseline位于margin-box的底邊緣(右邊的例子)。

  • line box baseline的移動
    這是最難理解的地方了,我到現在還是一知半解的.所以只能引用原文了

這里有一個使用vertical-align常見的盲點:line box baseline的位置會被行內所有元素所影響。讓我們假設這種情況,一個元素以使得line box baseline必須移動的方式進行對齊。由于大多數垂直對齊方式(除了頂部和底部)與baseline相關,這會導致該行中的所有其他元素移動。
一些例子:
如果有一個很高的元素占據了整行的高度,事實上它也決定了整行高度,那么vertical-align對它就沒有效果,上下都沒有空間讓它移動,所以line box的baseline為了滿足對齊關系必須移動。在下圖中,短方塊設置了vertical-align: baseline;,左例中高方塊的垂直對齊方式是text-bottom,而在右邊中是text-top。你可以看到baseline與短方塊始終在一起。


1.png

當用vertical-align的其他值來對齊高方塊時也有相似的表現。
然而甚至設置vertical-align為bottom(左圖)和top(右圖)也會使baseline移動。這十分奇怪,因為這應該與baseline并無關系。


2.png

將一行內兩個較大的元素垂直對齊會使得baseline移動來同時滿足兩個的對齊方式,并且也會調整line box的高度(左圖)。再添加一個元素,如果沒有因為其對齊方式而超越原有line box的邊緣,則不影響line box的高度和baseline的位置(中圖)。如果它超出了原來line box的邊緣,line box的高度和baseline會再次調整,在這種情況下,我們的前兩個方塊往下挪了(右圖)。
3.png

總結

本來是打算用自己的語言來組織vertical-algin的核心難點,但是寫的時候有些卡殼了......,(看來我還沒理解透徹.)…(⊙_⊙;)…..所以只能引用原文的內容,還請多多包涵.還有, 我覺得其中的關鍵就是找到元素的baseline位置,和linebox的baseline位置,只要確定好這兩個因素,那么一切的vertical-algin問題便可迎刃而解了.
最后這里獻上原文章的鏈接Vertical-Align: All You Need To Know(譯)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,777評論 1 92
  • H5移動端知識點總結 閱讀目錄 移動開發基本知識點 calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇閱讀 4,593評論 0 26
  • 移動開發基本知識點 一.使用rem作為單位 html { font-size: 100px; } @media(m...
    橫沖直撞666閱讀 3,501評論 0 6
  • 有些東西我們經常用,但是我們卻并不了解它的原理,所以一旦換了場景,好多東西就不知道該怎么用了。最近一直很糾結ver...
    朱小維閱讀 4,977評論 8 34
  • 6:45am,iPad舒緩的鬧鐘音樂告訴我,一天的生活又開始了。摁掉鬧鐘,打開accuweather看看當天天氣預...
    老鬼愛美麗閱讀 896評論 4 8