显示模式时出现“aria-hidden elements do not contains focusable elements”问题

2023-11-29

我在用着反应模态在我的应用程序中,当它打开时运行斧头辅助工具给出以下错误:

aria 隐藏元素不包含可聚焦元素

这是因为 React 模态添加了一个aria-hidden="true"到应用程序的根元素(我的所有应用程序组件都在 div 下呈现,但不是模态),但它不会更新选项卡索引或禁用每个可聚焦元素。

然而,React 模式会捕获键盘焦点,因此用户无法跳出模式并单击背景关闭模式。

所以我的问题是:

这实际上是我需要解决的问题吗? 或者这是一个误报,因为该工具不了解模态捕获焦点?

如果确实需要修复此问题,那么我唯一的选择是手动更新选项卡索引或禁用每个可聚焦元素吗?

模式打开时的 HTML 看起来有点像这样:

<div data-react-modal-body-trap="" tabindex="0" style="position: absolute; opacity: 0;"></div>
<div id="root" aria-hidden="true">application content</div>
<div class="ReactModalPortal">
    <div class="ReactModal__Overlay ReactModal__Overlay--after-open modal-overlay-6fODnA">
        <div tabindex="-1" role="dialog">modal content</div>
    </div>
</div>

简答

Adding aria-modal添加到您的模态将删除此警告。

长答案

我花了一段时间才意识到为什么我们的模态没有此警告,但您的模态却有此警告,因为我们采用了类似的标记。我们使用aria-modal我们模态上的属性。

Axe 已更新,预计aria-modal模态上的属性。aria-modal has 平均支持率目前,这是一个很好的做法,因为它可以防止开发人员的错误(因为尊重它的屏幕阅读器/浏览器组合会自动为您捕获焦点!)。

隐藏模态之外的项目

真正隐藏所有内容的唯一方法是添加tabindex="-1"到每一个互动项目。

然而实际上,如果您使用 JS 函数添加tabindex="-1"每个交互元素都会遇到问题并且无法成功恢复tabindex或将其删除。这意味着您使页面的某些部分完全无法访问!

显然,在 POUR 的“稳健”部分,您将无法通过 WCAG。请不要这样做。

最好的折衷方案是使用aria-hidden on the <main> and <aside>容器(任何顶级容器)。然后使用aria-modal在您的模式上,因为这会将焦点集中在某些浏览器/屏幕阅读器组合中。那个组合aria将提供最高覆盖率的浏览器支持。

最后,您应该管理使用的人的焦点tab钥匙。这是我们的备份,以防上述方法失败以及不使用屏幕阅读器的人(即无法使用鼠标的灵巧性或准确性问题的人)。

如果您需要有关如何在模式中捕获选项卡焦点的信息,我将提供一个代码示例,但它非常简单。

管理 Tab 键焦点不会阻止屏幕阅读器用户或行为不当的插件超出模式(如果其他方法失败)但相信我,如果他们在您实施上述措施后对您的网站出现问题,他们将在其他网站上遇到更大的问题。

惰性——你的弓上还有一根弦?

最后作为另一个备份我们添加inert到我们模式之外的项目。支持不是很好,但每一点都有帮助!

如果你愿意,你可以填充它,但我认为它还没有超出草案规范,所以我们只是按原样使用它。

它纯粹是作为另一个附加项存在,并(希望)为我们的遗留应用程序提供未来证明inert是一个非常需要且易于理解的属性。它阻止屏幕阅读器访问项目而不改变视觉设计(基本上aria-hidden但作为标准属性,其优点是它可以有效地从可访问性树中删除所有子项。)

Example

尝试删除aria-modal="true"从以下示例开始,运行 Axe 时,将返回警告。

<main aria-hidden="true" inert><a href="https://google.com">test</a></main>
<div class="modal" aria-hidden="false" aria-modal="true">
    <label for="iTest">input test</label>
    <input id="iTest"/>
</div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

显示模式时出现“aria-hidden elements do not contains focusable elements”问题 的相关文章

随机推荐

  • 无法在 Angular 6 中添加 Bootstrap 4

    当我尝试添加最新的引导程序版本时遇到问题 npm install bootstrap 之后 当我尝试运行它时收到一条错误消息 ng serve open 我在 angular json 中添加 Bootstrap 像这样 styles no
  • Xamarin Forms PopAsync 崩溃

    我用 PCL 构建了一个 Xamarin 表单应用程序 应用程序有时会崩溃await Navigation PopAsync 我找到了这个https forums xamarin com discussion 62414 app resum
  • 通过分隔符将 T-SQL 字符串拆分为列?

    我有一个表 其中有一列使用连字符分隔的八个值集 其中一些为空白 我试图将此字符串拆分为列 每个值对应于分隔字符串的位置 Table1 Record StringValue rec1 422100 130 1034 10901 12000 r
  • 如何查看活动的 SQL Server 连接?

    我正在使用 SQL Server 2008 Enterprise 我想查看任何活动的 SQL Server 连接 以及所有连接的相关信息 例如来自哪个 IP 地址 连接到哪个数据库等等 是否有现有的命令可以解决这个问题 SELECT DB
  • 如何使用分类轴在条形图上叠加数据点

    Goal 我正在尝试使用 Seaborn 在带有多个分组条形图的图中显示各个数据点 Problem 我尝试使用条形图的猫图和各个数据点的猫图来完成此操作 但是 这会生成 2 个数字 一个包含条形图 另一个包含各个数据点 问题 有没有办法使用
  • 如何制作非矩形Winform?

    我正在使用下面的代码来更改 winform 的形状 它正在改变形状 但不是我想要的那样 我需要表格有弯角 我应该使用什么积分来获得它 public void MakeNonRectangularForm var p new Graphics
  • ms-access加载数据问题

    我有一个非常复杂的表格 如下所示 替代文本http img9 imageshack us img9 2465 test2xk jpg 然而 我的数据库中总共只有 8MB 的数据 它的工作方式是用所有记录名称一直填充左侧的列表框 当您滚动记录
  • 使用 SCALER_CROP_REGION 裁剪时 Camera2 预览会拉伸

    我想在以下位置显示预览全屏使用camera2 API 我选择的相机尺寸是4160x3120 16 9 我的屏幕是1080x1920 9 16 因此 如果我希望预览正确缩放 我必须裁剪相机输出 Rect zoomCrop new Rect 0
  • C4 保存图像的一部分

    嘿 我浏览了保存图像的示例 然后我只想保存屏幕的一部分 我设法保存从图像左上角开始的部分 但实际上我想保存屏幕的中心 仅保存图像的一部分的神奇之处在于设置具有特定大小的图形上下文 如下所示 UIGraphicsBeginImageConte
  • 从绑定项获取 ItemsControl 内的 DataGrid

    我有一个 ItemsControl 在其模板中使用 DataGrid 如下所示
  • Java正确处理异常

    对JAVA或异常处理不太熟悉 寻求一些关于什么是可以接受的 什么是不受欢迎的建议 该场景 我正在构建一个生命游戏程序 我设置了条件来检查单元格是否超出范围 并且不尝试访问该 单元格 我的问题是 使用 try catch 块代替 8 个条件是
  • 相对于页面上滚动位置的视觉计数器

    对于一个项目 我必须使用 html 和 javascript 制作一个可视计数器 相对于窗口的滚动位置从 150 倒数到 0 我不完全确定我应该如何去做这件事 但这是我到目前为止所拥有的 HTML span class meterCount
  • Nginx 位置指令中子目录的正则表达式或通配符

    我的开发人员将在本地计算机上编辑多个 Wordpress 站点 我想为他们设置一次 Nginx 而无需他们将来编辑配置文件 通常 当 Nginx 配置为托管 Wordpress 时 会包含如下位置块 location try files u
  • file_put_contents() 在尝试导出图像时发出错误

    我通过将多个图像复制到新图像中来创建图像 在程序的最后一步中 我尝试将此文件导出到文件夹中 代码如下
  • 获取互斥体后调用await操作[重复]

    这个问题在这里已经有答案了 如何使用写入文件await FileIO WriteTextAsync 在 Windows Phone 8 1 中 获取后mutex这样就不会有两个线程访问同一个文件并确保互斥 我正在执行以下操作 mutex W
  • jQuery Mobile Cordova (Phonegap) 在每个页面底部留下空白

    对于我的每个 jQm 页面 每个页面的底部似乎都有一些空白 并且它无缘无故地添加了滚动行为 我已附上屏幕截图 这种不必要的滚动行为给我带来了很多麻烦 我检查了firebug中的页面 似乎jQm正在添加 min height 213px 到页
  • 不带正则表达式的 String.replaceAll

    我想替换字符串中子字符串的所有实例 但是String replaceAll 只接受一个模式 我从上一场比赛中获得的字符串 是否可以将转义添加到我拥有的模式中 或者是否有一个版本replaceAll 在另一个接受文字字符串而不是模式的类中 只
  • Matlab uint8 稀疏

    在 Matlab 中创建稀疏矩阵时 您似乎可以创建一个填充逻辑数或双值数的稀疏矩阵 在阅读周围内容时 我了解到 Matlab 不支持其他类型的稀疏矩阵 即uint8或其他整数 在我的应用程序中我知道max values 16 而记忆是至关重
  • 如何让文字接触到div的底部

    我有一个包含较大文本元素的 HTML 页面 我希望文本与包含的 div 的底部对齐 以便它接触到 div 的底部 我尝试跟随 但文本和底部之间仍然有一些空格 有什么方法可以删除这个空格并使文本接触底部吗 Here是我尝试过的活生生的例子
  • 显示模式时出现“aria-hidden elements do not contains focusable elements”问题

    我在用着反应模态在我的应用程序中 当它打开时运行斧头辅助工具给出以下错误 aria 隐藏元素不包含可聚焦元素 这是因为 React 模态添加了一个aria hidden true 到应用程序的根元素 我的所有应用程序组件都在 div 下呈现