10

当数据行包含无法容纳在单个表行中的复杂数据时,我想知道在网页上标记表格数据的最佳方法。

这是一个具体的例子。第一行附有关于手臂和腿的额外信息列表。

Shadrach M 香蕉 12
  武器蓝 2
  腿黄色 3
Meshgah M 苹果 34
Abednego M 柿子 0

除了使用包含这样的嵌套表的跨单元格之外,是否有一种很好的方法来标记它?

+--------+--+--------+------+
| | | | |
+--------+--+--------+------+
| +--------+------+-+ |
| | | | | |
| +--------+------+-+ |
| | | | | |
| +--------+------+-+ |
+--------+--+--------+------+
| | | | |
+--------+--+--------+------+
| | | | |
+--------+--+--------+------+

我对此并不完全满意,因为外部表格有四列,具有特定的标题和含义;但第二行跨越所有四列并且包含不同的内容。我真的希望这些信息成为第一行项目(Shadrach)的一部分,而不是顶级表的一部分。但是 HTML 似乎不允许我这样做。

有没有更好、更语义化的方式?

4

5 回答 5

8

如果您将表放在详细信息行的第一列,使其跨越所有四列,并将描述性表头添加到表中,那么这应该提供一些基本语义来将详细信息表与其描述的列相关联。

我认为这是一种传统 HTML 语义无法传达您正在寻找的内容的情况,您应该考虑使用 XHTML 并使用W3C WAI规定的ARIA 属性对其进行扩展,以增强现有的 XHTML 语义以描述复杂的类似于您要创建的结构。也许如果您向详细信息表描述的单元格添加aria- describeby属性,这将提供您正在寻找的附加语义:

<table>
     <thead>
        <tr>
          <th>column 1</th>
          <th>column 2</th>
          <th>column 3</th>
          <th>column 4</th>
        </tr>
     </thead>
     <tbody>
        <tr>
          <td id="master" aria-describedby="detail">Shadrach</td>  
          <td>M</td>  
          <td>Banana</td>     
          <td>12</td>
        </tr>
        <tr>
          <td colspan="4">
             <table id="detail">
                <tbody>
                   <tr>
                      <td>arms</td>
                      <td>blue</td>
                      <td>2</td>
                   </tr> 
                   <tr>
                      <td>legs</td>
                      <td>yellow</td>
                      <td>3</td>
                   </tr>
                </tbody>
             </table>
          </td>
        </tr>
     </tbody
 </table>

您可能会发现有许多 aria-roles 和属性很有用,例如, 用于具有分层布局和扩展行的表的treegrid角色。看看 ARIA 工作草案,我相信你会找到一些可以描述你想要表达的东西的东西。

于 2009-11-25T03:34:30.040 回答
7

在尝试使您的标记更具语义时,您需要问自己一件事是您这样做的目的是什么。语义标记之所以有价值,是因为它更容易设置样式,并且可以应用不同的样式表,而无需针对您正在使用的标记自定义它们。它之所以有价值,是因为它有助于可访问性,使屏幕阅读器或替代渲染引擎更容易对其进行适当的分析。有时它具有价值,因为搜索引擎或其他自动化工具可以从中提取信息。

但是,有时您会遇到 HTML 无法处理的情况。这似乎是其中之一。HTML 没有任何方法可以将分层数据嵌套在具有与表的其他列不匹配的列的表中。所以,你需要用你所拥有的做到最好。在这一点上,担心让它更语义化并不能给你带来太多好处。你正在做一些相当特殊的事情,其他样式表、屏幕阅读器和工具可能不知道该怎么做,所以几乎你提出的任何解决方案都不完全违背元素的目的有问题是可以的。

我认为你提到的解决方案是你能做的最好的。用一个类标记那些包含嵌套表的行,该类表明它们与其他行不同,并称之为好。如果需要,您可以使用多个<tbody>元素将它们与它们附加到的行组合在一起:

<table>
<tbody>
  <tr><td>Shadrach  <td>M  <td>Banana     <td>12
  <tr class=nested><td colspan=4>
    <table>...</table>
<tbody>
  <tr><td>Meshgah   <td>M  <td>Apple      <td>34
<tbody>
  <tr><td>Abednego  <td>M  <td>Persimmon   <td>0
</table>
于 2009-11-25T03:36:44.887 回答
2

有没有更好、更语义化的方式?

是的——不要在里面放一个嵌套表。Arms/Legs 应该是原始表上的更多列,或者完全是一个单独的表。然后根据需要使用 CSS 来设置样式1

1不,我不知道你怎么可能用语义 HTML 和 CSS 获得相同的视觉效果。但这不是重点。您正在寻找语义标记 - 而不是如何使其符合您认为适合 UX 的内容(提示:如果您使用表格进行布局(如您所愿),那么它只适合视觉用户的 UX)。

于 2010-02-06T18:36:33.920 回答
1

WAI的表格教程提供了处理复杂表格的非常简单的介绍。原始帖子中的示例可能说明了一种多级表

于 2015-01-09T22:42:20.243 回答
0

除非您对信息有明确的语义,否则没有单一的方法可以做到这一点。您似乎在行内有一个树状结构,一些嵌套的 DIV 可能很有用。因此,可能有一个行单元格的 DIV 子级,尽管使用起来会很复杂。或者,您可以尝试创建嵌套表(TABLE 作为内容或单元格)。

如果您想保留复杂的语义,那么 HTML 不是最好的方法,也许您应该使用 XML 表示或 RDF。这些都可以转换为 HTML 进行显示,同时保留语义。

于 2009-11-25T03:17:56.253 回答