當(dāng)IE8發(fā)布時(shí),它將支持很多新的CSS display屬性值,包括與表格相關(guān)的屬性值:table、table-row和table-cell,它也是最后一款支持這些屬性值的主流瀏覽器。它標(biāo)志著復(fù)雜CSS布局技術(shù)的結(jié)束,同時(shí)也給了HTML表格布局致命一擊。最終,使用CSS布局來(lái)制作出類似于table布局的柵格將會(huì)變得十分迅速和簡(jiǎn)單。 使用CSS表格CSS表格能夠解決所有那些我們?cè)谑褂媒^對(duì)定位和浮動(dòng)定位進(jìn)行多列布局時(shí)所遇到的問(wèn)題。例如,“display:table;”的CSS聲明能夠讓一個(gè)HTML元素和它的子節(jié)點(diǎn)像table元素一樣。使用基于表格的CSS布局,使我們能夠輕松定義一個(gè)單元格的邊界、背景等樣式,而不會(huì)產(chǎn)生因?yàn)槭褂昧藅able那樣的制表標(biāo)簽所導(dǎo)致的語(yǔ)義化問(wèn)題。
<div id="wrapper"> <div id="main"> <div id="nav">? navigation column content…</div> <div id="extras">? news headlines column content…</div> <div id="content">? main article content…</div> </div> </div> 這份HTML源代碼滿足了內(nèi)容呈現(xiàn)方面的要求。先是導(dǎo)航欄,然后是附加欄,最后是內(nèi)容欄。 #main { display: table; border-collapse: collapse; } #nav { display: table-cell; width: 180px; background-color: #e7dbcd; } #extras { display: table-cell; width: 180px; padding-left: 10px; border-right: 1px dotted #d7ad7b; } #content { display: table-cell; width: 380px; padding-left: 10px; } 這種基于表格的新CSS布局方式能夠正確的在IE8、Firefox、Safari和Opera(譯者注:包括FF2/FF3/Google都通過(guò)了測(cè)試)中顯示出來(lái)。下面這張圖片是它在IE8中的樣子:
它是怎樣實(shí)現(xiàn)的?你可以給HTML元素指定與表格相關(guān)的display屬性值,使得它們像表格元素那樣渲染。以下是這些可用的display屬性值:
等等……難道用table布局不是錯(cuò)的嗎?可能你會(huì)對(duì)我們上面給出的布局實(shí)例有點(diǎn)不爽——畢竟,正如我自己也是一名WEB標(biāo)準(zhǔn)化的擁護(hù)者,我們不都一直堅(jiān)持不應(yīng)該使用table來(lái)進(jìn)行布局嗎? 匿名表格元素CSS表格除了包含table布局的普通規(guī)則之外,同時(shí)還有著CSS table布局的超強(qiáng)特性:缺少的表格元素會(huì)被瀏覽器以匿名方式創(chuàng)建。CSS2.1規(guī)范中寫道:
這段話的意思是,如果我們?yōu)樵厥褂谩癲isplay:table-cell;”屬性,而不將其父容器設(shè)置為“display:table-row;”屬性,瀏覽器會(huì)默認(rèn)創(chuàng)建出一個(gè)表格行,就好像文檔中真的存在一個(gè)被聲明的表格行一樣。
<div class="container"> <div class="row"> <div class="cell">CELL A</div> <div class="cell">CELL B</div> <div class="cell">CELL C</div> </div> </div> 這份嵌套的div元素看起來(lái)不是那么讓人興奮,稍等一會(huì),我們現(xiàn)在來(lái)做點(diǎn)什么。它的CSS樣式也非常簡(jiǎn)單: .container { display: table; } .row { display: table-row; } .cell { display: table-cell; width: 100px; height: 100px; border: 1px solid blue; padding: 1em; } 以上CSS給類名為container的元素定義了“display:table;”屬性,類名為row的元素定義了“display:table-row;”,類名為cell的元素定義了“display:table-cell;”,同樣還給它定義了邊框、高度和寬度值。 <div class="row"> <div class="cell">CELL A</div> <div class="cell">CELL B</div> <div class="cell">CELL C</div> </div> 即使上面的代碼遺漏了聲明表格的那一行,瀏覽器仍將創(chuàng)建一個(gè)匿名的表格行。我們還可以移除更多的代碼: <div class="cell">CELL A</div> <div class="cell">CELL B</div> <div class="cell">CELL C</div> 以上代碼遺漏了聲明表格和表格行的代碼,瀏覽器同樣會(huì)創(chuàng)建出這些匿名的盒對(duì)象。即使缺少這些標(biāo)簽元素,最終的效果仍然是一樣的。 創(chuàng)建匿名表格元素的規(guī)則這些匿名的盒對(duì)象不是用魔術(shù)變出來(lái)的,它們也不會(huì)自動(dòng)往你的HTML源碼中添加新的標(biāo)簽。為了完全發(fā)揮出匿名表格元素的優(yōu)勢(shì),你最好能夠?qū)?chuàng)建它們的規(guī)則有所了解。如果布局中調(diào)用了匿名元素,瀏覽器將會(huì)根據(jù)需要?jiǎng)?chuàng)建一個(gè)匿名的盒對(duì)象并將它的CSS display屬性設(shè)置為table、table-row或table-cell中的一個(gè)。 <div class="cell">CELL A</div> <div class="cell">CELL B</div> <div class="cell">CELL C</div> <div>Not a cell</div> 上面的三個(gè)類名為“cell”的div元素均被設(shè)置為“display:table-cell;”,它們將會(huì)像一個(gè)單行表格的三個(gè)單元格一樣并列排布。最后一個(gè)div元素則不會(huì)被包含在這一表格行當(dāng)中,因?yàn)樗鼪](méi)有被設(shè)置成“display:table-cell;”。 <div class="row">ROW A</div> <div class="row">ROW B</div> <div>Not a row</div> 上面兩排類名為“row”的div元素被設(shè)置了“display:table-row;”屬性,它們將會(huì)像單列表格中的兩行一樣依次排列。最后一個(gè)div元素則不會(huì)包含在這個(gè)匿名的table中。 其他有用的表格屬性當(dāng)使用CSS表格時(shí),因?yàn)檫@些元素遵從table布局的普通規(guī)則,所以你還可以給它們應(yīng)用其它表格相關(guān)的CSS屬性。下面是一些派得上用場(chǎng)的屬性:
制作完美的柵格制作等高柵格對(duì)于傳統(tǒng)CSS布局技術(shù)來(lái)說(shuō)已經(jīng)成為一個(gè)難題,然而使用合適的CSS表格則很容易實(shí)現(xiàn)。例如,如果我們想制作一個(gè)包含圖片和標(biāo)題的影像圖庫(kù)柵格(如下圖),使用CSS表格很快就能搞定。
<div class="grid"> <div class="row"> <div class="image"><img src="images/photo1.jpg" alt="A Lily" /> A lily in the gardens of The Vyne Country House</div> <div class="image"><img src="images/photo3.jpg" alt="A Fuchsia plant" /> Fuchsia plant in my garden</div> </div> <div class="row"> <div class="image"><img src="images/photo2.jpg" alt="A crazy looking Allium flower" /> A crazy looking flower</div> <div class="image"><img src="images/photo4.jpg" alt="A Robin sitting on a fence" /> This robin has been visiting our garden over the summer. He is very friendly and doesn't seem to be too worried about sharing the garden with us.</div> </div> </div> 每張圖片被一個(gè)img標(biāo)簽引用,它的標(biāo)題包含在P元素中,它們均被包含在一個(gè)類名為“image”的div元素中。同一行的div被一個(gè)類名為“row”的div元素包含,整個(gè)影像圖庫(kù)被一個(gè)類名為“grid”的div元素包含。 .grid { display: table; border-spacing: 4px; } .row { display: table-row; } .image { display: table-cell; width: 240px; background-color: #000; border: 8px solid #000; vertical-align: top; text-align: center; } .image p { color: #fff; font-size: 85%; text-align: left; padding-top: 8px; } 以上CSS代碼簡(jiǎn)明易懂,可能你還注意到了我們是怎樣通過(guò)border-spacing屬性來(lái)控制單元格圖像之間的距離的。制作一張柵格布局變得再簡(jiǎn)單不過(guò)了,同時(shí)我們還可以避免那些使用float元素實(shí)現(xiàn)等高布局所帶來(lái)的麻煩。 將理論運(yùn)用于實(shí)戰(zhàn)本文展示了CSS display屬性中表格相關(guān)屬性值的基礎(chǔ)用法,開發(fā)者不斷努力通過(guò)CSS來(lái)實(shí)現(xiàn)可靠的基礎(chǔ)柵格布局,而這種方法最終會(huì)使其變得更簡(jiǎn)單。我們已經(jīng)對(duì)CSS表格布局做了一個(gè)簡(jiǎn)明易懂的介紹,研究了display屬性中各種表格相關(guān)的屬性值,找出了匿名表格元素的本質(zhì),另外還發(fā)現(xiàn)了一些其它有用的CSS表格屬性。 |
|
來(lái)自: 風(fēng)之飛雪 > 《CSS》