【发布时间】:2015-01-07 18:24:19
【问题描述】:
在我的网页中,我需要创建一个表,该表具有根据某些用户配置可见或隐藏的标题行。该表还需要完全可访问(具体来说,由于表可能很长,我希望读取行/列标题的快捷方式可以工作)。我只有 ChromeVox 可以测试(我会从我找到的博客文章中详细介绍与其他读者的行为)。
我当前的布局看起来和这个类似:
CSS:
.table-header-show {
}
.table-header-hide {
display: none;
}
HTML:
<table>
<!-- ${show} is used to choose the right class the user configuration -->
<thead class="table-header-${show}">
<tr>
<th>Name</th>
<th>Value 1</th>
<th>Value 2</th>
</tr>
</thead>
<tbody>
<tr>
<td>John Doe</td>
<td>Value 1a</td>
<td>Value 2a</td>
</tr>
</tbody>
</table>
当标题可见时,完全没有问题。当标题隐藏时,取决于屏幕阅读器是否读出这些标签:
- 我希望通过屏幕阅读器使用常规导航时跳过标题行*,但使用标题行来宣布列标签
- 使用 ChromeVox,第一个工作(在导航中跳过)但第二个失败(隐藏行不用于标记列)
- 再次使用 ChromeVox,将隐藏移动以声明为
style属性而不是class,使两种所需的行为都起作用 - 根据我发现的一篇博客文章,screen readers somtimes ignore
display: none是为了说出内容,有时他们不会 - 所以我不确定我是否可以依靠这种隐藏来实现我的目的(隐藏导航,用于标记)
那么,我怎样才能以跨浏览器阅读器的方式实现我想要的行为?
- AFAIK,屏幕外/1px 大小隐藏的问题(建议 here)是,如果我对标题行执行此操作,那么所有列标题将始终被读出...
【问题讨论】:
-
您是否尝试过在运行时在 JS 中根据 ${show} 的值在 document.ready() 中添加标题行
-
FWIW,我怀疑 offscreen/1px 将是您在这里最好和最可靠的选择:关键是,否则您会要求屏幕阅读器做两件相互矛盾的事情:ignore 导航时的标题,但在查找标题时尊重标题。据我了解屏幕阅读器通常如何工作,他们要么将其视为存在,要么不存在,但不是这种类型的“两者”。这确实意味着屏幕阅读器用户将可以导航一个额外的“不可见”行,而视力正常的用户看不到,但与没有标签相比,这是一个较小的问题(并且可能是有用的上下文)。
-
额外的可访问性提示:在这样的表格中,最好将每行中的初始单元格也设置为 TH - 即使您将其样式设置为看起来像常规 TD:这允许用户向下导航其他列,并在导航行时读出初始名称列。此外,将 scope="col" 放在顶部 TH 上,将 scope="row" 放在左侧 TH 上;如果没有这个,一些屏幕阅读器/浏览器组合会做奇怪的事情。
标签: html css html-table accessibility wai-aria