【发布时间】:2014-07-23 18:47:11
【问题描述】:
我有一个产品数据矩阵。
我的目标是:
- 使用 HTML5 以表格格式显示矩阵
- 在描述它的数据上方显示一个左对齐的“标题”
- 显示右对齐的“添加”按钮,与标题垂直对齐,便于向表格中添加行
- 显示标题行来描述每列数据
- 如果可能,以语义上“正确”的方式执行上述所有操作
所以,最终的结果应该是这样的:
--------------------------------------------------------
|Product Catalog [+Add Product]|
--------------------------------------------------------
| Title | Cost | Weight | and | so | on | ... |
--------------------------------------------------------
| Thing1| $5.99| 3 oz | ... | ...| ...| ... |
| Thing2| $2.99| 2 oz | ... | ...| ...| ... |
--------------------------------------------------------
我当前的代码:
<table>
<caption>Product Catalog <button style="float: right; display: block;">+Add Product</button></caption>
<thead>
<tr>
<th>Title</th>
<th>Cost</th>
<th>Weight</th>
<th>and</th>
<th>so</th>
<th>on</th>
<th>...</th>
</tr>
</thead>
<tbody>
<tr>
<td>Thing1</td>
<td>$5.99</td>
<td>3 oz</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
<tr>
<td>Thing2</td>
<td>$2.99</td>
<td>2 oz</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
</tbody>
</table>
根据 HTML5 规范,标题元素可以包含任何流内容,包括按钮。
来自规范:
内容模型:流式内容,但没有后代表格元素
但是,相同的规范将标题元素定义为:
标题元素表示作为其父级的表格的标题,如果它有一个父级并且是一个表格元素。
根据该描述,按钮似乎不属于标题内,因为它对表格的标题没有任何帮助,即使它在技术上是允许的。
我的问题是: 在表格标题中包含一个按钮在语义上是否“正确”?如果它不“正确”,是否可以接受?有没有更语义上正确的方法来达到预期的结果?
我发现很多关于表格语义的问题/答案,但大多数都没有处理表格上的按钮。
This question/answer 询问表格中的按钮,但它特定于“单元格”内的按钮,而不是标题。
HTML5 规范:
- 标题元素:https://www.w3.org/TR/html5/tabular-data.html#the-caption-element
- 流内容:https://www.w3.org/TR/html5/dom.html#flow-content-1
编辑:
This question/answer 似乎与我的问题具有相同的性质,但他问的是把他的按钮放在 <th> 内,而不是表格标题。
我考虑过的一个解决方案是:根本不使用标题。只需将<h1> 或类似的标题标签放在 表格标签之前。唯一的问题是标题将不再与表格相关......还是会?实际上,这可能是答案。如果我将<h1> 和<table> 包装在<section> 或<div> 中,那可能会起作用吗?
我正在寻找“最正确”的方法。
【问题讨论】:
-
请注意,w3.org/TR/html-markup 不是 HTML5 spec。它只是一个非规范性的参考,并且已经停止使用。
-
对问题进行了编辑,以包含指向 HTML5 规范的正确链接,并更正引用的摘录,以及对它的不准确/不完整引用。
标签: html button html-table semantic-markup caption