编写带有垂直标题的HTML表的最常见方法是什么?


95

嗨,自从我问了一个问题已经有一段时间了,这已经困扰了我一段时间了,问题本身就出现在标题中:

编写具有垂直标题的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>
   

这种方式的主要优点是,你有权利(实际上左)头所表示的,我不喜欢但是旁边就是<thead><tbody><tfoot>标签丢失,而且也没有办法,包括他们没有打破巧妙地将元素放在一起,这使我进入了第二个选择。

第二种选择

   
        <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表,缺点是正确的表示形式对于tbodyand thead标签需要一些CSS,并且标头和数据之间的关系不是很清楚,因为我在创建时有疑问标记。


因此,这两种方式都可以使表格呈现应有的效果,这是一个必填项:

渲染
如果愿意,可以在标题的左侧或右侧显示任何建议,替代方法和浏览器问题?

Answers:


45

首先,从表中所有行(TR)应该包含相等数量的列(TD)的意义上讲,您的第二个选项不是十分有效的HTML。您的标头包含1,而正文具有3。您应该使用colspan属性对其进行修复。

参考: “ THEAD,TFOOT和TBODY节必须包含相同数量的列。” - 第11.2.3节的最后一段

话虽如此,我认为第一种选择是更好的方法,因为无论是否启用CSS,它都是可读的。某些浏览器(或搜索引擎搜寻器)不使用CSS,因此,它会使您的数据变得毫无意义,因为标题随后将表示列而不是行。


他真的有必要解决您提到的第一个问题吗?因为如果仅添加一个单元格,它会自动占用第一个空格,其余的会被忽略吗?
LouwHopley

您好,感谢您突出显示了无效的标记,我将对其进行纠正。
Tristian

@Nideo-我在帖子中添加了HTML4文档的引用,其中明确指出THEAD,TFOOT和TBODY必须包含相同数量的列。
Francois Deschenes 2011年

@Triztian-还有一件事。TFOOT应该在THEAD的正下方(在TBODY之前)。同样,HTML规范的11.2.3节对此进行了介绍。
Francois Deschenes 2011年

1
@prodigitalson- scope在这种情况下,该属性实际上并没有太大的区别。如果您读懂它的用途,您将会理解。这基本上意味着that列是它包含的行或列的标题。问题在于,除非将替换为<th>,否则使用是没有意义的<td scope="row">
Francois Deschenes 2011年



0

如果要在表中显示数据绑定的控件元素(如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>

-3

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>


3
请添加有关您的答案如何解决问题中所标识问题的说明。
blurfus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.