headers 列在可访问角色="grid" 设置中是否必不可少?

Are column headers essential in an accessible role="grid" setup?

目标:可访问性

目标屏幕阅读器:JAWS 和 NVDA

我正在将 role="grid" 添加到项目列表中。网格中的每一行都包含一些表示项目名称、描述等的网格单元格。我无法更改标记以使用 table,所以这就是我使用 role="grid".

的原因

我的问题第一个问题:

在我工作的上下文中,我更容易向每个网格单元添加 视觉上隐藏的 header 而不是向网格添加单独的行每列都有 header 列。 是否可以用 header 标记每个网格单元格而不是创建一行列 headers (role="columnheader")?这将如何影响屏幕阅读器的可访问性级别?用户是否总是希望网格有 header 列?

我的第二个问题:

我想包含一些不在我用 role="grid" 标记为网格行的容器内的内容。是否可以将网格容器外的内容作为网格行与网格关联?

注意:请记住,更改标记不是一种选择,因此“将其构建为 table”之类的建议在这里无济于事。

谢谢!

I cannot change the markup to use a table so this is why I am using role="grid".

如果您可以在代码中指定 role="grid",那么您似乎可以指定 role="table"。有没有不可能的原因?我问的原因是因为当实际单元格 contents 可以编辑时应保留网格,有点像电子表格。事实上,一个单元格中有一个交互元素并不意味着它应该是一个网格。所以我的第一个建议是使用 role="table".

但是,当您有一组事物时,建议使用网格 ,您可以使用箭头键导航到每个“事物”。

我猜您已经阅读了 spec for grids

it is easier for me to add a visually hidden header to each grid cell rather than adding a separate row to the grid with column headers for each column. Is it ok to label each grid cell with a header rather than creating a row of column headers

虽然您可以这样做,但您会错过真正的列和行的一些好处headers。有了基本的 <table>,这对辅助技术用户非常有帮助,例如屏幕 readers,同时拥有 <th scope="col"><th scope="row">.后者往往被忽视。

想象一下自己置身于一个巨大的 table 之中。很多行和列。您知道 table 中单元格的当前值,因为屏幕 reader 刚刚公布了它。现在您想向下导航一个单元格。如果您没有行 header,那么您将听不到下一个单元格值的任何上下文。如果您想向左或向右导航一个单元格,如果您没有列 header,那么您将听不到下一个单元格值的任何上下文。

如果您将列 header 硬编码为视觉上隐藏的元素,那么您将总是听到该列 header 为单元格 即使您垂直向下导航列。对于 screen reader 用户来说,这将是意想不到的行为。列 header 仅当您水平浏览一行而不是垂直浏览一列时才会被宣布。当您垂直导航时,应宣布第 header 行。

我并不是想在这里变得严厉,但我认为你需要回到你的声明:

it is easier for me

并决定是否易于编码比最终用户体验更重要。

如果出于技术原因您不能使用列和行 header,因为您使用的库不允许这样做或其他原因,那么作为最后的手段,您可以尝试使用视觉上隐藏的元素围绕它进行编码,但我不建议将其作为首选。

I want to include some content which is not located within the container I have marked with role="grid" as a grid row.

这有点棘手。 aria-owns 属性正是您所需要的,但通常在 child 元素不能通过正常 DOM 嵌套被 parent 拥有时使用。在你的情况下,听起来 most 的元素是根据 DOM 嵌套的,但你也会有 DOM 之外的东西。

棘手的部分是将两者混合使用。如规范中所述:

If an element has both aria-owns and DOM children then the order of the child elements with respect to the parent/child relationship is the DOM children first, then the elements referenced in aria-owns.

因此,如果首先宣布文字 DOM children,然后再宣布 aria-owns children,那么您可能会得到一些奇怪的阅读顺序。绝对值得进行一些测试。您可能必须在每一行上放置一个 ID,包括 table 之外的内容,然后使用 [=82= 的 aria-owns 中的这些 ID 的 all ] 由于 DOM.

,即使是大多数行也“自然地”归 table 所有