【问题标题】:Why do Bootstrap tabs have role="presentation"?为什么 Bootstrap 选项卡有 role="presentation"?
【发布时间】:2015-06-24 13:30:24
【问题描述】:

我正在开发一个从 Bootstrap 框架扩展而来的设计系统。关键目标之一是可访问性。在实现 Bootstrap 选项卡时,我看到它们将 role="presentation" 应用于其导航列表中的列表项。

所以我从 Bootstrap 模板中整理了一小块测试 HTML:

<ul class="nav nav-tabs">
  <li role="presentation" class="active"><a href="#">Home</a></li>
  <li role="presentation"><a href="#">Profile</a></li>
  <li role="presentation"><a href="#">Messages</a></li>
</ul>

<ul class="nav nav-tabs">
  <li class="active"><a href="#">Home</a></li>
  <li><a href="#">Profile</a></li>
  <li><a href="#">Messages</a></li>
</ul>

ARIA 规范说演示文稿是一个角色:

预期用途是当一个元素被用来改变外观 页面但不具备所有功能性、交互性或结构性 元素类型暗示的相关性,

在我看来,&lt;li&gt; 元素与使用无障碍设备的人具有结构相关性,因为它们会告诉您存在多少个选项卡。例如,如果您发现第三个选项卡包含您感兴趣的信息,则导航到列表并知道有三个选项卡可以让您更快地找到您想要的信息。

此外,当使用 ChromeVox 访问该测试 HTML 时,列表的公布方式相同。所以看来role并没有什么实际作用。

我已经用谷歌搜索过这个问题,但没有找到任何关于它的讨论。那么,有谁知道为什么这是 Bootstrap 框架的一部分?

【问题讨论】:

  • 如果您还没有,您可能需要查看css-tricks.com/navigation-in-lists-to-be-or-not-to-be。有一点 - 你不希望导航栏被宣布为“...列表”。此外,关于差异,您可能想要删除超链接并查看会发生什么 - 规范。表示“role=presentation 不会导致 元素中包含的内容从可访问性树中删除。”
  • 我在 ChromeVox 中尝试了一组链接与一个列表,并且可以听到不同之处。我不确定屏幕阅读器的用户更喜欢哪种方法。如果没有列表,该角色似乎更不相关,因为 ChromeVox 在任何情况下都会忽略跨度。删除超链接会失去键盘可访问性,因此会适得其反。
  • 我同意@theJBRU 的观点,即这没有意义。随着角色 tablist、tab 和 tabpane 的存在,Bootstrap 似乎决定以自己的方式使用一个在很大程度上被误解的角色(因为文档模糊)。 Bootstrap 确实使用了 tabpanel,文档说应该与其他 2 个角色一起使用。
  • Fwiw、all WAI-ARIA roles listed herepresentationdraft for 1.1 here1.0 here 中。屏幕阅读器中不会显示标记为presentation 及以下的DOM,这让我有点害怕。有点惊讶 Bootstrap 在这里使用它。
  • 所提供示例中的&lt;a&gt; 标记缺少其片段标识符。通常a 标签被哄骗在href 中使用# 将它们放在焦点顺序中,但是,如果该示例或多或少是从 Bootstrap 文档中复制的,则可能是他们使用演示角色来隐藏辅助功能 API 的后代锚点,以提供更易于访问的文档。

标签: twitter-bootstrap accessibility wai-aria


【解决方案1】:

请参阅 Marco 撰写的关于可访问标签的文章https://www.marcozehe.de/2013/02/02/advanced-aria-tip-1-tabs-in-web-apps/

他的实现在 li 上有 role="presentation" 表示“屏幕阅读器应该忽略列表项本身”,然后在链接上添加“选项卡”角色“将角色映射到预期的屏幕阅读器可识别元素类型。”

在引导可访问性项目 (https://github.com/paypal/bootstrap-accessibility-plugin/issues/59) 中的一个问题中提出的一点是(正确或错误)选项卡通常用作导航,因此始终包含角色选项卡列表和选项卡是不合适的。正如 Marco 的文章所指出的:“在许多情况下,选项卡不是适当的语义。”

顺便说一句,我们的工作并没有因为屏幕阅读器和浏览器的单独组合无法以同样的方式支持这一事实而变得更轻松。 (有关这方面的文章,请参阅这篇文章:http://john.foliot.ca/aria-hidden/

【讨论】:

    【解决方案2】:

    它主要是出于可访问性目的。 http://john.foliot.ca/aria-hidden/。您可以删除或更改“角色”

    【讨论】:

    • 我明白为什么 role=presentation 存在,我只是不明白为什么在 Bootstrap 框架中默认应用它。从我的测试来看,它似乎没有达到预期的效果。我暂时删除了它,但会继续研究。
    【解决方案3】:

    只有在&lt;ul&gt; 上也有role 时才需要&lt;li&gt; 上的role=presentation 例如&lt;ul role="tablist"&gt;.

    这是因为&lt;li&gt; 属于&lt;ul&gt;,但不属于&lt;ul role="tablist"&gt;。这样的元素不再是&lt;ul&gt;。现在它与&lt;div role="tablist"&gt; 相同 - 通过分配role,它的语义发生了变化。您可以从 Chrome 开发工具运行辅助功能审核,您将收到警告“列表项 (&lt;li&gt;) 不包含在 &lt;ul&gt;&lt;ol&gt; 父元素中。”在给定的示例中。它将无效。

    我希望澄清一下。

    你需要role吗?

    这真的取决于您是要实现 实际标签(标签由 javascript 动态切换)还是 简单导航(例如,可以添加书签和/或在新页面中打开)。视觉上两者都可以设置为相同的样式,就像选项卡一样,但在结构上,如果是简单的导航,你不应该实现任何角色 tablist、tab、tabpanel、presentation 等......只要让它们成为结构上带有链接的标准列表。

    在 tablists 上使用 role="presentation" 的参数

    此外...

    在 Bootstrap 3.4 中,他们仍然继续使用 role="presentation" https://getbootstrap.com/docs/3.4/javascript/#tabs-usage

    在 Bootstrap 4.3 中,他们决定不使用 role="presentation",我个人认为这是错误的,而且它也没有通过 Chrome 开发工具的辅助功能审核 https://getbootstrap.com/docs/4.3/components/navs/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-12
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 2022-08-21
      相关资源
      最近更新 更多