網頁制作poluoluo文章簡介:乍看之下, CSS 布局模式簡單明了。盒子,邊框和邊距都是相當簡單的對象, CSS 語法對它們的特性描述並不復雜。
乍看之下, CSS 布局模式簡單明了。盒子,邊框和邊距都是相當簡單的對象, CSS 語法對它們的特性描述並不復雜。
然而, 浏覽器渲染引擎遵循著 CSS 2.1 推薦中所規定的一大堆規則,此外還有一些自己的規則。因此,對設計師而言,在將某個高級技巧添加到自己的技術集之前,需要先了解大量細節問題。
在本文中,我們將對那些控制 HTML 元素的布局的 CSS 屬性進行介紹,這些 CSS 屬性包括 HTML 元素的邊框,邊距和許多其它屬性。本文所涵蓋的范圍還包括上面提到的一些規則。高級的欄式布局以及柵網聚焦技術將在後面的文章中討論,這些文章將更加詳細地對布局,浮動,清除,以及定位進行探討。
在默認情況下,許多 HTML 元素如 div 元素和標題會渲染到占據浏覽器畫布的全部寬度,並且會強制實行末端斷行,因此成串的這種元素的渲染效果在文檔畫布上會處於從上到下的堆疊中。
但是,HTML 元素和其通常的浏覽器樣式並不能滿足開發員想達成的所有用途。把 CSS 與 HTML 合在一起用來“彌合差距”,從而 class 和 id 給標簽添加語義,而樣式表規則可以精確地改變布局和頁面內容外觀——甚至可能通過抵消掉浏覽器默認樣式的大部分效果來實現這一點。
對空白的細致控制是設計者最重要的工具之一——筆者認為它是重中之重。然而,盡管對空白的控制度能給網站設計帶來高產品價值,但在默認的浏覽器樣式表中卻缺乏這種控制,這就意味著設計師會頻繁用到本文所說的邊距,邊框,填充距, 和其它 CSS 布局屬性。
邊距,邊框和填充距的分布如圖1所示。
圖1:一個元素盒中各組成成分的詳細圖示,標有相關CSS屬性。
邊距可單獨指定,也可在一條縮寫規則中加以指定。另外縮寫規則還可以對某個對象周圍的各個邊框進行控制。合法的值通常是用 px 或 em 單位指定的(像素或字體高)。而在 print-specific 樣式表單中會相反用 in、cm 或 pt 單位(英寸、厘米或點)。
在所有情況下 %(百分比)值都是合法的,但須謹慎使用;此類值是按照父元素寬度的比例來計算的,漫不經心的賦值會造成意外的後果。這一問題將會在下面對 CSS 盒模型的討論中加以詳述。
除圖像外所有內聯元素都沒有邊距,因而無需邊距值。關於這些元素的列表,請參閱下面的表2.
依據不同的情況,auto 的賦值會指示浏覽器按照自己樣式表中的值來渲染邊距。但是,在將這樣的邊距應用到某個元素上,而該元素的寬度具有意義時,auto 邊距會將所有可用空間渲染成空白。
看看下列規則:
.narrowWaisted { width: 16.667em; margin: 1em auto 1em auto; }
…class narrowWaisted 的塊元素會將自身對齊到可用畫布的中心。
…或可將某個適當元素的右邊距設成某個相對較小的值,而左邊距設為 auto 值。
設置完成後,這樣的元素就會接近於右對齊。
所有邊距屬性都可以設為 negative。進行這種設置之後,就能以任意程度“抵消”相鄰的邊距。如果將一個足夠大的負邊距應用到一個足夠大的元素上,受其影響的相鄰元素甚至可以被重疊。
例如,看看下面簡單的 div 元素(取自示例文件 negativemargin1.html。)
<div id="header"><h1>Lovely header</h1></div>
<div id="content"><p>Overlapping text is entirely unreadable</p></div>
如果用下面的CSS來樣式化
body {background-color:white font-family:Geneva, Arial, Helvetica, sans-serif;}
#header { background-color:yellow }
h1 { color:red; font-size:2em; }
就會產生如圖 2 所示的效果:
圖2:這個簡單示例中的兩個元素。看起來很普通。
有意思的是下面這部分。現在我們要通過下面的規則給位於下邊的元素的頂部添加一個相當大的負邊距:
#content {margin-top:-3em;}
這樣我們就會看到該元素上移了,重疊在標題上,如圖3所示(實際例子參見negativemargins2.html 示例文件)。
圖 3:應用了負邊距之後,下邊的元素上移並重疊在標題上。
兩個相似並相鄰的塊元素都有正邊距時,兩個邊距中只有較大那個才會得以應用。如,試試下面的規則:
p { margin: 1em auto 1.5em auto; }
如果按照字面含義對含有這種樣式規則的文件進行渲染,連續的兩個段落之間的最終邊距應該是 2.5em ,即段落 1(1.5em)的底部邊距與段落 2(1em)的頂部邊距之和。但是,由於合並邊距的應用,它們之間的邊距只有 1.5em。
在塊元素中列表和標題是特例,它們的邊距不會與其它塊元素的邊距相合並。
網頁制作poluoluo文章簡介:乍看之下, CSS 布局模式簡單明了。盒子,邊框和邊距都是相當簡單的對象, CSS 語法對它們的特性描述並不復雜。
在文本樣式化一文中,F. Scott Fitzgerald 作品的開頭部分的排版是由CSS做成的。本文中的示例用的是同一篇文章,只是對這片文章做了些小改動(主要是在正文周圍加上一個容器元素)。沒有對其文本式樣作改動,只是去掉了該示例中用到的一些布局樣式。
首先,我們將邊距加到所有需要邊距的元素上。
body { margin: 0; } #main { margin: 0 auto 0 auto; } h1 { margin: 0 0 1em 0; } .pullQuote { margin: auto 0 1em 1em; } p { margin: 0; } .attribution { margin: 0 0 1.5em 0; }
border 縮寫屬性有是有的, 但是只有在給一個元素四邊都加上完整一致的邊框時才能用到它。通過下列屬性的任意有意義的組合,可以給一個元素的四個邊框之一設置粗細(寬度)、樣式和顏色:
這些屬性的作用與人們所預期的一致:它們給一個或多個邊框指定明確的粗細.
border-width 縮寫屬性可支持的屬性值表示法與 margin 縮寫屬性的一樣,只是不支持百分比值。你可以像下面這樣寫規則:
td { border-width: 1px 0 0 1px; }
圖 4:八個常見的邊框樣式的運行效果。
border-style 屬性通常接受下列這些值:
應用border-style 縮寫屬性時,一次至多可寫四個值,其形式與 margin 縮寫形式一樣。
邊框的淡化(而不是省略邊框)處理是由 -color 屬性進行的。
最後,我們可以對任何一個邊框設置任意顏色,這種操作可以通過單獨對上面所列出的屬性進行設置來完成,也可以通過 border-color 縮寫屬性來完成。對於在縮寫屬性中給出的值少於四個時會產生的效果,詳見 margin 縮寫屬性說明。
像 background-color 一樣,border-color 可以取 transparent。這一點在對付要求組合一致但不要求邊框使用一致的邊緣情況時會很有用。
和各種 -width、-style 和 -color 屬性不同,你可以用這五個屬性來定義某個對象的四側邊框的三個特征,或每次定義任一邊框的三個特征。合法的 border(等等)縮寫值包含所有或任一應用於此邊框的寬度,樣式和顏色屬性;唯一的限制是你必須要麼一次只提交某個元素的一側邊框,要麼四側邊框全部提交。
看看下列 border 規則:
#borderShorthandExample { border: 2px outset rgb(160,0,0); padding: .857em; background-color: rgb(255,224,224); }
應用了上面規則的元素會產生與此處相同的效果。
如果在 border 縮寫規則中省略某個值時,渲染出來的元素就會表現出對應的默認效果;
這裡所說的“rules”是指劃過某個布局的線條,而不是要遵從的指令。這樣的線條可以增強一個元素與它旁邊的空白的對比度,在許多情況下,它們有助於制作一個布局中的立體感效果。inset 和 outset 邊框樣式就是這種效果的例子。
對一個元素的四邊都加上邊框可以得到相同的效果,而這種在布局上劃出精確界定的線條的技能可以使設計者對細節有相當大的控制權。
網頁制作poluoluo文章簡介:乍看之下, CSS 布局模式簡單明了。盒子,邊框和邊距都是相當簡單的對象, CSS 語法對它們的特性描述並不復雜。
如果一個布局的創建要求設計師具備高超的技藝,這就需要對邊緣情況進行處理;這個問題已在早先討論邊距時提出了。
因為網站設計方式的緣故,你會遇到許多這樣的情況,同一 HTML 文檔中的某個元素與其它元素結構屬性相似,卻要求有不同的外觀。在這些情況下,對大多數元素編寫寫一種規則,而對每個邊緣情況編寫附加規則就會非常有用。這就是auto和inherit值存在的原因:將默認樣式作為邊緣情況處理。
對邊框來說,邊緣情況很可能要求對某個元素某側的邊框的某個屬性進行改變¬——如果某個人明智地選擇遵從 KISS 法則,最好堅持只改變需要變動的細枝末梢。
文件中的某些部分需要以規則和邊框的形式進行修飾。
h1 { border-bottom: 1px solid rgb(153,153,153); }
.pullQuote { border: 1px solid rgb(153,153,153); }
你可能會遇到背景顏色處於次要地位或帶有需要在內容和邊距之間留出縫隙的強調色的元素。你也可能遇到需要在邊框和靠近邊框的文本之間留出空隙的情況。
在如此種種情況下,padding、padding-top、padding-right、padding-bottom 和 padding-left 屬性就可以大顯身手。這些屬性用於在元素和其內容的邊距或邊框之間插入負間距。邊距,邊框和填充距之間關系的明確圖解請參見上面的圖1。
這些屬性的運作方式與邊距屬性完全相同,除了以下例外:
應當在之前已經添加了邊框的元素上添加間隙。
body { padding: 0; } h1 { padding: .5em 0 .5em 0; } .pullQuote { padding: .5em; }
通常大部分元素的尺寸可以被更改。這種性質已在前面討論 auto 邊距時說明過了。
用來控制元素尺寸的CSS屬性包括 width、height、min-width、max-width、min-height 和 max-height。這些屬性可通過 overflow 屬性與元素內容的尺寸相分離(或連接)。
此外還有 clip 屬性,用於將元素的一部分隱藏於其邊距中。但由於並不常用,所以在本文中就不詳述了。
通常,人們可以預見 width 和 height 的效果。但是,使用時也有些地方需要注意。
有時,你會遇到這種情況:你需要對一個元素的大小進行約束——通常是為了保證一個大小為比例值的列能夠保持在一個易於閱讀的寬度上。各種 min- 和 max- 屬性正是作用於此。與 width 和 height 情況一樣,通常這些屬性的使用效果是可以預見的。
但是以筆者的經驗來看,這些屬性的用途有限(盡管替他一些作者持異議)。像以前簡單的 width 和 height 一樣,它們也受到取整誤差的困擾,這種誤差很能會導致完全意外的後果。 更重要的是,IE 6 完全不支持它們。到2008年七月為止,IE 6 在市場上仍占有很大份額。
網頁制作poluoluo文章簡介:乍看之下, CSS 布局模式簡單明了。盒子,邊框和邊距都是相當簡單的對象, CSS 語法對它們的特性描述並不復雜。
auto 邊距是放在頁面容器的左側和右側的。現在為了使這些邊距值有意義,我們來為其設置 width。此外,還要給格言引用設置一個 float 值,使它也獲得寬度。
#main { width: 42em; } .pullQuote { width: 14em; }
設定元素的 width 或 height 時,有時會需要考慮在該元素的內容占據的空間超過了嚴格意義上可獲得的空間時,我們期望得到什麼樣的效果。在那些既有用戶生成內容,又有嚴格布局規范的網站上尤其需要注意這一點。
overflow 屬性和它的四個有效值——visible、hidden、auto 和 scroll ——可用於處理這種情況。圖 5 展示了將這幾個屬性值應用到一個內容超出其邊界框的元素上所產生的效果。
圖 5: CSS overflow 屬性的效果。
既然我們已經講完了基本的布局屬性,接下來我們就來看看浏覽器是如何按照一個元素的 CSS 屬性來渲染它的寬度的——以及避免你的元素從布局中溢出。有些效果非常好,而另一些似乎毫無道理可言。麻煩的是有兩種布局算法需要考慮:在 CSS 2.1 推薦中,由萬維網聯盟(W3C)所指定的模型,和較早版本的 IE 中所用的模型。
對於文本來說,元素的大小可以用比例單位 % 或 em,或者像 px 這樣的靜態單位來設置。需要考慮的還有浏覽器畫布的大小永遠是靜態值,如果不用客戶端 script 代碼,是不可能恢復這個尺寸或調整窗口大小的——這種情況對於可訪問性,可用性和媒體便攜性的要求來說很不合適。
默認的 width 和 height 值是 auto,這在標准英語中意即“使用所有可用空間”的指令 。對塊元素來說其效果是,計算出的 width 占完了所有可用空間。對 height 來說,默認情況下元素會擴展來容納它們的所有內容。
改變 width 和 height 值時,必須小心確保元素的內容(帶有邊距,邊框和填充距)與你所指定的寬度相適應。為了實現這一點,最簡單的辦法就是進行下列步驟:
表格 1: 設置布局屬性時,百分比,em 和像素單位的優缺點
盒模型實際上只是一系列指令,用來定義元素的種種布局規范如何相互作用。盒模型涵蓋的組件有:
上面的最後一項依次包含了其它5項。但是為簡明起見,這一部分將集中討論簡單的父元素-子元素關系,多級盒模型交互作用將保留到後面詳談頁面布局的文章中再做深入討論。
網頁制作poluoluo文章簡介:乍看之下, CSS 布局模式簡單明了。盒子,邊框和邊距都是相當簡單的對象, CSS 語法對它們的特性描述並不復雜。
基本規則就是一個元素的寬度或高度計算值等於:
margin + border + padding + (width|height)
在許多情況下,width 和/或 height 都設置的是其默認的 auto 值,這就是說為頁面內容預備的畫布區域等於:
available_canvas ? margin ? padding ? border
在這樣的等式中,available_canvas 本身是一個離散值(如果是自動計算的話), 用它來減去邊距,邊框和填充距。 這個數字對元素的寬度極為重要,設計者的計算錯誤將會導致在浏覽器窗口上出現水平滾動條這種讓人頭疼的結果。另外,浏覽器通常會將元素置於浏覽器畫布的左邊,但它可能會溢出浏覽器窗口的右邊,除非有其它命令來限定。
看看下面的樣式表規則:
#myLayoutColumn { width: 50em; margin: 1.5em auto 1.5em auto; border: .1em; padding: .9em; }
如前面在討論邊距屬性時說過的那樣,#myLayoutColumn 會將自身對齊到其容器元素的中心,無論其容器是 body,還是由開發團隊做出的其它東西。
另外,如果“嚴格模式”的激活(通過一個適當的 !DOCTYPE 聲明)應用了 W3C 的盒模型的話,也可估算出非邊距 al寬度是:
0.1em + .9em + 50em + .9em + .1em = 52em
在 screen 媒體上,浏覽器會采用此值,將所有屬性值分別取整為最接近的像素值,並按照這些值來進行最終效果渲染。
使用 W3C 盒模型時,百分比的邊距和填充距是相對於其包含元素的 width 計算值來計算的。例如,如果為一個包含在 800 像素寬的元素中的元素指定 margin: 20%,該元素周圍的邊距就是每邊 160 像素(800 的 20% 是 160)。
如果對這個元素指定 padding: 5%,它的內容寬度計算值就是400像素:
20% + 5% + 5% + 20% = 50%
0.50 × 800 = 400
800 ? 400 = 400
由於後面的教程要討論多欄式布局的制作,本文下面將介紹三個 CSS 屬性:display、float 和 clear。
除 html、body 和 table 部分之外,在 HTML 4.01 推薦中與主要內容有關的所有元素都有一種相關聯的類型:內聯或塊。每種類型以不同方式決定了默認布局表現:
display 屬性有三個常用的值¬——block、inline 和 none——其中兩個是指對應的元素類型。改變元素的 display 值可以使內聯元素的表現方式像塊元素那樣,也可以使塊元素的表現方式像內聯元素那樣,還可以改變文件的渲染效果,使之看起來就像元素(和它的所有內容)根本不存在一樣。
網頁制作poluoluo文章簡介:乍看之下, CSS 布局模式簡單明了。盒子,邊框和邊距都是相當簡單的對象, CSS 語法對它們的特性描述並不復雜。
一般來說,了解默認情況下哪些元素與哪些類型相對應是很關鍵的,其關系簡列於表2中:
表2: 常用 HTML 元素和它們的類型。只有具有相同子類型的相鄰塊元素之間的邊距才會合並。
只是為了做個演示,將標題中的 “Prologue” 注釋掉怎麼樣?
.sectionNote { display: none; }
本段左邊放了一張照片。當然你們都會看到後面的文本自然地環繞於其周圍,盡管有人得先停止琢磨為什麼著名的科幻小說家要在他的貓身上綁塊兒熏肉——即使今天是他的慢調生活日。我們可以用 HTML 屬性來指定你所看見的布局表現,但在這個例子中該效果是由 CSS 完成的。
可以猜到,這個戲法是由 float: left; 這一屬性/值組完成的。在後面的文章中將會介紹運用浮動這個好點子,但有必要在這裡談談它的基礎。float: right 是極有用的屬性/值組。如果你要取消一個引用了 float 的 class 賦值,你可以指定 float: none。
float 屬性有一些用法說明:
之前已經談過了在格言引用上賦 float 值的問題。那麼完成之後,我們就可以來看看效果。我們可以添加一些背景顏色使它與主要內容區別開來。
.pullQuote { float: right; background-color: rgb(204,204,204); }
像 float 屬性一樣,可指定 clear 屬性為 left、right 或 none 三者之一。清除屬性也支持 both 值。
float 屬性指令其它元素的內容如何環繞浮動元素,clear 屬性則規定了元素如何環繞其相鄰元素¬——在許多實例中,是規定不要浮動。
圖 6 顯示了 clear: left; 的表現;此布局中兩個原來連在一起的元素被指定了相同的 height 值,而 float 值分別設為 left 和 right:
圖 6:因為高度相當,clear:left 使底部盒子清除了兩列的浮動。
前一示例中 #cLeftWidget 的默認環繞會將它置於希臘語文本下面¬——即,#fLeftWidget 和 #fRightWidget 之間 。
想想看,如果這一組元素中前一個元素比其右對齊的同僚短,會出現什麼效果?如圖7所示:
圖 7: 當右列比左列長時,clear:left 不會清除兩列,所以必須用 clear:both。
在前一個例子中,後續元素的 clear 值設為 left 是為了表明一個觀點:因為兩個 float 的元素等高,clear 的元素會被推到兩者下面。但是,第二個例子證明為了從高度不等的 float 元素取得相同的結果,必須用到 clear: both;。
這裡對 clear 屬性的探討可看做其效果的簡單介紹,後面的文章會更深入地對該屬性的用途和技巧進行討論。
由於渲染引擎的種種差異,對全面涵蓋傳統的定義基礎的需要,對浏覽器窗口大小預計的無能為力,對 Web 文檔的布局都充滿了困難和限制。但是,一般的 CSS 支持水平已經可以輕易地使 Web 文檔在浏覽器上得到滿意的效果。