2011-06-09 97 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; 
}