2011-06-09 51 views
15

我試圖模擬一個表只使用CSS和DIV。問題是我沒有做任何事情可以完美地模擬表格佈局行爲。CSS地獄模擬表DIV

下面是我想,立刻在這之下,有什麼我可以用CSS/DIV實現表格的佈局:

Layout with Table/CSS and Table/CSS http://i53.tinypic.com/2ujjk0w.jpg

HTML/CSS

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> 
<head> 
    <title>Teste</title> 
    <style type="text/css"> 
     table{ 
      table-layout:fixed; 
      width: 333px; 
      border-width: 1px; 
      border-spacing: 2px; 
      border-style: solid; 
      border-color: black; 
      border-collapse: collapse; 
     } 

     table th, table td 
     { 
      border-width: 1px; 
      padding: 1px; 
      border-style: solid; 
      border-color: black; 
      border-collapse: collapse; 
     } 

     table th.column1, table td.column1{ 
      width:60px; 
      background-color:#CCD9FF; 
     } 

     table th.column2, table td.column2{ 
      width:100px; 
      background-color:#ECFFE5; 
     } 

     table th.column3, table td.column3{ 
      width:60px; 
      background-color:#FFEBE5; 
     } 

     table th.column4, table td.column4{ 
      width:100px; 
      background-color: #FFFFCC; 
     } 

     div#tablecontainer 
     { 
      width: 328px; 
     } 

     div.tablecontainerrow 
     { 
      clear:both; 
     } 

     div#tablecontainer div div.column1 
     { 
      width: 60px; 
      float:left; 
      border: 1px solid black; 
      background-color:#CCD9FF;    
     } 

     div#tablecontainer div div.column2 
     { 
      width: 100px; 
      float:left; 
      border: 1px solid black; 
      background-color:#ECFFE5;    
     } 

     div#tablecontainer div div.column3 
     { 
      width: 60px; 
      float:left; 
      border: 1px solid black; 
      background-color:#FFEBE5;    
     } 

     div#tablecontainer div div.column4 
     { 
      width: 100px; 
      float:left; 
      border: 1px solid black; 
      background-color:#FFFFCC;    
     } 


    </style> 
</head> 
<body> 
    <h1>CSS and TABLE</h1> 
    <table> 
     <tr> 
      <th class="column1">Header 1</th> 
      <th class="column2">Header 2</th> 
      <th class="column3">Header 3</th> 
      <th class="column4">Header 4</th> 
     </tr> 
     <tr> 
      <td class="column1">line 1 column 1</td> 
      <td class="column2">line 1 column 2</td> 
      <td class="column3">line 1 column 3</td> 
      <td class="column4">line 2 column 4</td> 
     </tr> 
     <tr> 
      <td class="column1">line 2 column 1</td> 
      <td class="column2">line 2 column 2</td> 
      <td class="column3">line 2 column 3</td> 
      <td class="column4">line 2 column 4</td> 
     </tr> 
     <tr> 
      <td class="column1">line 3 column 1</td> 
      <td class="column2">line 3 column 2</td> 
      <td class="column3">line 3 column 3 (more content)</td> 
      <td class="column4">line 3 column 4</td> 
     </tr> 
    </table> 
    <h1>CSS and DIV</h1> 
    <div id="tablecontainer"> 
     <div class="tablecontainerrow"> 
      <div class="column1">Header 1</div> 
      <div class="column2">Header 2</div> 
      <div class="column3">Header 3</div> 
      <div class="column4">Header 4</div> 
      <div class="clear" /> 
     </div> 
     <div class="tablecontainerrow"> 
      <div class="column1">line 1 column 1</div> 
      <div class="column2">line 1 column 2</div> 
      <div class="column3">line 1 column 3</div> 
      <div class="column4">line 1 column 4</div> 
     </div> 
     <div class="tablecontainerrow"> 
      <div class="column1">line 2 column 1</div> 
      <div class="column2">line 2 column 2</div> 
      <div class="column3">line 2 column 3</div> 
      <div class="column4">line 2 column 4</div> 
     </div> 
     <div class="tablecontainerrow"> 
      <div class="column1">line 3 column 1</div> 
      <div class="column2">line 3 column 2</div> 
      <div class="column3">line 3 column 3 (more content)</div> 
      <div class="column4">line 3 column 4</div> 
     </div> 
    </div> 
</body> 
</html> 

什麼可能我修改允許CSS/DIV佈局類似於CSS/Table?

一些補充信息

  • 在這個作爲一個練習(挑戰)。所以請不要給我答案,說使用表格是更好的解決方案。
  • 事實上,我想知道一個解決方案,可以完全改變數據的表格佈局到另一個簡單地改變CSS。在這種情況下,使用<table>是沒有問題的。
  • 我想與IE 7 +,FF3 +,Chrome 4+兼容。

謝謝!

+11

是你想顯示的表呢?如果是這樣,請使用表格。 – 2011-06-09 20:47:48

+3

爲什麼?語義上使用表格來表格數據被認爲是最佳實踐。 – matchew 2011-06-09 20:48:11

+0

同意上面的海報,如果您正在顯示錶格,則表格是有意義的。 – 2011-06-09 20:49:35

回答

18

再次,你應該使用一個表。

但是,如果這僅僅是一個鍛鍊的CSS,踢...

  • <div class="clear" />
  • 改變背景顏色並改用faux-columns
  • 不要在各個單元格周圍放置邊框;而是把它們放在行的周圍。
  • 給該行的overflow:hidden

像這樣:http://jsfiddle.net/39F88/

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> 
<head> 
    <title>Teste</title> 
    <style type="text/css"> 
     table{ 
      table-layout:fixed; 
      width: 333px; 
      border-width: 1px; 
      border-spacing: 2px; 
      border-style: solid; 
      border-color: black; 
      border-collapse: collapse; 
     } 

     table th, table td 
     { 
      border-width: 1px; 
      padding: 1px; 
      border-style: solid; 
      border-color: black; 
      border-collapse: collapse; 
     } 

     table th.column1, table td.column1{ 
      width:60px; 
      background-color:#CCD9FF; 
     } 

     table th.column2, table td.column2{ 
      width:100px; 
      background-color:#ECFFE5; 
     } 

     table th.column3, table td.column3{ 
      width:60px; 
      background-color:#FFEBE5; 
     } 

     table th.column4, table td.column4{ 
      width:100px; 
      background-color: #FFFFCC; 
     } 

     div#tablecontainer 
     { 
      width:335px; 
      border-top:1px solid black; 
      background:url(http://i.stack.imgur.com/ZsO5U.png) TOP LEFT REPEAT-Y; 
     } 

     div.tablecontainerrow 
     { 
      clear:both; 
      overflow:hidden; 
      border:1px solid black; 
      border-top:none; 
     } 

     div#tablecontainer div div.column1 
     { 
      width: 62px; 
      float:left; 
     } 

     div#tablecontainer div div.column2 
     { 
      width: 104px; 
      float:left; 
     } 

     div#tablecontainer div div.column3 
     { 
      width: 62px; 
      float:left; 
     } 

     div#tablecontainer div div.column4 
     { 
      width: 104px; 
      float:left; 
     } 


    </style> 
</head> 
<body> 
    <h1>CSS and TABLE</h1> 
    <table> 
     <tr> 
      <th class="column1">Header 1</th> 
      <th class="column2">Header 2</th> 
      <th class="column3">Header 3</th> 
      <th class="column4">Header 4</th> 
     </tr> 
     <tr> 
      <td class="column1">line 1 column 1</td> 
      <td class="column2">line 1 column 2</td> 
      <td class="column3">line 1 column 3</td> 
      <td class="column4">line 2 column 4</td> 
     </tr> 
     <tr> 
      <td class="column1">line 2 column 1</td> 
      <td class="column2">line 2 column 2</td> 
      <td class="column3">line 2 column 3</td> 
      <td class="column4">line 2 column 4</td> 
     </tr> 
     <tr> 
      <td class="column1">line 3 column 1</td> 
      <td class="column2">line 3 column 2</td> 
      <td class="column3">line 3 column 3 (more content)</td> 
      <td class="column4">line 3 column 4</td> 
     </tr> 
    </table> 
    <h1>CSS and DIV</h1> 
    <div id="tablecontainer"> 
     <div class="tablecontainerrow"> 
      <div class="column1">Header 1</div> 
      <div class="column2">Header 2</div> 
      <div class="column3">Header 3</div> 
      <div class="column4">Header 4</div> 
     </div> 
     <div class="tablecontainerrow"> 
      <div class="column1">line 1 column 1</div> 
      <div class="column2">line 1 column 2</div> 
      <div class="column3">line 1 column 3</div> 
      <div class="column4">line 1 column 4</div> 
     </div> 
     <div class="tablecontainerrow"> 
      <div class="column1">line 2 column 1</div> 
      <div class="column2">line 2 column 2</div> 
      <div class="column3">line 2 column 3</div> 
      <div class="column4">line 2 column 4</div> 
     </div> 
     <div class="tablecontainerrow"> 
      <div class="column1">line 3 column 1</div> 
      <div class="column2">line 3 column 2</div> 
      <div class="column3">line 3 column 3 (more content)</div> 
      <div class="column4">line 3 column 4</div> 
     </div> 
    </div> 
</body> 
</html> 
+0

這是一個非常好的解決方案。它只適用於IE6。它被標記爲正確。謝謝! – outlookrperson 2011-06-10 11:54:24

+0

我相信,我不能得到文本的垂直對齊的表不,isn't呢? – outlookrperson 2011-06-10 12:40:50

+0

@rperson - 你的意思就像你使用['vertical-align'](http://www.w3.org/TR/CSS2/visudet.html#propdef-vertical-align)屬性?不,你必須使用'顯示:表cell'爲工作,或你必須用'padding'假的吧。 – 2011-06-10 13:09:35

2

這是一個可怕的答案,我不能相信我甚至暗示,但是,如果你是地獄一心想做一個表出來的div ...

正如陳述評論,如果它是一張桌子,使用一張桌子,桌子不是邪惡的,他們一次只是被過度使用來做他們沒有設計的東西。它們旨在顯示錶格數據,所以如果可以的話,使用它們。再次table-cell css.

,只是:

此,如果你必須與div的

有在CSS中一個鮮爲人知的顯示屬性來幫助您完成此表只是建議,讀到這裏如果可以,請使用表格。

+0

在'td'元素之外的任何東西上使用'display:table-cell'會導致各種gremlins在瀏覽器中出現。從語義的角度來看,高度皺眉,使用div來呈現表格數據實際上是不正確的。 – colinross 2011-06-09 20:56:47

+2

在td上使用表格單元就像在您的寵物小獵犬上寫下DOG字樣。 – 2011-06-09 20:59:47

+0

它只在那裏重置回正確的值,以防您從父值繼承問題。它實際上是作爲(瀏覽器)渲染模式啓動的,並且添加了css值以手動觸發該渲染模式。每種瀏覽器在該模式實際上會產生所需結果時略有不同,因爲誤用該值可能會導致渲染引擎呈現不帶父行,行集或表的表格單元格。 – colinross 2011-06-09 21:10:39

0

據我所知,解決這個問題的唯一方法是明確設置'columns'的高度,否則div將默認爲height:auto,並且只會與其中的內容一樣大。如果您的內容需要的空間大於高度允許的空間,則設置高度可能很危險。

+0

作爲一般規則,設置高度試圖強制顯式設計爲不強制垂直佈局的表示層(HTML)來強制垂直佈局,因此在理論和實踐中都存在問題。 – colinross 2011-06-09 20:59:31

+0

這不是解決方案,因爲列的內容是動態的,我不知道它的長度。 – outlookrperson 2011-06-09 22:41:46

6

使用表格佈局頁面不是很專業,但使用表格來顯示錶格完全沒問題 - 這是爲了他們應該使用。使用div和css來模擬表格會讓css佈局過於複雜。

+1

我同意,但表格數據視圖只是用戶可以選擇的其他幾種演示文稿佈局之一的情況呢? – outlookrperson 2011-06-09 23:33:40

+0

使用css *的頁面(或其部分)的佈局的根本改變可能是困難的。將文檔結構(HTML)與其演示文稿(CSS)完全分開並不總是可能的,至少不需要費力。爲了達到一些效果或者解決一些瀏覽器特定的錯誤,你必須改變結構(例如添加一些魔術師)。爲了讓它成爲可能,更便宜和更少挫折,我會考慮替換CSS和HTML。替換可以在傳統頁面的情況下在服務器端完成,或者在不需要頁面刷新時在客戶端(使用JS)完成。 – 2011-06-10 09:01:46

+0

我希望我能正確理解你的問題:D – 2011-06-10 09:04:02

1

如果您展示表格數據(多個類似實體的多個屬性,又名表格數據),使用<table>標籤

1
div#tablecontainer 
{ 
    width: 328px; 
    display:table; 
} 

div.tablecontainerrow 
{ 
    display:table-row; 
} 
div.tablecontainerrow div{ 
    display:table-cell; 
    vertical-align:middle; 
} 

當然,我認爲目前大多數的瀏覽器處理這個問題,除了MSIE ...

+0

這將是正確的*「授人以魚」 *回答 – 2011-06-09 21:00:53

+0

Aight,理所當然的,這基本是沒用的,並且關於它的唯一目的是爲了檢查是否瀏覽器準確地支持CSS功能。它可以在嵌入式XML的XHTML中表現出色,但這就是它的原因。 – Wrikken 2011-06-09 21:03:20

+1

只要你知道:http://caniuse.com/css-table – thirtydot 2011-06-09 22:50:58

0

超級惱人的問題,只是在工作中出現了。我通常使用背景來解決這個問題,但是因爲現在一切都需要響應,所以爲每個媒體查詢製作圖像是令人討厭的。這是我唯一一次使用JavaScript來實現我想要的。愚蠢的是,它不受支持。

HTML:

<ul class="table-layout clearfix"> 
    <li> 
     <p>Header 1</p> 
     <p>Header 1</p> 
     <p>Header 1</p> 
     <p>Header 1</p> 
     <p>Header 1</p> 
     <p>Header 1</p> 
    </li> 
    <li> 
     <p>Header 1</p> 
    </li> 
    <li> 
     <p>Header 1</p> 
    </li> 
</ul> 

的JavaScript:

$(document).ready(function(){ 

    var height = 0; 

    $(".table-layout li").each(function(i){ 

     if($(this).height() > height) 
      height = $(this).height(); 

    }); 

    $(".table-layout li").css("height", height + 'px'); 

}); 

CSS:

/** 
    * Markup free clearing. 
    * 
    * @see http://perishablepress.com/press/2009/12/06/new-clearfix-hack 
    */ 
    .clearfix:after { 
     content: "."; 
     display: block; 
     height: 0; 
     clear: both; 
     visibility: hidden; 
    } 
    /* IE6 */ 
    * html .clearfix { 
     height: 1%; 
    } 
    /* IE7 */ 
    *:first-child + html .clearfix { 
     min-height: 1%; 
    } 

    ul, li{ 
     margin:0; 
     padding:0; 
     list-style-type:none; 
    } 

    ul{ 
     width:335px; 
     overflow:hidden; 
    } 

    ul li{ 
     width: 31.5%; 
     float:left; 
     border:1px solid #000; 
     margin-right:4px; 
    } 

http://jsfiddle.net/kXrn5/6/

0

這是我的嘗試。這可能不完美,但這是一個開始。對我而言,它正在使用最新的Chrome,Firefox,Safari,Opera,IE10和 IE9。對不起,我沒有IE7來測試。我懷疑它的作用,因爲IE7很難處理。

http://jsfiddle.net/nluis3294/uLuof882/

我想我們大家都同意,你應該使用的表格數據表和div的非表格數據。在理想的世界裏,我認爲每個人都會這樣做。

但是,也可以說我希望我的非表格數據在網格中對齊,並且這些行和列應該像普通的html表一樣伸展。這是一個設計選擇,而且完全合法。這是困難所在。你可以使用表格,這很容易,但在技術上是錯誤的。或者,您可以使用div,並且必須依賴背景圖像,虛擬列和間隔符等技巧來使其看起來像表格。

使用虛擬列對我來說似乎也不「正確」。如果你想改變列的寬度,你需要編輯背景圖片。而使用背景圖像來設置背景顏色對我來說似乎很奇怪。對於其他的技巧,例如Psuedo專欄,或者負邊距技巧,我也有類似的保留意見。在我看來,他們應該改變CSS來允許一種簡單的方式來獲得看起來像沒有技巧的網格。

<div class="testTable"> 
<div class="testRow"> 
    <div class="testColumn1"> 
     aa 
    </div> 
    <div class="testColumn2"> 
     bb<br/> 
     bbb2 
    </div> 
    <div class="testColumn3"> 
     cc<br/> 
     cccc2 
    </div> 
    <div class="testColumn4"> 
     dddddd<br/> 
     dddddd 
    </div> 

</div> 
<div class="testRow"> 
    <div class="testColumn1"> 
     aa 
    </div> 
    <div class="testColumn2"> 
     bb<br/> 
     bbb2 
    </div> 
    <div class="testColumn3"> 
     cc<br/> 
     cccc2 
    </div> 
    <div class="testColumn4"> 
     dddddd<br/> 
     dddddd 
    </div> 

</div> 

<div class="testRow"> 
    <div class="testColumn1"> 
     aaa aaa 
    </div> 
    <div class="testColumn2"> 
     bb<br/> 
     bbb2<br/> 
     bbbbbbbbbbbbbbbbbbbb3 

    </div> 
    <div class="testColumn3"> 
     cccccc<br/> 

    </div> 
    <div class="testColumn4"> 
     ddddd<br/> 
     ddd 
    </div> 
    </div> 
</div> 

CSS:

div.testTable{ 
    width: 30%; display: table; table-layout: auto; 
    padding:0; 
    margin:0; 

} 

div.testRow{ 
    display: table-row; width: 100%; 
white-space: nowrap; 
    vertical-align:top; 
    padding:0; 
    margin:0; 

} 

div.testColumn1{ 
    display: table-cell; height:100%; min-width: 25%; background-color: #CCD9FF;  
    vertical-align:top; 
    padding: 0.2em; 

    border: 1px solid black; 
    margin:0; 

} 

div.testColumn2{ 
    display: table-cell; height:100%; min-width: 25%;background-color: #ECFFE5; 
    vertical-align:top; 
    padding: 0.2em; 

    border: 1px solid black; 
    margin:0; 

} 
div.testColumn3{ 
    display: table-cell; height:100%; min-width: 25%;background-color: #FFEBE5; 
    vertical-align:top; 
    padding: 0.2em; 

    border: 1px solid black; 
    margin:0; 

} 

div.testColumn4{ 
    display: table-cell; height:100%; min-width: 25%;background-color: #FFFFCC; 
    vertical-align:top; 
    padding: 0.2em; 

    border: 1px solid black; 
    margin:0; 
}