網頁設計中的垂直對齊

  • 2018-10-08 14:25:43
  • 閱讀次數:
  • 作者:盈嵐科技小編
  • 來源:http://51zuanshi.com.cn

前面已經討論了網頁設計中的水平對齊,下面來看垂直對齊。因為文本行的構造將在第7章更詳細地討論,這里只是提供一個簡單的概述。

行高

line-height屬性是指文本行基線之間的距離,而不是字體的大小,它確定了將各個元素框的高度增加或減少多少,在最基本的情況下,指定line-height可以用來增加(或減少)文本行之間的垂直間隔,人們認為這是一種了解line-height:如何工作的簡單方法,但其實并不簡單。line-height控制了行間距,這是文本行之間超出字體大小的額外空間。換句話說,line-height值和字體大小之差就是行間距。

在應用到塊級元素時,line-height定義了元素中文本基線之間的最小距離。注意,它定義的是最小距離,而不是一個絕對數值,文本基線拉開的距離可能比line-height值更大,line-height并不影響替換元素的布局,不過確實可以應用到替換元素(這個小秘密將在第7章揭開)。

構造文本行

文本行中的每個元素都會生成一個內容區(qū),這由字體的大小確定。這個內容區(qū)則會生成一個行內框(inline box),如果不存在其他因素,這個行內框就完全等于該元素的內容區(qū),由line-height產生的行間距就是增加或減少各行內框高度的因素之一。

要確定一個給定元素的行間距,只需將line-height的計算值減去font-size的計算值。這個值是總的行間距。而且要記住,這可能是一個負值。然后行間距再除2,將行間距的一半分別應用到內容區(qū)的頂部和底部。其結果就是該元素的行內框。

舉個例子,假設font-size為14像素高(相應地,內容區(qū)的高度也是14像素),而且line-height計算為18像素。其差(4像素)除以2,將其一半分別應用到內容區(qū)的頂部和底部。這會得到一個18像素高的行內框,在內容區(qū)的上面和下面分別有2個額外的像素。聽上去用這種方法描述line-height如何工作好像很繞,不過這樣描述有充分的理由。

一旦給定內容行已經生成了所有行內框,接下來在行框的構造中就會考慮這些行內框。行框的高度恰好足以包含最高行內框的頂端和最低行內框的底端。

指定line-height 值

下面來考慮line-height的可取值。如果使用默認值normal,用戶代理必須計算行間的垂直空間。不同的用戶代理計算出的值可能不同,不過通常都是字體大小的1.2倍,這使得行框要高于給定元素的font-size值。

大多數值都是簡單的長度度量(例如,18px或2em)。注意,即使使用一個合法的長度度量,如4cm,但瀏覽器(或操作系統(tǒng))在實際度量中使用的標準可能并不正確,所以在你的顯示器上行高可能不是4厘米。更多細節(jié)參見第4章。

em, ex和百分數值都相對于元素的font-size值計算。

行高和繼承

當一個塊級元素從另一個元素繼承l(wèi)ine-height時,問題會變得更為復雜。line- height 值從父元素繼承時,要從父元素計算,而不是在子元素上計算。以下標記的結果如圖6-9所示。但創(chuàng)作人員原來可能并不想這樣:

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大,這就帶來了問題

為什么這些行挨得這么近?因為段落從其父元素div繼承了line-height的計算值10px。如圖6-10所示,對于這種line-height太小的問題,一種解決辦法是為每個元素設置一個顯式的line-height,但是這種方法不太實用。更好的辦法是指定一個數,由它設置縮放因子:

body {font-size: 10px;}

div {line-height: 1;}

p {font-size: 18px;}

指定一個數時,縮放因子將是繼承值而不是計算值。這個數會應用到該元素及其所有子元素,所以各元素都根據其自己的font-size計算line-height (見圖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在每個文本行的上面和下面平均分配了額外空間,實際上,它是在行內元素的內容區(qū)頂部和底部增加(或減少)一定的量來創(chuàng)建一個行內框。假設一個段落的默認font-size是12pt,考慮以下規(guī)則:

p (line-height: 16pt;)

由于12點文本的“固有”行高是12點,前面的規(guī)則將在段落中各行文本外圍增加額外的4點空間。這個額外的量平均分為兩部分,一半放在各行的上面,另一半放在各行的下面?,F(xiàn)在基線間則有16點空間,這是分配額外空間的間接結果。

如果指定值inherit,元素則會使用其父元素的計算值。這與值自然繼承沒有什么不同,不過特殊性和層疊解決方案不同。這些內容在第3章曾做過詳細討論。

既然已經基本了解了如何構造文本行,下面來討論相對于行框垂直對齊元素。

垂直對齊文本

如果你曾用過元素sup和sub(上標和下標元素),或者曾用過有<img src="foo.gif" align="middle">之類標記的圖像,說明你已經做過一些基本的垂直對齊,在CSS中,vertical-align屬性只應用于行內元素和替換元素,如圖像和表單輸入元素。vertical-align屬性不能繼承。

vertical-align只接受8個關鍵字、一個百分數值或一個長度值。這些關鍵字有些我們很熟悉,有些可能不熟悉,包括:baseline(默認值)、sub、super、bottom、text- bottom、middle、top和text-top。我們將分析各關鍵字如何作用于行內元素。

vertical-align

值:

baseline | sub | super | top | text-top | middle | bottom | text-bottom | <percentage> | <length> | inherit

初始值:

baseline

應用于:

行內元素和表單元格

繼承性:

百分數:

相對于元素的line-height值

計算值:

對于百分數和長度值,為絕對長度;否則,根據指定確定

說明:

網頁設計中應用到表單元格時,只能識別baseline、top、middle和bottom等值

警告:要記?。簐ertical-align不影響塊級元素中內容的對齊。不過,可以用它來影響表單元格中元素的垂直對齊。詳細內容參見第11章。

基線對齊

vertical-align: baseline要求一個元素的基線與其父元素的基線對齊。大多數情況下,瀏覽器都會這么做,因為網頁設計中你顯然希望一行中所有文本元素的底端都對齊。

如果一個垂直對齊元素沒有基線——也就是說,如果這是一個圖像或表單輸入元素,或者是其他替換元素——那么該元素的底端與其父元素的基線對齊,如圖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>

這個對齊規(guī)則很重要,因為它在網站建設上總把替換元素的底邊放在基線上,即使讀行中沒有其他文本。例如,假設一個表單元格中只有一個圖像。這個圖像可能實際在基線上,不過在某些瀏覽器中,基線下面的空間會導致圖像下出現(xiàn)一段空白。另外一些瀏覽器則會把圖像“緊包”在表單元格中,所以不會出現(xiàn)空白。根據CSS工作組的意見,這種加空白的行為是正確的,不過大多數創(chuàng)作人員都不喜歡這種做法。

注意:對于這種加空白的行為以及相應的解決辦法,更詳細的解釋見我的文章《Images, Tables, and Mysterious Gaps》(http://developer.mozilla.org/en/docs/Images._Tables._and_Myslerious_Gaps)。第7章也會更詳細地介紹行內布局的這個方面。

上標和下標

vertical-align: sub聲明會使一個元素變成下標,這意味著其基線(或者如果這是一個替換元素,則是其底端)相對于其父元素的基線降低。規(guī)范并沒有定義元素降低的距離,所以對于不同的用戶代理,這個距離可能有所不同。

super剛好與sub相反,它將元素的基線(或替換元素的底端)相對于父元素的基線升高。同樣地,文本升高的距離取決于具體的用戶代理。

注意,值sub和super不會改變元素的字體大小,所以下標或上標文本不會變?。ɑ蜃兇螅O喾?,下標或上標元素中的所有文本默認地都應當與父元素中的文本大小相同,如圖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章曾做過介紹。

底端對齊

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中,段落的第二行包含兩個行內元素,其底邊彼此對齊。它們都在文本基線之下。

vertical-align: text-bottom是指行內文本的底端。替換元素或任何其他類型的非文本元素會忽略這個值。對于這些元素,將考慮一個“默認”的文本框。這個默認框由父元素的font-size得到。要對齊的元素的行內框底端再與這個默認文本框的底端對齊。因此,給定以下標記,可以得到如圖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剛好相反,類似地,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>

當然,對齊的具體位置取決于行內有哪些元素,它們有多高,以及父元素字體的大小。

居中對齊

還有一個值middle,它往往(但并不總是)應用于圖像。你可能會從它的名字想象其效果,但你的想象與其實際效果并不完全一樣。middle會把行內元素框的中點與父元素基線上方0.5ex處的一個點對齊,這里的1ex相對于父元素的font-size定義。圖 6-16更詳細地說明了這一點。

因為大多數用戶代理都把1ex處理為0.5em, middle往往將元素的垂直中點與父元素基線上方0.25em處的一個點對齊。不過,不要指望總會這樣,因為有些用戶代理確實會為各元素計算準確的x-height(關于x-height的更多詳細內容見第5章)。

百分數

使用百分數不能模仿圖像的align="middle"對齊。相反,如果為vertical-align設置一個百分數,會把元素的基線(或替換元素的底邊)相對于父元素的基線升高或降低指定的量(你指定的百分數要計算為該元素line-height的百分數,而不是相對于其父元素的line-height)。正百分數值會使元素升高,負值則會使其降低。取決于文本的升高或降低,可能看上去它放在了相鄰的行上。

下面更詳細地考慮百分數值。假設有以下標記:

<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元素對齊時,會使其基線升高9像素,這是元素繼承的line-height 值(18px)的一半,而不是7像素。

長度對齊

最后,來考慮根據指定長度垂直對齊。vertical-align很明確:它把一個元素升高或降低指定的距離。因此,vertical-align: 5px;會把一個元素與對齊前相比上升5像素。負長度值會使元素下降。這種簡單的對齊形式在CSS1中不存在,但在CSS2中已經增加。

要認識到垂直對齊的文本并不會成為另一行的一部分,它也不會覆蓋其他行中的文本,這很重要??紤]圖6-18,其中在段落中間出現(xiàn)一些垂直對齊文本。

可以看到,所有垂直對齊的元素都會影響網頁設計中的行高。應該記得行框的描述,其高度要足以包含最高行內框的頂端和最低行內框的底端。這包括因垂直對齊上升或下降的行內框。


當前文章標題:網頁設計中的垂直對齊

當前URL:http://51zuanshi.com.cn/news/wzzz/vertical-alignment.html

上一篇:網頁設計中文本的縮進和水平對齊

下一篇:網頁設計中的字間隔和字母間隔

網站建設、網絡營銷咨詢專線:181-8386-5875(點擊可一鍵撥號)