css|建立
我最近的幾篇專欄文章討論了使用 XHTML 和 CSS 實現兩列或三列頁面配置的各個方面。到目前為止,所有例子都使用流式布局(也就是布局會自動擴充和適應瀏覽器視窗的寬度)。現在是時候考慮另外一種主要的頁面配置方法了,這種布局方法是固定寬度布局。
很多 Web 構建人員傾向於使用固定寬度的布局進行頁面設計,因為它們能產生精確且可預知的結果。這種方法與列印布局非常接近,對於設計人員和訪問者來說都是一個很重要的舒適因素;另外,對於包含很多大圖片和其它元素的內容,由於它們在流式布局中不能很好地表現,因此固定寬度布局也是處理這種內容的最好方法。
從 table 到 div
近年來,設計人員都使用表(table)來建立固定寬度的布局。表的列和行是對設計人員的表格版面配置(grid)的一種可行的類比,所以一點也不奇怪設計人員為什麼採用 HTML 表來完成頁面配置。
然而,基於表的布局有一個明顯的問題。除了語義上不適合用表來進行布局之外,產生的代碼也很混亂,難於閱讀,甚至難於維護——尤其是在包含合并的表儲存格(cell)和巢狀表格時。
使用 div 進行頁面配置效果要好得多。除了這是推薦使用的最佳方法之外,代碼的裝載速度會更快,也更易於處理。
表及其儲存格的格式(formatting)屬性被借用到固定寬度布局中,因為指定這些元素的尺寸相當簡單。其實通過 div 可以做到同樣的事情,只要確定 div 精確的維數並使用絕對和相對定位將這些 div 定位到頁面上即可。
一個固定寬度的例子
圖 A 展示了一個典型的固定寬度的布局,該布局由頂部的一個標題,一個三列內容的地區(主內容列,每側有一個工具條),和頁面底部的一個頁尾所組成。所有元素的寬度都是固定的;在瀏覽器視窗發布變化時它們的尺寸都不會變化。
下面的 XHTML 標籤產生圖 A 所示的頁面。(出於簡單考慮,內容被截短。)
<body>
<div id="head">
<h1>header</h1>
</div>
<div id="columns">
<div id="side1">
<h3>side1</h3>
<ul>
<li>Let me not to the marriage of true minds</li>
<li>Admit impediments; love is not love</li>
<li>Which alters when it alteration finds</li>
<li>Or bends with the remover to remove</li>
<li>Oh, no, it is an ever fixed mark</li>
</ul>
</div>
<div id="content">
<h2>main content</h2>
<p>That looks on tempests ... his height be taken.</p>
<p>But bears it out ... alteration finds.</p>
<p>Whose worth's unknown, ... the remover to remove.</p>
</div>
<div id="side2">
<h3>side2</h3>
<ul>
<li>Let me not to the marriage of true minds</li>
<li>Admit impediments; love is not love</li>
<li>Which alters when it alteration finds</li>
</ul>
</div>
</div>
<div id="foot">
<h3>footer</h3>
<p>Or bends with ... height be taken. </p>
</div>
</body>
下面是將頁面設計為固定寬度布局的 CSS 代碼:
body {
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size: 12px;
margin: 0px;
padding: 0px;
}
h2,h3 {
margin-top: 0px;
padding-top: 0px;
}
div#head {
position: absolute;
width:750px;
height:100px;
left:0px;
top: 0px;
background-color: #FFFF66;
}
div#columns {
position: relative;
width: 750px;
top: 100px;
background-color: #CCCCCC;
}
div#side1 {
position:absolute;
width:150px;
top: 0px;
left:0px;
background-color: #FF6666;
}
div#content {
position: relative;
width: 450px;
top: 0px;
left: 150px;
background-color: #999999;
}
div#side2 {
position:absolute;
width:150px;
top: 0px;
left: 600px;
background-color: #00FF66;
}
div#foot {
position: relative;
width: 750px;
clear: both;
margin-top: 100px;
background-color: #99FFFF;
}
分解代碼
這區段標記並不是特別地值得注意——只是在每個主要頁面元素的外面(標題、頁尾、工具條和主內容)包圍著 div。每個 div 有一個 id,相應的 CSS 樣式可以使用這個 id 引用它。只有一個額外的 div(div id="columns")包圍著三列內容地區。在 Internet Explorer 中將頁尾放在三列中最長一列的下面是必要的。
像平時用法一樣,CSS 程式碼完成所有的重要任務。首先它完成一些家務管理。Body樣式將頁面的邊距設為零,h2, h3樣式將預設間距設為零。否則的話,這該布局周圍就會有一個邊距,而在某些瀏覽器(比如 Netscape 和 Mozilla)中標題將會在在主內容和頁尾的上面產生一個空白地區。
樣式div#head為標題 div 設定一個明確的高度和寬度。標題使用 position: absolute, top: 0px和 left: 0px規則顯式地定位在頁面的左上方。規則 position: absolute是非常重要的,因為定位屬性(top、left、right、bottom)在常規(靜態)定位時會被忽略。然而要記住,任何絕對位置的元素都會從常規的頁面流中被移除掉,而屬於頁面流的元素將會像絕對位置元素不存在一樣被定位到頁面上。
樣式 div#columns控制 div 的格式,使其充當三個列的容器。它使用 position: relative建立屬於常規頁面流的一個元素(它會根據其內容進行擴充和適應,因而影響其它元素的定位),但是它將從其常規位置位移。規則 top: 100px提供一個位移量,將列容器向下推,使其覆蓋標題。
規則 div#side1控制第一個工具條列的樣式。它設定該列的寬度(width: 150px)並使用絕對位置將該列放置在其父元素的左上方。父元素是該列的 div,如果該元素使用相對於 body 元素的相對定位,那麼它將解釋 top: 0px規則而非你所期望的 100px設定。規則 div#side2以同樣的方式設定左工具條所用的列。div#side1和 div#side2唯一不同之處是背景色和 left: 600px規則,後者將該列定位在其它兩列的右邊。
樣式 div#content中的主內容所用的列的樣式控制與其它兩列的樣式控制相似。它顯式地設計寬度(width: 450px)並使用 left: 150px和 top: 0px規則在其父元素(包圍著三個列的 div)內定位該列。主要的不同之處在於 position: relative規則。我們使用相對定位使主內容列可以影響其父元素(包圍著三個列的 div)的尺寸並因此影響頁尾元素的尺寸。
樣式 div#foot設定頁尾的寬度(width: 750px),該樣式還包含一個 clear: both規則,該規則保證它接在其它元素下面,而不是旁邊。由於它使用相對定位,所以它在頁面上的位置是由其它元素的流所決定的,在這裡具體是由包圍著三個列的 div 所決定的。規則 margin-top: 100px是一個很重要的細節,它防止頁尾被上面的列所覆蓋。這些列在頁面流中從它們的常規位置位移,從而為絕對位置的標題以及需要相應位移的頁尾騰出空間。
置中樣式的變化
在固定寬度頁面配置中最常見且主要的變化可能是固定寬度的內容塊漂在瀏覽器視窗的中間,而不是黏附於瀏覽器視窗的左邊。你可以很容易地實現這一效果,方法是在其餘標記周圍(也就是 body 標籤內)添加一個封裝器(wrapper)div,並建立一個 CSS 樣式來置中那個 div。
例如,圖 B 是在圖 A 的基礎上添加了一個標籤(<div id="wrapper">)和一個相應的 CSS 樣式後的結果。下面是新添加的 CSS 樣式的代碼:
div#wrapper {
position:relative;
margin-left:auto;
margin-right:auto;
top: 20px;
width:750px;
background-color: #CCCCCC;
}
這種方法之所以能用,是因為所有的布局 div 都是相對於它們的父元素相對定位的。在圖 A 中,標題、內容列和頁尾所在 div 的父元素是 body 標籤,但是在圖 B 中,它們的父元素是 wrapper div。這種置中方法在“Creating a centered page layout with CSS(使用 CSS 建立置中頁面配置)”一文中有詳細的解釋。