【问题标题】:Accordion is failing accessibility check手风琴未通过可访问性检查
【发布时间】:2021-07-14 22:18:09
【问题描述】:

我有一个使用 van11y-accessible-accordion-aria 渲染的手风琴

标记输出为:

<div className="c-accordion__items js-accordion accordion" data-accordion-cool-selectors="1" aria-multiselectable="true" role="tablist" id="z3j2diubs8r" data-hashaccordion-id="3o3nlqickh">
   <!-- note role="tablist" above -->
   <div className="c-accordion__item">
      <h2 className="c-accordion__title accordion__title">
         <button className="js-accordion__header accordion__header" role="tab" id="accordionz3j2diubs8r_tab1" aria-controls="accordionz3j2diubs8r_panel1" aria-selected="false" type="button" data-hashaccordion-id="3o3nlqickh" aria-expanded="false">
            <!-- note role="tab" above -->
            The Why
         </button>
      </h2>
      <div className="c-accordion__item-components js-accordion__panel accordion__panel" role="tabpanel"
         aria-labelledby="accordionz3j2diubs8r_tab1" id="accordionz3j2diubs8r_panel1" data-hashaccordion-id="3o3nlqickh"
         aria-hidden="true">
         <div className="c-accordion__item-content">
            <p>Duis vel nibh at velit scelerisque suscipit. Donec vitae sapien ut libero venenatis faucibus. Quisque ut
               nisi. Ut non enim eleifend felis pretium feugiat. Nulla sit amet est.
            </p>
         </div>
      </div>
   </div>
</div>

当我在 Chrome 中使用 Lighthouse 测试可访问性时,我收到了这些消息

具有 ARIA [role] 且要求子级包含特定 [role] 的元素缺少部分或全部所需的子级。 一些 ARIA 父角色必须包含特定的子角色才能执行其预期的辅助功能。了解更多。

[role] 不包含在其所需的父元素中 某些 ARIA 子角色必须包含在特定父角色中,才能正确执行其预期的可访问性功能。了解更多。

了解更多链接转到https://web.dev/aria-required-children,下面显示的是他们建议的代码示例。

... 这意味着将role="tablist" 作为父级,然后将role="tab" 作为子级。

在我在这个问题中发布的代码中,与https://web.dev/aria-required-children 中的示例相比,我似乎有正确的标记

所以我不知道为什么这没有通过可访问性检查。

【问题讨论】:

  • Lighthouse 给出的结果有些可疑。您是否尝试过 Ax 或 SiteImprove 之类的浏览器插件?在此处查看 W3C 提供的代码:w3.org/TR/wai-aria-practices/examples/accordion/accordion.html。您的示例适用于制表符,而不是手风琴,因此不适用。
  • @NathanielFlick Lighthouse 已使用 Ax 核心至少 2 年,因此结果通常有效。这曾经是一个大问题,但现在如果 Lighthouse 说有问题,那么 Axe 也会这么说(确实如此)。
  • 您尝试过 SiteImprove 吗?它也给出了很好的结果,可能是一个很好的测试。部分 Axe 核心测试已关闭:github.com/GoogleChrome/lighthouse/issues/7510

标签: testing accessibility accordion


【解决方案1】:

role="tab" 必须是role="tablist" 元素的直接后代(或包含在没有语义意义的元素中)。公平地说,这在 WAI-ARIA 规范中并不清楚,但我之前自己也遇到过这个问题。 (您可以使用aria-owns 进行关联,但如果选项卡位于tablist 元素之外,则更是如此)

因为您的 &lt;button&gt; 被包裹在 &lt;h2&gt; 中,这打破了这种模式。

我已经对其进行了测试,它似乎可以在 JAWS 和 NVDA 中工作,但为了安全起见(因为有很多屏幕阅读器,其中一些可能不喜欢你的实现)我会做一个小的调整。

删除&lt;button&gt; 周围的&lt;h2&gt; 是一种选择,可能也是我推荐的一种选择。无论如何,在一个小部件上拥有多个 &lt;h2&gt; 元素并没有多大意义,您应该在为该部分创建的选项卡上方使用一个标题。

第二个选项是让&lt;h2&gt; 函数像一个按钮,但这意味着添加您自己的事件处理程序、焦点指示器和tabindex="0" 以使其具有焦点。这样您就可以将role="tab" 移动到&lt;h2&gt; 本身上,这将删除语义,但保留在屏幕阅读器中导航到它的能力。

我个人不喜欢第二种选择,但我明白为什么有些人会选择这样做。

我建议的另一件事是将tabstabpanels 放在&lt;ul&gt;&lt;li&gt; 中。

对于不支持tablist 的屏幕阅读器,这意味着用户仍会收到“3 个选项中的一个”等通知。因此更容易理解他们有选项。

此外,建议每个tabpanel 都有一个tabindex="0",以便在选择选项卡后帮助导航。这是鼓励非交互式元素可聚焦的极少数情况之一。

您可能会发现this W3 page on tab best practices 很有用。

【讨论】:

  • 感谢您非常彻底的回答,我真的很感激。我现在对我需要做的事情有了更好的了解。
  • 根本不是问题,很高兴它有帮助!祝项目顺利!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多