寫在前面的話
開始學(xué)習(xí)前端以來,在CSS相關(guān)知識當(dāng)中困擾我最多的就是Vertical-Align這個屬性。在stackoverflow上查找相關(guān)問題的時候看到了這篇文章,于是將它翻譯出來,作為自己的一次學(xué)習(xí)筆記吧。
正文
在遇到將元素在垂直方向上對齊的需求時,CSS提供了多種方法,有時候我用float解決,有時候我使用position:absolute解決,還有時候采用的方法是手動調(diào)整margin和padding。
其實我并不喜歡這些解決方法,float會讓元素的頂端對齊而且需要手動清楚浮動。絕對定位讓元素脫離了正常流,這樣這些元素就不會再影響到周圍的元素。在元素的padding和margin固定的情況下,一點小的改變也很有可能對布局造成影響。
接下來登場的就是本文的主角了:Vertical-align。通常來說使用這個屬性進行布局是一種hack行為,因為它本來并不是被用于這個目的。它用在文本和與文本相鄰元素的垂直方向上的對齊問題。然而,你也可以使用Vertical-align在不同的上下文中對元素進行靈活的,細(xì)粒度的排布。元素的尺寸無需知曉,元素任然處于正常流當(dāng)中,因此元素的變化會影響到周圍的元素,這使得Vertical-align是非常有價值的排布方案的選擇。
Vertical-align的奇特之處
Vertical-align有時候會變的面目猙獰。它似乎有一些謎一樣的規(guī)則。舉例來說,有時候你改變了Vertical-align的值,但是該元素垂直方向上沒有發(fā)生改變反而別的元素改變了位置。
一些資料在談到Vertical-align這個問題的時候深入程度不夠,特別是當(dāng)人們想使用這個屬性布局的時候。這些資料更多的將精力集中在了一個誤區(qū)上,就是嘗試將元素內(nèi)的一切都垂直對齊。他們給出了一下在簡單情況下的例子來解釋Vertical-align這個屬性而忽略了一些復(fù)雜奇怪的方面。
使用Vertical-align的要求
Vertical-align被用于垂直對齊inline元素,也就是display值為inline和inline-block的元素。inline-table的元素不在本文的討論范圍內(nèi)。
inline元素基本上值得就是文本
inline-block元素就像它的名字一樣,同時具備inline元素和block元素的特點,這樣的元素有padding,margin,border,width,height。其中高度有可能是由元素的內(nèi)容決定的。
inline元素一個挨著一個的擺放在行內(nèi),當(dāng)行內(nèi)元素太多的情況下,一個新行會被創(chuàng)建出來,這些行也叫做line--box。它將行內(nèi)的所有內(nèi)容都包裹了起來。根據(jù)行內(nèi)內(nèi)容的不同,line-box的尺寸也會不同,在接下來的圖里面,紅線代表了line-box的上下
從左到右的三幅圖片都是inline-block元素,不同的是,左面包含著沒有脫離正常流的內(nèi)容c,中間的除了沒有脫離正常流的內(nèi)容以外還加了overflow:hidden,右面的沒有內(nèi)容但是內(nèi)容區(qū)還有高度。紅線代表了margin-box的邊界。黃色代表的是border,綠色的是padding,藍(lán)色的是content,藍(lán)色的線代表的還是baseline。
inline-block元素的外邊緣就是margin-box的邊緣。
inline-block元素的baseline的位置要看該元素有沒有處于正常流之內(nèi)的內(nèi)容。
(1)在有處于正常流內(nèi)容的情況下,inline-block元素的baseline就是最后一個作為內(nèi)容存在的元素的baseline,這個元素的baseline的確定就要根據(jù)他自身來確定了。
(2)在overflow屬性不為visible的情況下,baseline就是margin-box的下邊界了。
(3)第三種情況下baseline還是margin-box的下邊界。
line-box
原因就是左面的文字根本就沒有發(fā)生對齊行為,它還是對齊于line-box的baseline。而vertical-align對齊的點是baseline加上半個x的距離(half of the x-height)。因此文字的最高點超過了icon的高度。
而右面的例子,文字與icon都對齊于一個中點,文字的baseline稍微下移,位于line-box的baseline的下方。結(jié)果是很好的達(dá)到了icon與文字對齊的效果。
line-box的baseline的移動問題
這是一個Vertical-align的坑,line-box中的所有元素都會影響到baseline的位置。假設(shè),一個元素按某種方式垂直對齊了,但是這種對齊方式會引起baseline的移動,又因為大部分的垂直對齊方式(除了top和bottom)和baseline有關(guān),因此這個元素的垂直方向?qū)R的行為會引起該line-box內(nèi)其他元素位置的調(diào)整。
下面還是一些例子
一個很高的元素,其高度占滿了整個line-box,那么vertical-align對其實沒有影響的,在它的top和bottom之外沒有空間讓其移動。但是為了滿足它的vertical-align的值,line-box的baseline會發(fā)生移動,左面的高元素的取值為text-bottom,矮元素的取值為baseline。右面的高元素的取值為text-top,你會看到baseline跳上去了
<!-- left mark-up --> <span class="tall-box text-bottom"></span> <span class="tall-box text-top"></span> <!-- mark-up in the middle --> <span class="tall-box text-bottom"></span> <span class="tall-box text-top"></span> <span class="tall-box middle"></span> <!-- right mark-up --> <span class="tall-box text-bottom"></span> <span class="tall-box text-top"></span> <span class="tall-box text-100up"></span> <style type="text/css"> .tall-box { display: inline-block; /* size, color, etc. */ } .middle { vertical-align: middle; } .text-top { vertical-align: text-top; } .text-bottom { vertical-align: text-bottom; } .text-100up { vertical-align: 100%; } </style>
inline元素下方可能會有一點空隙
下面給出一個例子,如果嘗試將li元素在垂直方向上進行對齊的話在,這個現(xiàn)象非常常見。
更多信息請查看IT技術(shù)專欄