在HTML中组合表和分层列表

在HTML中组合表和分层列表,html,css,html-table,wcag,wcag2.0,Html,Css,Html Table,Wcag,Wcag2.0,我正在重新设计一个遗留的工具集,我正在研究如何更好地从表象和语义两方面显示一些信息 数据本质上是分层的,但其属性需要易于用户看到。所需的布局与下面的类似 Seq Item Name Min Max - Anything under here isn't shown 1 Identifier 1 1 (Required) 2 Name 1 1 2.1 First Name

我正在重新设计一个遗留的工具集,我正在研究如何更好地从表象和语义两方面显示一些信息

数据本质上是分层的,但其属性需要易于用户看到。所需的布局与下面的类似

Seq     Item Name         Min  Max  - Anything under here isn't shown
 1      Identifier         1    1     (Required)
 2      Name               1    1
  2.1    First Name        1    1
  2.2    Middle Name       -    -     (Optional but unlimted)
  2.3    Last Name         1    1
 3      Age                -    1     (Optional)
目前,这是一个完整的表格,序列(
Seq
)编号的插入是通过插入额外的表格单元格来实现的,可以将所有内容向右突出

我面临的挑战是如何有效地显示这些信息

首先,这是表格数据吗?我会说不,因为层次结构很重要,“列”只是每个“行”中项目的属性

如果它不是表格,它是什么以及如何实现?我个人认为这是一组嵌套的
UL
列表-序列号是可选的,并不总是一个数字。如果它是一组列表,那么将正确缩进子列表,但是呈现短属性的最佳方式是什么


如果它是一个表,那么在表中表示层次结构语义存在的最佳方式是什么?

我认为您应该使用表。诚然,层次结构更为重要,但它也可以通过手动写下第一列来显示。但是属性min、max和item name不能像在表中那样容易地显示在列表中。我的意见:使用一个表,手动提供seq列

我将使用一个表格并通过添加到
td
标签来展示它:

<table id="myTable" class="table">
    <tr>
        <td data-indent="0">1</td>
        <td data-indent="0">Test</td>
        <td data-indent="0">Test 1</td>
    </tr>
    <tr>
        <td data-indent="1">1.1</td>
        <td data-indent="1">Another</td>
        <td data-indent="0">Test 1.1</td>
    </tr>
    <tr>
        <td data-indent="2">1.1.1</td>
        <td data-indent="3">Another</td>
        <td data-indent="0">Test 1.1.1</td>
    </tr>
        <tr>
        <td data-indent="2">1.1.2</td>
        <td data-indent="3">Another one</td>
        <td data-indent="0">Another test 1.1.2</td>
    </tr>
    <tr>
        <td data-indent="0">2</td>
        <td data-indent="0">Test</td>
        <td data-indent="0">Test 2</td>
    </tr>
</table>

查看它的工作情况。

我的建议是使用嵌套的有序列表来保留层次结构,然后使用描述列表来表示每行的“列”

例如,第一行的描述列表可能如下所示:

<dl>
  <dt>Item Name</dt>
  <dd>Identifier</dd>
  <dt>Min</dt>
  <dd>1</dd>
  <dt>Max</dt>
  <dd>1</dd>
  <dt>Notes</dt>
  <dd>(Required)</dd>
</dl>
table { border-collapse: collapse; }
tbody { border-bottom:1px solid #000; }
tbody .sub td { padding-left: 10px; }

项目名称
标识符
分钟
1.
马克斯
1.
笔记
(必选)
您必须使用CSS来隐藏描述术语(因为您不希望它们显示在每一行上),并将布局调整为更像一个表

这种格式的缺点是,您将在每一行上复制列标题。但从语义上讲,我认为这是最有意义的,它也应该使内容对屏幕阅读器更有意义

我已经为此做了第一次CSS尝试,因此您可以了解它是如何工作的。这可能做得不太好,但至少它会给你一些开始的东西


这里的挑战是,您想要表示的信息在一个方面是表格形式的(这是一组具有相同标签属性的项),在另一个层次结构中(项具有父项)

不幸的是,HTML中没有针对表行的嵌套分组机制:可以用于对行进行分组,但嵌套是非法的(除了在
td
中使用中间
,这非常可怕)

这就给你留下了两个选择:

  • 使用某种嵌套列表表示信息,并依赖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>
    
    <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>
    
    <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>
    
    在这里,我们用它来描述两件事:

  • 标题/详细信息之间的关系,例如“项目名称”和“标识符”等

  • 例如,“姓名”单元和“名字”单元之间的父/子关系

  • 它当然更紧凑,但不幸的是,每个标题及其细节元素之间的特定关系充其量是隐式的,并且如果没有额外的样式以表格的方式直观地组织信息,那么在呈现实际呈现的内容时,它将更加不明显

    使用
    表格

    <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>
    
    <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>
    
    <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>
    

    归根结底,这是个人偏好和便利性的问题,但我认为
    方法更好,因为它满足了“没有CSS看起来合理吗?”的经验法则,比上面的任何一种嵌套列表方法都好得多。

    为什么两者都不行?树状网格是表示也符合层次结构的表格数据的好方法

    这是

    然而,在两个非常大的项目上使用了Extjs之后,我个人的建议是,如果要生成一个大型应用程序,就不要使用Extjs。虽然这对于一次性的网格可能是好的,但我个人发现它的实现很差,并且随着项目规模的增加,可能会变得更加麻烦。但是,它的功能非常丰富,因此可能会为您提供有关网格(表)的更多想法,这些想法可能会对您有所帮助

    请记住,您应该始终问自己,“我的用户试图回答哪些问题?”然后,问自己,“哪些图形设备提供了回答该问题的最清晰、最简单的途径?”

    一本真正帮助我解决这些问题的书是。尽管您可能没有构建仪表板,但它有许多UX技术和理论,使我在选择适当的UI元素(与数据相关)时更加容易


    希望这有助于…

    我认为有两种明智的方法可以在HTML中表示这一点:

    • 使用
      并使用自然语言明确关系/层次结构
    • 使用剖切元素(如果使用HTML 4.01,则使用相应的标题)
    ,带有解释层次结构的列 如果没有用于定义此关系的标记,则应使用文本。如果视觉表示是明确的,您可以在视觉上隐藏此文本,以便仅屏幕阅读器/文本浏览器用户可以访问它

    在你的
    <section class="item" id="3">
      <h2>Age</h2>
    
      <dl>
        <dt>Min</dt>
        <dd>1</dd>
        <dt>Max</dt>
        <dd>1</dd>
      </dl>
    
    </section>
    
    <table>
      <thead>
        <tr>
          <th id="seq">Seq</th>
          <th>Item Name</th>
          <th>Min</th>
          <th>Max</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <th id="s1" headers="seq">1</th>
          <td>Identifier</td>
          <td>1</td>
          <td>1</td>
        </tr>
      </tbody>
      <tbody>
        <tr>
          <th id="s2" headers="seq">2</th>
          <td>Name</td>
          <td>1</td>
          <td>1</td>
        </tr>
        <tr class="sub">
          <th id="s2_1" headers="seq s2">2.1</th>
          <td>First Name</td>
          <td>1</td>
          <td>1</td>
        </tr>
        <tr class="sub">
          <th id="s2_2" headers="seq s2">2.2</th>
          <td>Middle Name</td>
          <td>-</td>
          <td>-</td>
        </tr>
        <tr class="sub">
          <th id="s2_3" headers="seq s2">2.3</th>
          <td>Last Name</td>
          <td>1</td>
          <td>1</td>
        </tr>
        <tr class="sub sub">
          <th id="s2_3_1" headers="seq s2 s2_3">2.3.1</th>
          <td>Last Name</td>
          <td>1</td>
          <td>1</td>
        </tr>
        <tr class="sub sub">
          <th id="s2_3_2" headers="seq s2 s2_3">2.3.2</th>
          <td>Last Name</td>
          <td>1</td>
          <td>1</td>
        </tr>
      </tbody>
      <tbody>
        <tr>
          <th id="s3" headers="seq">3</th>
          <td>Age</td>
          <td>-</td>
          <td>1</td>
        </tr>
      </tbody>
    </table>
    
    table { border-collapse: collapse; }
    tbody { border-bottom:1px solid #000; }
    tbody .sub td { padding-left: 10px; }
    
    <tr>
      <td>1</td>
      <td>Identifier</td>
      <td>1</td>
      <td>1</td>
    </tr>
    <tbody>
      <tr>
        <td>2</td>
        <td>Name</td>
        <td>1</td>
        <td>1</td>
      </tr>
      <tr class="sub">
        <td>2.1</td>
        <td>First Name</td>
        <td>1</td>
        <td>1</td>
      </tr>
      ...
    </tbody>
    <tr>
      <td>3</td>
      <td>Age</td>
      <td>-</td>
      <td>1</td>
    </tr>