在具有可滚动内容的模态对话框中处理 tabindex 的推荐方法是什么(就 a11y 而言)?

Which is the recommended way of handling tabindex in a modal dialog with scrollable content (in terms of a11y)?

我正在使用库 micromodal.js 来处理我的(可访问的)模式对话框的功能。 阅读了有关 a11y 最佳实践的建议后,我了解到模态应获得 tabindex="-1" 以便在模态对话框中“捕获”制表符用户(或屏幕 reader)。

我使用它的模态之一有可滚动的内容部分。为了方便内容可聚焦并因此可通过箭头键滚动,我在该部分添加了 tabindex="0"。 在移动设备上,应该滚动的不是内容,而是整个模式。

此解决方案产生的问题是:在较小的屏幕上打开模式时,内容首先聚焦(我猜是由于 0 的 tabindex 大于 -1 的 tabindex?)和整个 header模态框不可见。

期望的行为是模式 header 在打开时可见。我怎样才能在提供可访问的用户体验的情况下实现这一目标?

代码示例: https://codepen.io/AstiV/pen/vYKopNZ

当前行为:

首先,您需要仔细回顾一下tabindex=0和tabindex=-1的区别。 设置 tabindex=0 意味着该元素是可聚焦的,既可以使用 tab 键手动设置,也可以通过脚本自动设置。将element设置为tabindex=-1意味着只有脚本可以设置焦点,而手动设置焦点是不可能的。

知道了这些,你应该明白自己哪里做错了。最明显的解决方案是在显示模式时使用 tabindex=-1 聚焦元素。如果出于任何原因在模式打开时让 tabindex=0 的元素聚焦更合乎逻辑,那么您可以首先聚焦 tabindex=-1 的元素,等待片刻(50-100ms),然后聚焦tabindex=0.

的元素

关于滚动,通常情况下,聚焦任何元素(使用任何 tabindex 或 none)应该自动将其置于视图中它还不可见,但如果已经可见则滚动不应该改变. 因此,即使先聚焦 tabindex=-1 的元素,然后聚焦 tabindex=0 的元素,tabindex=-1 的元素也应该保持可见。