前面已經(jīng)討論了網(wǎng)頁(yè)設計中的水平對齊,下面來(lái)看垂直對齊。因為文本行的構造將在第7章更詳細地討論,這里只是提供一個(gè)簡(jiǎn)單的概述。
line-height屬性是指文本行基線(xiàn)之間的距離,而不是字體的大小,它確定了將各個(gè)元素框的高度增加或減少多少,在最基本的情況下,指定line-height可以用來(lái)增加(或減少)文本行之間的垂直間隔,人們認為這是一種了解line-height:如何工作的簡(jiǎn)單方法,但其實(shí)并不簡(jiǎn)單。line-height控制了行間距,這是文本行之間超出字體大小的額外空間。換句話(huà)說(shuō),line-height值和字體大小之差就是行間距。
在應用到塊級元素時(shí),line-height定義了元素中文本基線(xiàn)之間的最小距離。注意,它定義的是最小距離,而不是一個(gè)絕對數值,文本基線(xiàn)拉開(kāi)的距離可能比line-height值更大,line-height并不影響替換元素的布局,不過(guò)確實(shí)可以應用到替換元素(這個(gè)小秘密將在第7章揭開(kāi))。
文本行中的每個(gè)元素都會(huì )生成一個(gè)內容區,這由字體的大小確定。這個(gè)內容區則會(huì )生成一個(gè)行內框(inline box),如果不存在其他因素,這個(gè)行內框就完全等于該元素的內容區,由line-height產(chǎn)生的行間距就是增加或減少各行內框高度的因素之一。
要確定一個(gè)給定元素的行間距,只需將line-height的計算值減去font-size的計算值。這個(gè)值是總的行間距。而且要記住,這可能是一個(gè)負值。然后行間距再除2,將行間距的一半分別應用到內容區的頂部和底部。其結果就是該元素的行內框。
舉個(gè)例子,假設font-size為14像素高(相應地,內容區的高度也是14像素),而且line-height計算為18像素。其差(4像素)除以2,將其一半分別應用到內容區的頂部和底部。這會(huì )得到一個(gè)18像素高的行內框,在內容區的上面和下面分別有2個(gè)額外的像素。聽(tīng)上去用這種方法描述line-height如何工作好像很繞,不過(guò)這樣描述有充分的理由。
一旦給定內容行已經(jīng)生成了所有行內框,接下來(lái)在行框的構造中就會(huì )考慮這些行內框。行框的高度恰好足以包含最高行內框的頂端和最低行內框的底端。
下面來(lái)考慮line-height的可取值。如果使用默認值normal,用戶(hù)代理必須計算行間的垂直空間。不同的用戶(hù)代理計算出的值可能不同,不過(guò)通常都是字體大小的1.2倍,這使得行框要高于給定元素的font-size值。
大多數值都是簡(jiǎn)單的長(cháng)度度量(例如,18px或2em)。注意,即使使用一個(gè)合法的長(cháng)度度量,如4cm,但瀏覽器(或操作系統)在實(shí)際度量中使用的標準可能并不正確,所以在你的顯示器上行高可能不是4厘米。更多細節參見(jiàn)第4章。
em, ex和百分數值都相對于元素的font-size值計算。
當一個(gè)塊級元素從另一個(gè)元素繼承line-height時(shí),問(wèn)題會(huì )變得更為復雜。line- height 值從父元素繼承時(shí),要從父元素計算,而不是在子元素上計算。以下標記的結果如圖6-9所示。但創(chuàng )作人員原來(lái)可能并不想這樣:
body {font-size: 10px;}
div {line-height: 1em;}/* computes to -10px */
p {font-size: 18px;}
<div>
<p>This paragraph-s 'font-size' is 18px, but the inherited 'line-height' value is only l0px. This may cause the lines of text to overlap each other lay a small amount .</p>
</div>
圖6-9: line-height小,font-size大,這就帶來(lái)了問(wèn)題
為什么這些行挨得這么近?因為段落從其父元素div繼承了line-height的計算值10px。如圖6-10所示,對于這種line-height太小的問(wèn)題,一種解決辦法是為每個(gè)元素設置一個(gè)顯式的line-height,但是這種方法不太實(shí)用。更好的辦法是指定一個(gè)數,由它設置縮放因子:
body {font-size: 10px;}
div {line-height: 1;}
p {font-size: 18px;}
指定一個(gè)數時(shí),縮放因子將是繼承值而不是計算值。這個(gè)數會(huì )應用到該元素及其所有子元素,所以各元素都根據其自己的font-size計算line-height (見(jiàn)圖6-10所示):
div {line-height: 1.5;}
p {font-size: 18px;}
<div>
<p>This paragraph's 'font-size' is 18px, and since the 'line-height' set for the parent div is 1.5, the 'line-height' for this paragraph is 27px (18 * 1.5).</p>
</div>
盡管看上去line-height在每個(gè)文本行的上面和下面平均分配了額外空間,實(shí)際上,它是在行內元素的內容區頂部和底部增加(或減少)一定的量來(lái)創(chuàng )建一個(gè)行內框。假設一個(gè)段落的默認font-size是12pt,考慮以下規則:
p (line-height: 16pt;)
由于12點(diǎn)文本的“固有”行高是12點(diǎn),前面的規則將在段落中各行文本外圍增加額外的4點(diǎn)空間。這個(gè)額外的量平均分為兩部分,一半放在各行的上面,另一半放在各行的下面?,F在基線(xiàn)間則有16點(diǎn)空間,這是分配額外空間的間接結果。
如果指定值inherit,元素則會(huì )使用其父元素的計算值。這與值自然繼承沒(méi)有什么不同,不過(guò)特殊性和層疊解決方案不同。這些內容在第3章曾做過(guò)詳細討論。
既然已經(jīng)基本了解了如何構造文本行,下面來(lái)討論相對于行框垂直對齊元素。
如果你曾用過(guò)元素sup和sub(上標和下標元素),或者曾用過(guò)有<img src="foo.gif" align="middle">之類(lèi)標記的圖像,說(shuō)明你已經(jīng)做過(guò)一些基本的垂直對齊,在CSS中,vertical-align屬性只應用于行內元素和替換元素,如圖像和表單輸入元素。vertical-align屬性不能繼承。
vertical-align只接受8個(gè)關(guān)鍵字、一個(gè)百分數值或一個(gè)長(cháng)度值。這些關(guān)鍵字有些我們很熟悉,有些可能不熟悉,包括:baseline(默認值)、sub、super、bottom、text- bottom、middle、top和text-top。我們將分析各關(guān)鍵字如何作用于行內元素。
vertical-align
值:
baseline | sub | super | top | text-top | middle | bottom | text-bottom | <percentage> | <length> | inherit
初始值:
baseline
應用于:
行內元素和表單元格
繼承性:
無(wú)
百分數:
相對于元素的line-height值
計算值:
對于百分數和長(cháng)度值,為絕對長(cháng)度;否則,根據指定確定
說(shuō)明:
網(wǎng)頁(yè)設計中應用到表單元格時(shí),只能識別baseline、top、middle和bottom等值
警告:要記?。簐ertical-align不影響塊級元素中內容的對齊。不過(guò),可以用它來(lái)影響表單元格中元素的垂直對齊。詳細內容參見(jiàn)第11章。
vertical-align: baseline要求一個(gè)元素的基線(xiàn)與其父元素的基線(xiàn)對齊。大多數情況下,瀏覽器都會(huì )這么做,因為網(wǎng)頁(yè)設計中你顯然希望一行中所有文本元素的底端都對齊。
如果一個(gè)垂直對齊元素沒(méi)有基線(xiàn)——也就是說(shuō),如果這是一個(gè)圖像或表單輸入元素,或者是其他替換元素——那么該元素的底端與其父元素的基線(xiàn)對齊,如圖6-11所示:
img {vertical-align: baseline;}
<p>The image found in this paragraph <img src="dot.gif" alt="A dot"/> has its bottom edge aligned with the baseline of the text in the paragraph.</p>
這個(gè)對齊規則很重要,因為它在網(wǎng)站建設上總把替換元素的底邊放在基線(xiàn)上,即使讀行中沒(méi)有其他文本。例如,假設一個(gè)表單元格中只有一個(gè)圖像。這個(gè)圖像可能實(shí)際在基線(xiàn)上,不過(guò)在某些瀏覽器中,基線(xiàn)下面的空間會(huì )導致圖像下出現一段空白。另外一些瀏覽器則會(huì )把圖像“緊包”在表單元格中,所以不會(huì )出現空白。根據CSS工作組的意見(jiàn),這種加空白的行為是正確的,不過(guò)大多數創(chuàng )作人員都不喜歡這種做法。
注意:對于這種加空白的行為以及相應的解決辦法,更詳細的解釋見(jiàn)我的文章《Images, Tables, and Mysterious Gaps》(http://developer.mozilla.org/en/docs/Images._Tables._and_Myslerious_Gaps)。第7章也會(huì )更詳細地介紹行內布局的這個(gè)方面。
vertical-align: sub聲明會(huì )使一個(gè)元素變成下標,這意味著(zhù)其基線(xiàn)(或者如果這是一個(gè)替換元素,則是其底端)相對于其父元素的基線(xiàn)降低。規范并沒(méi)有定義元素降低的距離,所以對于不同的用戶(hù)代理,這個(gè)距離可能有所不同。
super剛好與sub相反,它將元素的基線(xiàn)(或替換元素的底端)相對于父元素的基線(xiàn)升高。同樣地,文本升高的距離取決于具體的用戶(hù)代理。
注意,值sub和super不會(huì )改變元素的字體大小,所以下標或上標文本不會(huì )變?。ɑ蜃兇螅?。相反,下標或上標元素中的所有文本默認地都應當與父元素中的文本大小相同,如圖6-12所示:
span.raise {vertical-align: super;}
span.lower {vertical-align: sub;}
<p>This paragraph contains <span class="raise">superscripted</span>
and <span class="lower">subscripted</span> text.</p>
圖6-12:上標和下標對齊
注意:如果想讓上標或下標文本小于其父元素的文本,可以使用屬性font-size,這在第5章曾做過(guò)介紹。
vertical-align: bottom將元素行內框的底端與行框的底端對齊。例如,以下標記的結果如圖6-13所示:
.feeder {vertical-align: bottom;}
<p>This paragraph, as you can see quite clearly, contains a <img src="tall.gif" alt="tall" class="feeder" /> image and a <img src="short.gif" alt="short" class="feeder"/> image, and then some text that is not tall.</p>
圖6-13中,段落的第二行包含兩個(gè)行內元素,其底邊彼此對齊。它們都在文本基線(xiàn)之下。
vertical-align: text-bottom是指行內文本的底端。替換元素或任何其他類(lèi)型的非文本元素會(huì )忽略這個(gè)值。對于這些元素,將考慮一個(gè)“默認”的文本框。這個(gè)默認框由父元素的font-size得到。要對齊的元素的行內框底端再與這個(gè)默認文本框的底端對齊。因此,給定以下標記,可以得到如圖6-14所示的結果:
img.tbot {vertical-align: text-bottom;}
<p>Here: a <img src="tall.gif" style="vertical-align: middle;" alt="tall"/> image, and then a <lmg src="short.gif" class="tbot" alt="short"/> image.</p>
vertical-align:top的效果與bottom剛好相反,類(lèi)似地,vertical-align:text-top則與text-bottom的作用相反。圖6-15顯示了以下標記的結果:
.up {vertical-align: top;}
.textup {vertical-align: text-top;}
<p>Here: a <img src="tall.gif" alt="tall image"> tall image, and then <span class="up">some text</span> that's been vertically aligned.</p><p>Here: a <img src="tall.gif" class="textup" alt="tall"> image that's been vertically aligned, and then a <img src="short.gif" class="textup" alt="short"/> image that's similarly aligned.</p>
當然,對齊的具體位置取決于行內有哪些元素,它們有多高,以及父元素字體的大小。
還有一個(gè)值middle,它往往(但并不總是)應用于圖像。你可能會(huì )從它的名字想象其效果,但你的想象與其實(shí)際效果并不完全一樣。middle會(huì )把行內元素框的中點(diǎn)與父元素基線(xiàn)上方0.5ex處的一個(gè)點(diǎn)對齊,這里的1ex相對于父元素的font-size定義。圖 6-16更詳細地說(shuō)明了這一點(diǎn)。
因為大多數用戶(hù)代理都把1ex處理為0.5em, middle往往將元素的垂直中點(diǎn)與父元素基線(xiàn)上方0.25em處的一個(gè)點(diǎn)對齊。不過(guò),不要指望總會(huì )這樣,因為有些用戶(hù)代理確實(shí)會(huì )為各元素計算準確的x-height(關(guān)于x-height的更多詳細內容見(jiàn)第5章)。
使用百分數不能模仿圖像的align="middle"對齊。相反,如果為vertical-align設置一個(gè)百分數,會(huì )把元素的基線(xiàn)(或替換元素的底邊)相對于父元素的基線(xiàn)升高或降低指定的量(你指定的百分數要計算為該元素line-height的百分數,而不是相對于其父元素的line-height)。正百分數值會(huì )使元素升高,負值則會(huì )使其降低。取決于文本的升高或降低,可能看上去它放在了相鄰的行上。
下面更詳細地考慮百分數值。假設有以下標記:
<div style="font-size: 14px; line-height: 18px;">
I felt that, if nothing else, I deserved a
<span styles="vertical-align: 50%;">raise</span> for my efforts.
</div>
設置為50%的span元素對齊時(shí),會(huì )使其基線(xiàn)升高9像素,這是元素繼承的line-height 值(18px)的一半,而不是7像素。
最后,來(lái)考慮根據指定長(cháng)度垂直對齊。vertical-align很明確:它把一個(gè)元素升高或降低指定的距離。因此,vertical-align: 5px;會(huì )把一個(gè)元素與對齊前相比上升5像素。負長(cháng)度值會(huì )使元素下降。這種簡(jiǎn)單的對齊形式在CSS1中不存在,但在CSS2中已經(jīng)增加。
要認識到垂直對齊的文本并不會(huì )成為另一行的一部分,它也不會(huì )覆蓋其他行中的文本,這很重要??紤]圖6-18,其中在段落中間出現一些垂直對齊文本。
可以看到,所有垂直對齊的元素都會(huì )影響網(wǎng)頁(yè)設計中的行高。應該記得行框的描述,其高度要足以包含最高行內框的頂端和最低行內框的底端。這包括因垂直對齊上升或下降的行內框。
當前文章標題:網(wǎng)頁(yè)設計中的垂直對齊
當前URL:http://amzcoolest.com/news/wzzz/vertical-alignment.html