基於display:table的CSS佈局

来源:http://www.cnblogs.com/zsxblog/archive/2016/04/04/5352363.html
-Advertisement-
Play Games

當IE8發佈時,它將支持很多新的CSS display屬性值,包括與表格相關的屬性值:table、table-row和table-cell,它也是最後一款支持這些屬性值的主流瀏覽器。它標志著複雜CSS佈局技術的結束,同時也給了HTML表格佈局致命一擊。最終,使用CSS佈局來製作出類似於table佈局 ...


當IE8發佈時,它將支持很多新的CSS display屬性值,包括與表格相關的屬性值:table、table-row和table-cell,它也是最後一款支持這些屬性值的主流瀏覽器。它標志著複雜CSS佈局技術的結束,同時也給了HTML表格佈局致命一擊。最終,使用CSS佈局來製作出類似於table佈局的柵格將會變得十分迅速和簡單。
網頁元素應用上那些與表格相關的display屬性值後,能夠模仿出與表格相同的特性。我將會在該文中給大家演示這種方法給CSS佈局帶來的巨大影響。

使用CSS表格

CSS表格能夠解決所有那些我們在使用絕對定位和浮動定位進行多列佈局時所遇到的問題。例如,“display:table;”的CSS聲明能夠讓一個HTML元素和它的子節點像table元素一樣。使用基於表格的CSS佈局,使我們能夠輕鬆定義一個單元格的邊界、背景等樣式,而不會產生因為使用了table那樣的製表標簽所導致的語義化問題。
在深入瞭解這種方法之前,讓我們先來寫份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源代碼滿足了內容呈現方面的要求。先是導航欄,然後是附加欄,最後是內容欄。
我們同樣需要將以下CSS樣式應用上去:

#main {
display: table;
border-collapse: collapse;
}

 

#nav {
display: table-cell;
width: 180px;
#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都通過了測試)中顯示出來。下麵這張圖片是它在IE8中的樣子:

基於display:table的CSS佈局 - 第1張  | 前端開拓者

我們輕鬆實現了三欄等高佈局,而無需使用偽造背景圖片之類的技巧,更不用擔心定位和清除浮動的問題!

它是怎樣實現的?

你可以給HTML元素指定與表格相關的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標準化的擁護者,我們不都一直堅持不應該使用table來進行佈局嗎?
table元素在HTML當中是一個包含語義的標簽:它描述什麼是數據。因此,你只能用它來標記那些需要製表的數據,例如一張財務信息表。如果數據能夠以電子錶格的形式保存在你的電腦中,那它在HTML文檔中很可能需要用到table標簽進行標記。
從另一方面來看,display的table屬性值只是聲明瞭某些元素在瀏覽器中的樣式——它不包含語義。如果使用table元素來進行佈局,它將會告訴客戶端:這些數據是製表的。使用一些display屬性被設置為table和table-cell之類的div標簽,除了告訴客戶端以某種特定的樣式來渲染它們以外,不會告訴客戶端任何語義,只要客戶端能夠支持這些屬性值。
當然,我們同樣還要註意,當我們真的需要製表數據的時候不要使用一大堆被聲明為display:table;的div元素。
我們上面的那個例子是一個簡單的單行三列佈局,無需費盡心思,我們就能夠使用這種技術輕鬆實現複雜的柵格佈局。

匿名錶格元素

CSS表格除了包含table佈局的普通規則之外,同時還有著CSS table佈局的超強特性:缺少的表格元素會被瀏覽器以匿名方式創建。CSS2.1規範中寫道:

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

這段話的意思是,如果我們為元素使用“display:table-cell;”屬性,而不將其父容器設置為“display:table-row;”屬性,瀏覽器會預設創建出一個表格行,就好像文檔中真的存在一個被聲明的表格行一樣。
讓我們用個簡單的例子來研究下它的這一特性:以下是三欄柵格佈局。我們將會用三份不同的HTML樣例,而它們將表現出相同的視覺效果。

基於display:table的CSS佈局 - 第2張  | 前端開拓者

首先,以下是能夠生成三列佈局樣例的其中一份:

<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元素看起來不是那麼讓人興奮,稍等一會,我們現在來做點什麼。它的CSS樣式也非常簡單:

.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;”,同樣還給它定義了邊框、高度和寬度值。
以上HTML文檔明確地為三個單元格定義了包含它的表格和表格行,使用到了所有我們創建的CSS類名。然而,我們可以減少這些標簽,移除一行div元素試試:

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

即使上面的代碼遺漏了聲明表格的那一行,瀏覽器仍將創建一個匿名的表格行。我們還可以移除更多的代碼:

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

以上代碼遺漏了聲明表格和表格行的代碼,瀏覽器同樣會創建出這些匿名的盒對象。即使缺少這些標簽元素,最終的效果仍然是一樣的。

創建匿名錶格元素的規則

這些匿名的盒對象不是用魔術變出來的,它們也不會自動往你的HTML源碼中添加新的標簽。為了完全發揮出匿名錶格元素的優勢,你最好能夠對創建它們的規則有所瞭解。如果佈局中調用了匿名元素,瀏覽器將會根據需要創建一個匿名的盒對象並將它的CSS display屬性設置為table、table-row或table-cell中的一個。
如果某個元素已經被設置為“display:table-cell;”,而它的父節點(包含它的容器)沒有被設置為“display:table-row;”屬性,那麼瀏覽器將會創建一個被設置為“display:table-row;”的匿名盒對象來嵌套它。並且與之相鄰的屬性為“display: table-cell;”的兄弟節點也都會被這個匿名盒對象所包含,直到碰到一個沒有被設置為“display: table-cell;”的元素而結束這一行。以下是相關的代碼樣例:

<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元素均被設置為“display:table-cell;”,它們將會像一個單行表格的三個單元格一樣併列排布。最後一個div元素則不會被包含在這一表格行當中,因為它沒有被設置成“display:table-cell;”。
如果某個元素被設置為“display:table-row;”,而它的父節點沒有被設置為“display:table;”(或者“display:table-row-group;”),瀏覽器將會創建一個被設置為“display:table;”的匿名盒對象來嵌套它,與之相鄰的屬性為“display: table-row;”的兄弟節點也都會被包含其中。同樣,如果某個元素被設置為“display:table-row;”,但它的內部卻缺少“display:table-cell;”的元素,那麼一個匿名的table-cell將會被創建,用來包含該table-row中的所有元素。
請看以下代碼:

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

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

其他有用的表格屬性

當使用CSS表格時,因為這些元素遵從table佈局的普通規則,所以你還可以給它們應用其它表格相關的CSS屬性。下麵是一些派得上用場的屬性:

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

製作完美的柵格

製作等高柵格對於傳統CSS佈局技術來說已經成為一個難題,然而使用合適的CSS表格則很容易實現。例如,如果我們想製作一個包含圖片和標題的影像圖庫柵格(如下圖),使用CSS表格很快就能搞定。

基於display:table的CSS佈局 - 第3張  | 前端開拓者

以下是我們這個影像圖庫的代碼:

<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>

每張圖片被一個img標簽引用,它的標題包含在P元素中,它們均被包含在一個類名為“image”的div元素中。同一行的div被一個類名為“row”的div元素包含,整個影像圖庫被一個類名為“grid”的div元素包含。
實現這個佈局的CSS代碼十分簡單:

.grid {
display: table;
border-spacing: 4px;
}
.row {
display: table-row;
}
.image {
display: table-cell;
width: 240px;
#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代碼簡明易懂,可能你還註意到了我們是怎樣通過border-spacing屬性來控制單元格圖像之間的距離的。製作一張柵格佈局變得再簡單不過了,同時我們還可以避免那些使用float元素實現等高佈局所帶來的麻煩。

將理論運用於實戰

本文展示了CSS display屬性中表格相關屬性值的基礎用法,開發者不斷努力通過CSS來實現可靠的基礎柵格佈局,而這種方法最終會使其變得更簡單。我們已經對CSS表格佈局做了一個簡明易懂的介紹,研究了display屬性中各種表格相關的屬性值,找出了匿名錶格元素的本質,另外還發現了一些其它有用的CSS表格屬性。
接下來的一步就看你了,你已經瞭解到使用CSS表格製作柵格佈局的潛力,帶著好奇心去自己嘗試下吧!運用從本文學到的知識,你可以開始實踐你自己的CSS表格佈局併發明一些新的技術

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 文件尾碼名 sass有兩種尾碼名文件:一種尾碼名為sass,不使用大括 號和分號;另一種就是我們這裡使用的scss文件,這種和我們 平時寫的css文件格式差不多,使用大括弧和分號。而本教程中 所說的所有sass文件都指尾碼名為scss的文件。在此也建議使 用尾碼名為scss的文件,以避免sass尾碼 ...
  • 第8章,用jQuery打造個性網站 網站結構 文件結構 images文件夾用於存放將要用到的圖片 styles文件夾用於存放CSS樣式表,個人更傾向於使用CSS文件夾 scripts文件夾用於存放jQuery腳本,個人更傾向於使用JS文件夾存放所有的js及jQuery腳本 編寫CSS樣式 推薦首先編 ...
  • 第6章,jQuery與Ajax的應用 Ajax的優勢和不足 Ajax的優勢 1、不需要插件支持 2、優秀的用戶體驗 3、提高Web程式的性能 4、減輕伺服器和帶寬的負擔 Ajax的不足 1、瀏覽器對XMLHttpRequest對象的支持度不足 2、破壞瀏覽器前進、後退按鈕的正常功能 3、對搜索引擎的 ...
  • 首先,先給大家看一組demo 展示效果: 為什麼會出現空格呢?input不是行內元素嗎?改變一下代碼再看看效果 如果2個input之間沒有間隙的話,下麵的空格就消失了 再試驗一組行內元素: 展示效果如下: 為了使這些行內元素之間的間距消失,我們手動刪除行內元素之間產生的額外空隙,代碼如下 效果圖如下 ...
  • CSS選擇器用於選擇你想要的元素的樣式的模式。 "CSS"列表示在CSS版本的屬性定義(CSS1,CSS2,或對CSS3)。 ...
  • “玉淵潭公園櫻花節”是每年櫻花綻放時,都會在玉淵潭公園櫻舉辦櫻花節,游客前往玉淵潭公園,可以欣賞到20個品種2000株櫻花。2016玉淵潭櫻花節時間:3月中旬-4月中旬觀賞最佳,2016年3月23日開幕(具體開幕時間不詳- -)6:00─20:30(21:30靜園)。櫻花的花期極短,從開花到凋謝只不 ...
  • AntiModerate 是一個漸進式圖片載入的 JavaScript 庫。我們多數看到的圖片顯示模式,都是從上到下逐漸顯示的,這是“標準式”圖像;而有的圖片是先出現一個很低解析度的圖像輪廓,類似加了馬賽克的模糊樣子,當圖片完全載入完畢時,圖片就由模糊變得清晰了,這就是“漸進式”圖像。 線上演示 源 ...
  • 圖像映射 圖像映射也稱為圖像熱點。 作用: 讓同一張圖片上的不同區域,可以實現多個不同的超鏈接功能。 圖示: 圖像映射三步走: 圖像映射的實現需要三方面配合完成: 1、圖像映射容器,就是一個img標簽,需使用usemap屬性與map標簽建立聯繫 2、圖像映射,就是一個map標簽,需要使用name屬性... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...