嵌套表和表头的语义

Posted

技术标签:

【中文标题】嵌套表和表头的语义【英文标题】:Semantic of nested tables and table header 【发布时间】:2013-09-16 16:29:46 【问题描述】:

我有一个表格,其中元素可以有具有相同属性的子元素,例如:

ITEM    ATTRIBUTE 1    ATTRIBUTE 2
item    value          value
 sub    value          value
 sub    value          value
item    value          value

从这里我创建了一个这样的标记:

<table>
    <thead>
        <tr>
            <th>ITEM</th>
            <th>ATTRIBUTE 1</th>
            <th>ATTRIBUTE 2</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>item</td>
            <td>value</td>
            <td>value</td>
        </tr>
        <tr>
            <td colspan=3>
                <table>
                    <tbody>
                        <tr>
                            <td>sub</td>
                            <td>value</td>
                            <td>value</td>
                        </tr>
                    </tbody>
                </table>
            </td>
        </tr>
        <tr>
            <td>item</td>
            <td>value</td>
            <td>value</td>
        </tr>
    </tbody>
</table>

我现在的问题是:

这是最好的语义解决方案吗? 其他方法更适合吗?如果是,推荐的方式是什么? 是表头负责这两个表还是我必须创建一个新表头(嵌套表可能使用visibility: hidden

【问题讨论】:

是的,终于获得了 75 声望,开始了所谓的赏金活动。哦,我失去了在任何地方发表评论的可能性。嗯。 我会避免嵌套表格,它会在单元格中插入一个新表格,这不是您想要的。如果您只有 1 级关系,为什么不保持表格平整并使用 css 来识别项目与子项目。 &lt;tr class="item"&gt;...&lt;/tr&gt;&lt;tr class="subitem"&gt;...&lt;/tr&gt; @kalhartt 是的,但这并不能反映子项的语义,或者是吗?我也想过这个,但它只会产生视觉上的差异。 如果你适当地设置类的样式并且它很容易解析与任何 dom 操纵器的关系,它会在视觉上反映出来。您希望具体体现的含义如何。 @kalhartt 我的意思是,它传输子项是子项或更多子项各自父项的子集,并且它们不在同一个“级别”上。 【参考方案1】:

这是最好的语义解决方案吗?

不是真的。虽然将元素 A 嵌套在另一个元素 B 中的行为可用于指示 A 是 B 的子级,但这不是您在这里所做的:您将表嵌套在完全不同的行中,所以有没有暗示 A 和 B 之间的父子关系。

通过创建一个跨越表格中所有列的单元格,然后在其中构建另一个具有相同列数的表格,您实际上也可以说“这些是一些 other 列,与外部表中的无关”。

您可以通过在上面的示例中为单元格添加边框来查看列之间的隐含(缺少)关系:

显然,您可以使用 CSS 解决这个问题,但一段 html 的无样式呈现通常是其语义的良好指南。

另一种方法更适合吗?如果是,推荐的方式是什么?

没有标准的方法来表示 HTML 中表格的行之间的层次关系。不过,从an answer I gave to a similar question 抄袭,您可以使用额外的类、id 和data- 属性:

<table>
    <thead>
        <tr>
            <th>ITEM</th>
            <th>ATTRIBUTE 1</th>
            <th>ATTRIBUTE 2</th>
        </tr>
    </thead>
    <tbody>
        <tr id=100>
            <td>item</td>
            <td>value</td>
            <td>value</td>
        </tr>
        <tr id=110 data-parent=100 class=level-1>
            <td>sub</td>
            <td>value</td>
            <td>value</td>
        </tr>
        <tr id=200>
            <td>item</td>
            <td>value</td>
            <td>value</td>
        </tr>
    </tbody>
</table>

父子关系在无样式渲染中是不可见的(据我所知,没有其他方法可以在不添加额外内容的情况下做到这一点),但是有足够的钩子来添加所需的 CSS :

.level-1 > td:first-child 
    padding-left: 1em;

...这会导致:

使用一点 javascript,您还可以使用 iddata-parent 属性进行设置,例如将鼠标悬停在一行上会突出显示其父级。

是表头负责这两个表,还是我必须创建一个新表头?

在您提出的解决方案中,创建一个跨越所有列的单元格,然后在其中构建另一个表格意味着标题单元格与“子”行的单元格之间没有隐含关系。显然我上面建议的解决方案没有这个问题。

【讨论】:

您在开头的两段准确地描述了我的担忧,我的(间接)问题似乎得到了回答 - 不幸的是:“没有标准的方法来表示表格行之间的层次关系在 HTML 中。” 很好的解决方案,但是如果我想使用模板渲染表格,这个解决方案不会产生问题吗? @DigvijayYadav 怎么样?如果有两个以上的级别,一行将需要知道它在层次结构中的深度,但这对于提供数据的任何东西都可以在必要时进行跟踪(如果只有两个级别,只需知道有一个父级)足够的)。在任何合理的模板语言中,其余的都是微不足道的。【参考方案2】:

这是 W3C 的建议:

目前,那些希望确保整个 Assistive 提供一致支持的人 标题不在第一行/列中的表格的技术可能需要 将技术用于复杂表 H43:使用 id 和 headers 属性 将数据单元格与数据表中的标题单元格相关联。对于具有 第一列或第一行的标题我们建议使用 th 和 td 元素。

你可以锁定这个帖子:Best way to construct a semantic html table

希望能帮助你得到答案

【讨论】:

谢谢。 (+1)。【参考方案3】:

谈论语义需要我们有更多的时间而不是为您的问题找到答案。

但总的来说,this link 应该可以帮助您。该页面包含您可能感兴趣的所有信息。有趣的是,与 w3c 所写的普通“声明性”规范不同,它在此上下文中对问题进行了“建议性”写作。您可能希望从头开始阅读。

【讨论】:

【参考方案4】:

我认为将孩子放在单独的桌子上是错误的做法。嵌套表不像嵌套列表;它们不具有相同的语义层次结构。如果所有内容都列出相同的信息,那么似乎所有内容都应该在同一个表中。

例如,如果您的表格有标题

REGION    POPULATION     AREA

那么你可以有 item1 = 地球,item2 = 法国,item3 = 巴黎......如果法国是地球的孩子或巴黎是法国的孩子,这并不重要;你最好还是把它全部放在一张桌子上,而不是尝试在 CSS 样式中建立父/子关系。

如果在没有人知道父/子关系的情况下您的表格真的无法理解,您能否举一个表格数据的示例,以便我更好地理解如何构建它?

【讨论】:

以上是关于嵌套表和表头的语义的主要内容,如果未能解决你的问题,请参考以下文章

嵌套表和 VARRAY 之间的区别

当行的html标签未嵌套在表头标签下时,在表头下抓取一行信息

如何在具有角度嵌套数据组的材料表中显示拆分标题

Oracle SQL3 3 嵌套表插入问题

使用 jQuery 在嵌套表结构中选择***别的 td

SMACSS、语义类名和嵌套元素