【问题标题】:Most common way of writing a HTML table with vertical headers?使用垂直标题编写 HTML 表格的最常见方法是什么?
【发布时间】:2023-03-18 23:25:02
【问题描述】:

大家好,我已经有一段时间没有问了,这是困扰我一段时间的问题,问题本身就在标题中:

编写具有垂直标题的 HTML 表格的首选方式是什么?

垂直标题是指表格在左侧(通常)有标题(<th>)标签

表头 1 数据数据数据
表头 2 数据数据数据
表头 3 数据数据数据

它们看起来像这样,到目前为止我想出了两个选择

第一个选项

<table id="vertical-1"> <caption>First Way</caption> <tr> <th>Header 1</th> <td>data</td><td>data</td><td>data</td> </tr> <tr> <th>Header 2</th> <td>data</td><td>data</td><td>data</td> </tr> <tr> <th>Header 2</th> <td>data</td><td>data</td><td>data</td> </tr> </table>

这种方式的主要优点是标题右侧(实际上是左侧)它所代表的数据旁边,但我不喜欢的是 &lt;thead&gt;&lt;tbody&gt;&lt;tfoot&gt; 标签是丢失,并且没有办法在不破坏良好放置在一起的元素的情况下包含它们,这导致我选择第二个选项。

第二个选项

<style type="text/css"> #vertical-2 thead,#vertical-2 tbody{ display:inline-block; } </style> <table id="vertical-2"> <caption>Second Way</caption> <thead> <tr> <th colspan="3">Header 1</th> </tr> <tr> <th colspan="3">Header 2</th> </tr> <tr> <th colspan="3">Header 3</th> </tr> </thead> <tbody> <tr> <td>row 1</td> <td>row 1</td> <td>row 1</td> </tr> <tr> <td>data</td> <td>data</td> <td>data</td> </tr> <tr> <td>data</td> <td>data</td> <td>data</td> </tr> </tbody> <tfoot> <tr> <td colspan="4">Footer</td> </tr> </tfoot> </table>

这里的主要优点是你有一个完全描述性的 html 表格,缺点是正确的表示需要一些 CSS 用于 tbodythead 标签,并且标题和数据之间的关系不是非常清楚,因为我在创建标记时有疑问。


所以,这两种方式都可以渲染表格,这里是一个pitcure:


如果您愿意,可以在左侧或右侧使用标题,那么,有什么建议、替代方案、浏览器问题吗?

【问题讨论】:

    标签: html css datatable semantic-markup


    【解决方案1】:

    首先,您的第二个选项不是非常有效的 HTML,因为表中的所有行 (TR) 都应包含相等数量的列 (TD)。你的 header 有 1 而 body 有 3。你应该使用 colspan 属性来解决这个问题。

    参考:“THEAD、TFOOT 和 TBODY 部分必须包含相同数量的列。” - Last paragraph of section 11.2.3.

    话虽如此,我认为第一个选项是更好的方法,因为无论我是否启用了 CSS,它都是可读的。一些浏览器(或搜索引擎爬虫)不使用 CSS,因此,它会使您的数据毫无意义,因为标题将代表列而不是行。

    【讨论】:

    • 他真的有必要解决你提到的第一个问题吗?因为如果你只添加一个单元格,它会自动占用第一个空格,其余的会被忽略?
    • 嗨,感谢您突出显示无效标记,我会更正它。
    • @Nideo - 我在我的帖子中添加了来自 HTML4 文档的参考,明确指出 THEAD、TFOOT 和 TBODY 必须包含相同数量的列。
    • @Triztian - 还有一件事。 TFOOT 应该在 THEAD 的正下方(并且在 TBODY 之前)。同样,这在 HTML 规范的第 11.2.3 节中有介绍。
    • @prodigitalson - 在这种情况下,scope 属性不会有太大的不同。如果你读了它的用途,你就会明白。它基本上意味着该列是它包含的行或列的标题。问题是它的使用没有意义,除非用&lt;td scope="row"&gt; 替换&lt;th&gt;
    【解决方案2】:

    第一个选项...我认为这是更好更简单的方法..

    【讨论】:

      【解决方案3】:

      老实说,选项 1。我建议您查看 W3.org 中的这个示例(链接如下)。我认为这种方法是最好的,因为这样你的标题也会在屏幕阅读器上被正确解读。

      https://www.w3.org/WAI/tutorials/tables/one-header/#table-with-header-cells-in-the-first-column-only

      【讨论】:

        【解决方案4】:

        如果您想在表格中显示数据绑定控件元素(如 asp 中继器),则第一个选项将不可行。第二个选项可以如下使用。

        
        
        <asp:Repeater ID="hours" runat="server">
          <HeaderTemplate>
            <table id="vertical-table">
              <thead>
                <tr>
                  <th colspan="0">hours:</th>
                </tr>
                <tr>
                  <th colspan="1">Monday</th>
                </tr>
                <tr>
                  <th colspan="1">Tuesday</th>
                </tr>
                <tr>
                  <th colspan="1">Wednesday</th>
                </tr>
                <tr>
                  <th colspan="1">Thursday</th>
                </tr>
                <tr>
                  <th colspan="1">Friday</th>
                </tr>
                <tr>
                  <th colspan="1">Saturday</th>
                </tr>
                <tr>
                  <th colspan="1">Sunday</th>
                </tr>
              </thead>
              <tbody>
          </HeaderTemplate>
          <ItemTemplate>
                <tr>
                  <td>
                    <%# Container.DataItem %>
                  </td>
                </tr>
          </ItemTemplate>
          <FooterTemplate>
              </tbody>
            </table>
          </FooterTemplate>
        </asp:Repeater>

        【讨论】:

          【解决方案5】:

          div.vertical {
            margin-left: -85px;
            position: absolute;
            width: 215px;
            transform: rotate(-90deg);
            -webkit-transform: rotate(-90deg);
            /* Safari/Chrome */
            -moz-transform: rotate(-90deg);
            /* Firefox */
            -o-transform: rotate(-90deg);
            /* Opera */
            -ms-transform: rotate(-90deg);
            /* IE 9 */
          }
          
          th.vertical {
            height: 220px;
            line-height: 14px;
            padding-bottom: 20px;
            text-align: left;
          }
          <table>
            <thead>
              <tr>
                <th class="vertical">
                  <div class="vertical">Really long and complex title 1</div>
                </th>
                <th class="vertical">
                  <div class="vertical">Really long and complex title 2</div>
                </th>
                <th class="vertical">
                  <div class="vertical">Really long and complex title 3</div>
                </th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td>Example</td>
                <td>a, b, c</td>
                <td>1, 2, 3</td>
              </tr>
            </tbody>
          </table>

          【讨论】:

          • 请解释您的答案如何解决问题中确定的问题。
          猜你喜欢
          • 1970-01-01
          • 2020-09-16
          • 1970-01-01
          • 2023-03-25
          • 2014-09-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-10-08
          相关资源
          最近更新 更多