日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > CSS >内容正文

CSS

css Table布局:基于display:table的CSS布局

發(fā)布時間:2025/7/25 CSS 118 豆豆
生活随笔 收集整理的這篇文章主要介紹了 css Table布局:基于display:table的CSS布局 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

兩種類型的表格布局

  你有兩種方式使用表格布局?-HTML Table(<table>標(biāo)簽)和CSS Table(display:table?等相關(guān)屬性)。

  HTML Table是指使用原生的<table>標(biāo)簽,而CSS Table是指用CSS屬性模仿HTML 表格的模型。

  在W3C關(guān)于<table>相關(guān)標(biāo)簽的文檔中我們可以找到,HTML 4中<table>相關(guān)標(biāo)簽的默認(rèn)樣式表:

table { display: table } tr { display: table-row } thead { display: table-header-group } tbody { display: table-row-group } tfoot { display: table-footer-group } col { display: table-column } colgroup { display: table-column-group } td, th { display: table-cell } caption { display: table-caption }

  顯而易見HTML Table使用標(biāo)簽<table>、<tr>、<td>等標(biāo)簽,就是使用CSS Table的相關(guān)屬性來實現(xiàn)的。從上面HTML4的默認(rèn)樣式表中可以看出他們的使用對于CSS屬性的情況:

  • table:指定對象作為塊元素級的表格。類同于html標(biāo)簽<table>(CSS2)
  • inline-table:指定對象作為內(nèi)聯(lián)元素級的表格。類同于html標(biāo)簽<table>(CSS2)
  • table-caption:指定對象作為表格標(biāo)題。類同于html標(biāo)簽<caption>(CSS2)
  • table-cell:指定對象作為表格單元格。類同于html標(biāo)簽<td>(CSS2)
  • table-row:指定對象作為表格行。類同于html標(biāo)簽<tr>(CSS2)
  • table-row-group:指定對象作為表格行組。類同于html標(biāo)簽<tbody>(CSS2)
  • table-column:指定對象作為表格列。類同于html標(biāo)簽<col>(CSS2)
  • table-column-group:指定對象作為表格列組顯示。類同于html標(biāo)簽<colgroup>(CSS2)
  • table-header-group:指定對象作為表格標(biāo)題組。類同于html標(biāo)簽<thead>(CSS2)
  • table-footer-group:指定對象作為表格腳注組。類同于html標(biāo)簽<tfoot>(CSS2)

一個關(guān)鍵的區(qū)別

  作為從《CSS禪意花園》中學(xué)習(xí)CSS的個人,我討厭HTML Table布局。我不知不覺的產(chǎn)生了“虛幻的相關(guān)偏見”,高估HTML Table和CSS Table之間的區(qū)別。

  如果它看起來、工作起來、聽起來像一個表格,那么它必須是一個表格? 錯誤!

  事實上,HTML Table和CSS Table之間的真正區(qū)別是:適當(dāng)?shù)卣{(diào)整CSS屬性,CSS的Table能做到許多HTML Table 不能做的事情,可以從Table中擇優(yōu)選擇屬性使用。

使用CSS表格

  CSS表格能夠解決所有那些我們在使用絕對定位和浮動定位進(jìn)行多列布局時所遇到的問題。例如,“display:table;”的CSS聲明能夠讓一個HTML元素和它的子節(jié)點像table元素一樣。

  使用基于表格的CSS布局,使我們能夠輕松定義一個單元格的邊界、背景等樣式,而不會產(chǎn)生因為使用了table那樣的制表標(biāo)簽所導(dǎo)致的語義化問題。

  在深入了解這種方法之前,讓我們先來寫份HTML文檔實例:

<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)容欄。我們同樣需要將以下CSS樣式應(yīng)用上去:

#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都通過了測試)中顯示出來。我們輕松實現(xiàn)了三欄等高布局,而無需使用偽造背景圖片之類的技巧,更不用擔(dān)心定位和清除浮動的問題!

它是怎樣實現(xiàn)的?

  你可以給HTML元素指定與表格相關(guān)的display屬性值,使得它們像表格元素那樣渲染。以下是這些可用的display屬性值:

table
使該元素按table樣式渲染
table-row
使該元素按tr樣式渲染
table-cell
使該元素按td樣式渲染
table-row-group
使該元素按tbody樣式渲染
table-header-group
使該元素按thead樣式渲染
table-footer-group
使該元素按tfoot樣式渲染
table-caption
使該元素按caption樣式渲染
table-column
使該元素按col樣式渲染
table-column-group
使該元素按colgroup樣式渲染

難道用table布局不是錯的嗎?

  可能你會對我們上面給出的布局實例有點不爽——畢竟,正如我自己也是一名WEB標(biāo)準(zhǔn)化的擁護(hù)者,我們不都一直堅持不應(yīng)該使用table來進(jìn)行布局嗎?
  table元素在HTML當(dāng)中是一個包含語義的標(biāo)簽:它描述什么是數(shù)據(jù)。因此,你只能用它來標(biāo)記那些需要制表的數(shù)據(jù),例如一張財務(wù)信息表。如果數(shù)據(jù)能夠以電子表格的形式保存在你的電腦中,那它在HTML文檔中很可能需要用到table標(biāo)簽進(jìn)行標(biāo)記。從另一方面來看,display的table屬性值只是聲明了某些元素在瀏覽器中的樣式——它不包含語義。如果使用table元素來進(jìn)行布局,它將會告訴客戶端:這些數(shù)據(jù)是制表的。使用一些display屬性被設(shè)置為table和table-cell之類的div標(biāo)簽,除了告訴客戶端以某種特定的樣式來渲染它們以外,不會告訴客戶端任何語義,只要客戶端能夠支持這些屬性值。
  當(dāng)然,我們同樣還要注意,當(dāng)我們真的需要制表數(shù)據(jù)的時候不要使用一大堆被聲明為display:table;的div元素。
  我們上面的那個例子是一個簡單的單行三列布局,無需費盡心思,我們就能夠使用這種技術(shù)輕松實現(xiàn)復(fù)雜的柵格布局。

匿名表格元素

  CSS表格除了包含table布局的普通規(guī)則之外,同時還有著CSS table布局的超強(qiáng)特性:缺少的表格元素會被瀏覽器以匿名方式創(chuàng)建。CSS2.1規(guī)范中寫道:

CSS2.1表格模型中的元素,可能不會全部包含在除HTML之外的文檔語言中。這時,那些“丟失”的元素會被模擬出來,從而使得表格模型能夠正常工作。所有的表格元素將會自動在自身周圍生成所需的匿名table對象,使其符合table/inline-table、table-row、table-cell的三層嵌套關(guān)系。

  這段話的意思是,如果我們?yōu)樵厥褂谩癲isplay:table-cell;”屬性,而不將其父容器設(shè)置為“display:table-row;”屬性,瀏覽器會默認(rèn)創(chuàng)建出一個表格行,就好像文檔中真的存在一個被聲明的表格行一樣。

創(chuàng)建匿名表格元素的規(guī)則

  這些匿名的盒對象不是用魔術(shù)變出來的,它們也不會自動往你的HTML源碼中添加新的標(biāo)簽。為了完全發(fā)揮出匿名表格元素的優(yōu)勢,你最好能夠?qū)?chuàng)建它們的規(guī)則有所了解。如果布局中調(diào)用了匿名元素,瀏覽器將會根據(jù)需要創(chuàng)建一個匿名的盒對象并將它的CSS display屬性設(shè)置為table、table-row或table-cell中的一個。
  如果某個元素已經(jīng)被設(shè)置為“display:table-cell;”,而它的父節(jié)點(包含它的容器)沒有被設(shè)置為“display:table-row;”屬性,那么瀏覽器將會創(chuàng)建一個被設(shè)置為“display:table-row;”的匿名盒對象來嵌套它。并且與之相鄰的屬性為“display: table-cell;”的兄弟節(jié)點也都會被這個匿名盒對象所包含,直到碰到一個沒有被設(shè)置為“display: table-cell;”的元素而結(jié)束這一行。以下是相關(guān)的代碼樣例:

<div class=”cell”>CELL A</div> <div class=”cell”>CELL B</div> <div class=”cell”>CELL C</div> <div>Not a cell</div>

  上面的三個類名為“cell”的div元素均被設(shè)置為“display:table-cell;”,它們將會像一個單行表格的三個單元格一樣并列排布。最后一個div元素則不會被包含在這一表格行當(dāng)中,因為它沒有被設(shè)置成“display:table-cell;”。
如果某個元素被設(shè)置為“display:table-row;”,而它的父節(jié)點沒有被設(shè)置為“display:table;”(或者“display:table-row-group;”),瀏覽器將會創(chuàng)建一個被設(shè)置為“display:table;”的匿名盒對象來嵌套它,與之相鄰的屬性為“display: table-row;”的兄弟節(jié)點也都會被包含其中。同樣,如果某個元素被設(shè)置為“display:table-row;”,但它的內(nèi)部卻缺少“display:table-cell;”的元素,那么一個匿名的table-cell將會被創(chuàng)建,用來包含該table-row中的所有元素。請看以下代碼:

<div class=”row”>ROW A</div> <div class=”row”>ROW B</div> <div>Not a row</div>

  上面兩排類名為“row”的div元素被設(shè)置了“display:table-row;”屬性,它們將會像單列表格中的兩行一樣依次排列。最后一個div元素則不會包含在這個匿名的table中。
  以此類推,如果某個元素的display屬性值被設(shè)置為與表格相關(guān)的值,如table-row-group、table-header-group、 table-footer-group、table-column、table-column-group以及table-caption,但同時又沒有一個被設(shè)置為“display:table;”的父元素,那么一個匿名的盒對象將會被創(chuàng)建用來包含該元素和它的某些兄弟節(jié)點。

其他有用的表格屬性

  當(dāng)使用CSS表格時,因為這些元素遵從table布局的普通規(guī)則,所以你還可以給它們應(yīng)用其它表格相關(guān)的CSS屬性。下面是一些派得上用場的屬性:

table-layout
將table-layout屬性設(shè)置為fixed可以讓瀏覽器按照固定算法來渲染單元格的寬度。這在固定寬度布局中非常有用,例如我們最上面的那段布局代碼。
border-collapse
和普通的HTML表格一樣,你可以使用border-collapse屬性來定義你的table布局元素之間使用何種形式的邊框,是共用邊框(賦值為collapse)還是使用各自獨立的邊框(賦值為separate)。
border-spacing
如果你聲明了“border-collapse:separate;”,那么你就可以使用border-spacing屬性來定義相鄰兩個單元格邊框間的距離。

制作完美的柵格

  制作等高柵格對于傳統(tǒng)CSS布局技術(shù)來說已經(jīng)成為一個難題,然而使用合適的CSS表格則很容易實現(xiàn)。例如,如果我們想制作一個包含圖片和標(biāo)題的影像圖庫柵格(如下圖),使用CSS表格很快就能搞定。

  以下是我們這個影像圖庫的代碼:每張圖片被一個img標(biāo)簽引用,它的標(biāo)題包含在P元素中,它們均被包含在一個類名為“image”的div元素中。同一行的div被一個類名為“row”的div元素包含,整個影像圖庫被一個類名為“grid”的div元素包含。
  實現(xiàn)這個布局的CSS代碼十分簡單:

<!DOCTYPE html> <html lang="en"> <head><meta charset="utf-8"><title>等高柵格</title> <style> .grid {display: table;/*表格布局*/border-spacing: 4px;/*單元格間距4px*/ } .row {display: table-row;/*表格th布局*/ } .image {display: table-cell;/*表格td布局*/width: 240px;background-color: #000;border: 8px solid #000;vertical-align: middle;text-align: center; } .image p {color: #fff;font-size: 85%;text-align: left;padding-top: 8px; } </style> <body> <div class='grid'><div class='row'><div class='image'><img src='images/11.png' alt='A Lily' /><p>A lily in the gardens of The Vyne Country House</p></div><div class='image'><img src='images/11.png' alt='A Fuchsia plant' /><p>Fuchsia plant in my garden</p></div></div><div class='row'><div class='image'><img src='images/11.png' alt='A crazy looking Allium flower' /><p>A crazy looking flower</p></div><div class='image'><img src='images/11.png' alt='A Robin sitting on a fence' /><p>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.</p></div></div> </div> </body> </html>

  效果圖:

  當(dāng)然,這個我采用的是vertical-align:middle;你如果采用top對齊,那么圖片就是完全一致對齊啦。

?

轉(zhuǎn)載于:https://www.cnblogs.com/goloving/p/7678291.html

總結(jié)

以上是生活随笔為你收集整理的css Table布局:基于display:table的CSS布局的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。