使垂直 table 可访问
Making a vertical table accessible
我有一些非常基本的数据,例如:
{
"name": "John Doe",
"city": "Minneapolis",
"state": "Minnesota",
"country": "United States",
"age": "42"
}
我需要这样显示:
| name | John Doe |
| city | Minneapolis |
| state | Minnesota |
| country | United States |
| age | 42 |
如您所见,上面的 table 有 headers 左对齐并且行值全部对齐。
According to W3, 做一个垂直的方法table 就像下面的代码片段,但他们也叫:
Note: Some screen readers will read “Date – Event – Venue” in the “Venue” cell because the direction of the <th>
elements is ambiguous.
table th {
text-align: left;
}
<table>
<tr>
<th>Name</th>
<td>John Doe</td>
</tr>
<tr>
<th>City</th>
<td>Minneapolis</td>
</tr>
<tr>
<th>State</th>
<td>Minnesota</td>
</tr>
<tr>
<th>Country</th>
<td>United States</td>
</tr>
<tr>
<th>Age</th>
<td>42</td>
</tr>
</table>
我的问题是像这样的垂直 table 的可访问性如何,我最好使用 <ul>
和一些 flexbox 或网格魔法来满足我的样式要求并简单地列出数据作为清单?或许还有其他我没有考虑的选择?
表格 绝对 屏幕 reader 在编码正确时可以访问表格。您的示例(以及 W3 示例)中唯一缺少的是 <th>
的范围。您应该 始终 指定 scope
属性,以便它明确说明 table header 是针对行还是列。不要依赖浏览器或屏幕 reader 来“猜测”您遗漏 scope
的意思。
当指定 scope
时,header 的方向没有任何歧义。
<table>
<tr>
<th scope="row">Name</th>
<td>John Doe</td>
</tr>
<tr>
<th scope="row">City</th>
<td>Minneapolis</td>
</tr>
<tr>
<th scope="row">State</th>
<td>Minnesota</td>
</tr>
<tr>
<th scope="row">Country</th>
<td>United States</td>
</tr>
<tr>
<th scope="row">Age</th>
<td>42</td>
</tr>
</table>
现在,当屏幕 reader 用户导航到数据单元格时,例如“明尼阿波利斯”,然后他们使用 table 导航键(例如 ctrl+alt+downarrow), 他们会先听到行标签,然后是数据单元格值,例如“明尼苏达州”。
由于没有多人,而您列出了 key/value 对,因此 description list element 比 table 元素更合适。
The <dl>
HTML element represents a description list. The element encloses a list of groups of terms (specified using the <dt>
element) and descriptions (provided by <dd>
elements). Common uses for this element are...to display metadata (a list of key-value pairs).
dl {
display: grid;
grid-template: auto / auto auto;
justify-content: start;
column-gap: 1ch;
}
dd {
margin: 0;
}
<dl>
<dt>name</dt>
<dd>John Doe</dd>
<dt>city</dt>
<dd>Minneapolis</dd>
<dt>state</dt>
<dd>Minnesota</dd>
<dt>country</dt>
<dd>United States</dd>
<dt>age</dt>
<dd>42</dd>
</dl>
我有一些非常基本的数据,例如:
{
"name": "John Doe",
"city": "Minneapolis",
"state": "Minnesota",
"country": "United States",
"age": "42"
}
我需要这样显示:
| name | John Doe |
| city | Minneapolis |
| state | Minnesota |
| country | United States |
| age | 42 |
如您所见,上面的 table 有 headers 左对齐并且行值全部对齐。
According to W3, 做一个垂直的方法table 就像下面的代码片段,但他们也叫:
Note: Some screen readers will read “Date – Event – Venue” in the “Venue” cell because the direction of the
<th>
elements is ambiguous.
table th {
text-align: left;
}
<table>
<tr>
<th>Name</th>
<td>John Doe</td>
</tr>
<tr>
<th>City</th>
<td>Minneapolis</td>
</tr>
<tr>
<th>State</th>
<td>Minnesota</td>
</tr>
<tr>
<th>Country</th>
<td>United States</td>
</tr>
<tr>
<th>Age</th>
<td>42</td>
</tr>
</table>
我的问题是像这样的垂直 table 的可访问性如何,我最好使用 <ul>
和一些 flexbox 或网格魔法来满足我的样式要求并简单地列出数据作为清单?或许还有其他我没有考虑的选择?
表格 绝对 屏幕 reader 在编码正确时可以访问表格。您的示例(以及 W3 示例)中唯一缺少的是 <th>
的范围。您应该 始终 指定 scope
属性,以便它明确说明 table header 是针对行还是列。不要依赖浏览器或屏幕 reader 来“猜测”您遗漏 scope
的意思。
当指定 scope
时,header 的方向没有任何歧义。
<table>
<tr>
<th scope="row">Name</th>
<td>John Doe</td>
</tr>
<tr>
<th scope="row">City</th>
<td>Minneapolis</td>
</tr>
<tr>
<th scope="row">State</th>
<td>Minnesota</td>
</tr>
<tr>
<th scope="row">Country</th>
<td>United States</td>
</tr>
<tr>
<th scope="row">Age</th>
<td>42</td>
</tr>
</table>
现在,当屏幕 reader 用户导航到数据单元格时,例如“明尼阿波利斯”,然后他们使用 table 导航键(例如 ctrl+alt+downarrow), 他们会先听到行标签,然后是数据单元格值,例如“明尼苏达州”。
由于没有多人,而您列出了 key/value 对,因此 description list element 比 table 元素更合适。
The
<dl>
HTML element represents a description list. The element encloses a list of groups of terms (specified using the<dt>
element) and descriptions (provided by<dd>
elements). Common uses for this element are...to display metadata (a list of key-value pairs).
dl {
display: grid;
grid-template: auto / auto auto;
justify-content: start;
column-gap: 1ch;
}
dd {
margin: 0;
}
<dl>
<dt>name</dt>
<dd>John Doe</dd>
<dt>city</dt>
<dd>Minneapolis</dd>
<dt>state</dt>
<dd>Minnesota</dd>
<dt>country</dt>
<dd>United States</dd>
<dt>age</dt>
<dd>42</dd>
</dl>