这里的挑战是,您要表示的信息一方面是表格(它是一组具有相同标签属性的项目),另一方面是分层(项目有父项)。
不幸的是,HTML 中的表格行没有嵌套分组机制:tbody 可用于对行进行分组,但嵌套是非法的(除了td 中的中间 table,这非常可怕) .
这让你有两个选择:
用某种嵌套列表表示信息,并依靠 CSS 使结果看起来像一个表格。
将信息表示为表格,并依靠某种属性来表示其层次关系。
以下是您如何实施这些选择的一些示例:
使用嵌套列表(简单方法):
<ul>
<li>
<dl>
<dt>Seq</dt> <dd>1</dd>
<dt>Item Name</dt> <dd>Identifier</dd>
<dt>Min</dt> <dd>1</dd>
<dt>Max</dt> <dd>1</dd>
</dl>
</li>
<li>
<dl>
<dt>Seq</dt> <dd>2</dd>
<dt>Item Name</dt> <dd>Name</dd>
<dt>Min</dt> <dd>1</dd>
<dt>Max</dt> <dd>1</dd>
</dl>
<ul>
<li>
<dl>
<dt>Seq</dt> <dd>2.1</dd>
<dt>Item Name</dt> <dd>First Name</dd>
<dt>Min</dt> <dd>1</dd>
<dt>Max</dt> <dd>1</dd>
</dl>
</li>
<li>
<dl>
<dt>Seq</dt> <dd>2.2</dd>
<dt>Item Name</dt> <dd>Middle Name</dd>
<dt>Min</dt> <dd>-</dd>
<dt>Max</dt> <dd>-</dd>
</dl>
</li>
<li>
<dl>
<dt>Seq</dt> <dd>2.3</dd>
<dt>Item Name</dt> <dd>Last Name</dd>
<dt>Min</dt> <dd>1</dd>
<dt>Max</dt> <dd>1</dd>
</dl>
</li>
</ul>
</li>
<li>
<dl>
<dt>Seq</dt> <dd>3</dd>
<dt>Item Name</dt> <dd>Age</dd>
<dt>Min</dt> <dd>-</dd>
<dt>Max</dt> <dd>1</dd>
</dl>
</li>
<ul>
这会处理信息的分层方面,但最终会重复很多次,并且必须跳过 CSS 中的一些环节才能以表格的方式显示结果。明智地使用:first-child 可能是可行的,但最终结果是您已经竭尽全力标记您想要以非表格方式呈现为表格的内容,结果给您自己需要做更多的工作才能将其恢复原状。
它还使项目之间关系的真正表格性质在标记中隐含而不是显式 - 如果不参考呈现的输出,不清楚这些项目是否总是具有相同数量和种类的属性。
使用嵌套列表(“聪明”的方法):
<dl>
<dt>
<ul> <li>Seq</li> <li>Item Name</li> <li>Min</li> <li>Max</li> </ul>
</dt>
<dd>
<ul> <li>1</li> <li>Identifier</li> <li>1</li> <li>1</li> </ul>
</dd>
<dd>
<dl>
<dt>
<ul> <li>2</li> <li>Name</li> <li>1</li> <li>1</li> </ul>
</dt>
<dd>
<ul> <li>2.1</li> <li>First Name</li> <li>1</li> <li>1</li> </ul>
</dd>
<dd>
<ul> <li>2.2</li> <li>Middle Name</li> <li>-</li> <li>-</li> </ul>
</dd>
<dd>
<ul> <li>2.3</li> <li>Last Name</li> <li>1</li> <li>1</li> </ul>
</dd>
</dl>
</dd>
<dd>
<ul> <li>3</li> <li>Age</li> <li>-</li> <li>1</li> </ul>
</dd>
</dl>
在这里,我们使用description lists 来描述两件事:
例如之间的标题/细节关系'项目名称'和'标识符'等
例如之间的父/子关系“姓名”单元和“名字”单元。
它当然更紧凑,但不幸的是,每个标题与其细节元素之间的特定关系充其量是隐含的,并且没有额外的样式以表格方式直观地组织信息,在呈现实际内容时就更不明显了被代表。
使用table:
<table>
<thead>
<tr>
<th>Seq</th> <th>Item Name</th> <th>Min</th> <th>Max</th>
</tr>
</thead>
<tbody>
<tr id=100>
<td>1</th> <th>Identifier</th> <td>1</td> <td>1</td>
</tr>
<tr id=200>
<th>2</th> <th>Name</th> <td>1</td> <td>1</td>
</tr>
<tr id=210 data-parent=200 class=level-1>
<th>2.1</th> <th>First Name</th> <td>1</td> <td>1</td>
</tr>
<tr id=220 data-parent=200 class=level-1>
<th>2.2</th> <th>Middle Name</th> <td>-</td> <td>-</td>
</tr>
<tr id=230 data-parent=200 class=level-1>
<th>2.3</th> <th>Last Name</th> <td>1</td> <td>1</td>
</tr>
<tr id=300>
<th>3</th> <th>Age</th> <td>-</td> <td>1</td>
</tr>
</tbody>
</table>
这里,父/子关系由data-parent 属性明确描述(必要时可以通过javascript 访问),class=level-{n} 属性提供了一个可供CSS 使用的钩子:
.level-1 > th {
padding-left: 1em;
}
最终这是个人喜好和方便的问题,但我认为 <table> 方法更好,因为它满足“没有 CSS 看起来合理吗?”经验法则比上述任何一种嵌套列表方法都要好。