【问题标题】:CSS Hell simulating TABLE with DIVCSS Hell 用 DIV 模拟 TABLE
【发布时间】:2019-08-11 13:19:19
【问题描述】:

我正在尝试仅使用 CSS 和 DIV 来模拟表格。问题是我所做的任何事情都无法完美地模拟表格布局行为。

下面是我想要的表格布局,紧挨着这个布局,我可以用 CSS/DIV 实现:

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 的解决方案。在这种情况下,&lt;table&gt; 的使用是没有问题的。
  • 我希望兼容 IE 7+、FF3+、Chrome 4+。

谢谢!

【问题讨论】:

  • 您要显示的表格是什么?如果是这样,请使用表格。
  • 为什么?在语义上使用表格来存储表格数据被认为是一种最佳做法。
  • 同意上面的海报,如果你展示的是一张桌子,那么一张桌子是有意义的。
  • 只用一张桌子。但是对于这个问题:检查display: tabledisplay: table-row等等......
  • @BrunoLM、@Michael、@matchew、@Jeremy、@thirtydot,要解释为什么使用 CSS 而不是表格,请参阅我在问题中添加的补充信息。

标签: css


【解决方案1】:

同样,您应该使用表格。

但如果这只是 CSS 中的一个练习,那可真有趣……

  • 放弃&lt;div class="clear" /&gt;
  • 放弃背景颜色,改用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>

【讨论】:

  • 这是一个非常好的解决方案。它仅不适用于 IE6。它被标记为正确。谢谢!
  • 我认为我无法像表格那样垂直对齐文本,不是吗?
  • @rperson - 你的意思是如果你使用vertical-align 属性,你会喜欢吗?不,您必须使用 display:table-cell 才能使其工作,否则您必须使用 padding 伪造它。
  • 谢谢你,在 IE 和可访问性方面真的很有帮助。
  • @forX - 请记住:如果您谈论的是表格数据,将其放在表格中不会影响可访问性。
【解决方案2】:

用表格来布局页面不是很专业,但是用表格来展示表格是完全可以的——这是应该用的。使用 div 和 css 模拟表格的 css 布局太过分了。

【讨论】:

  • 我同意,但是如果表格数据视图只是用户可以选择的其他几种演示布局中的一种呢?
  • 使用 css only 彻底改变页面(或其部分)的布局可能很困难。将文档的结构 (HTML) 与其表示 (CSS) 完全分开并不总是可能的,至少无需付出很大的努力。要实现某些效果或解决某些浏览器特定的错误,您必须更改结构(例如添加一些魔术 div)。为了使它成为可能,更便宜且不那么令人沮丧,我会考虑同时替换 CSS 和 HTML。如果是传统页面,则可以在服务器端进行替换,或者在不需要刷新页面时在客户端(使用 JS)进行替换。
  • 感谢您的 cmets。它们是相关的,对我来说很有意义。
【解决方案3】:

这是一个可怕的答案,我不敢相信我什至会建议它,但是,如果你一心想用 div 制作一张桌子......

正如 cmets 中所述,如果它是一张桌子,请使用一张桌子,桌子不是邪恶的,它们只是在一次被过度使用来做它们不适合做的事情。它们旨在显示表格数据,因此如果可以,请使用它们。

仅当您必须使用 div 制作表格时才建议这样做

CSS 中有一个鲜为人知的 display 属性可以帮助您解决这个问题,请阅读此处:table-cell css.

再一次,如果可以的话,就用一张桌子。

【讨论】:

  • 并且在除td 元素之外的任何东西上使用display:table-cell 会导致浏览器中出现各种小鬼。从语义的角度来看,使用 div 来呈现表格数据实际上是不正确的。
  • 在 td 上使用 table-cell 就像在你的宠物小猎犬上写单词 DOG。
  • 只有在您遇到从父值继承的问题时才可以重置为正确的值。它实际上是作为(浏览器)渲染模式开始的,并且添加了 css 值以手动触发该渲染模式。每个浏览器在该模式实际产生所需结果时略有不同,因为滥用该值可能会导致渲染引擎被告知渲染没有父行、行集或表的表格单元格。
【解决方案4】:

如果您要呈现表格数据(多个相似实体的多个属性,即 表格 数据),请使用 &lt;table&gt; 标签

【讨论】:

    【解决方案5】:
    div#tablecontainer
    {
        width: 328px;
        display:table;
    }
    
    div.tablecontainerrow
    {
        display:table-row;
    }
    div.tablecontainerrow div{
        display:table-cell;
        vertical-align:middle;
    }
    

    当然,我认为大多数当前的浏览器都可以处理这个问题,除了 MSIE...

    【讨论】:

    • 好吧,当然,这几乎是无用的,它的唯一目的是检查浏览器是否准确地支持 CSS 功能。它可以在嵌入 XML 的 XHTML 中做一些的好处,但仅此而已。
    • 这是一个有趣的解决方案,但很遗憾display: table 仅适用于 IE 8.0 及更高版本。不幸的是,我认为 IE 7.0 仍然是必须的。不是吗?
    • 取决于:在公共互联网上,支持 MSIE 7(对于 一些 站点,MSIE 6,检查特定站点的用户代理统计信息)是必须的。再说一次,正如我所说,它的唯一用途是在 XHTML 中嵌入可显示的 XML,我在 Intranet 和 Internet 上看到的更多(但这可能是我有限的经验),并且在受控环境中你当然有说明将使用哪些浏览器。
    【解决方案6】:

    据我所知,解决此问题的唯一方法是明确设置“列”的高度,否则 div 将默认为 height:auto,并且只会与其中的内容一样大。如果您的内容需要的空间超出高度所允许的范围,那么设置高度可能会很危险。

    【讨论】:

    • 作为一般规则,设置高度是试图强制一个显式设计为不强制垂直布局的表示层 (HTML) - 强制垂直布局 - 因此,是有问题的 - - 理论和实践。
    • 这不是解决方案,因为列的内容是动态的,我不知道它的长度。
    【解决方案7】:

    超级烦人的问题,刚上班。我通常使用背景来解决这个问题,但由于现在一切都需要响应,因此为每个媒体查询制作图像很烦人。这是我唯一一次使用 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/

    【讨论】:

      【解决方案8】:

      这是我的尝试。它可能并不完美,但它是一个开始。对我来说,它适用于最新的 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;
      }
      

      【讨论】:

        猜你喜欢
        • 2011-08-18
        • 2011-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-23
        • 2014-10-31
        • 1970-01-01
        相关资源
        最近更新 更多