【问题标题】:Proper ARIA handling of breadcrumb navigation正确处理面包屑导航的 ARIA
【发布时间】:2014-08-15 12:49:41
【问题描述】:

可以做些什么来改善类似于以下内容的面包屑菜单的可访问性:

<ul class="breadcrumbs" aria-label="breadcrumb navigation" role="navigation">
    <li><a href="~/">Home</a></li>
    <li><a href="~/news">News</a></li>
    <li class="unavailable"><a href="#">@Model.Title</a></li>
</ul>

在此示例中,Home 是站点根目录,News 是第一个子项,不可用的类是 /news/article 项的当前项。

是否可以采取任何措施来改善这一点,例如使用rel 属性或aria-level 属性?

【问题讨论】:

  • level 属性是什么?
  • @VolkerE。请参阅下面 Craig 的答案以及aria-level 的用法
  • 好的,所以它的aria-level 属性w3.org/TR/wai-aria/states_and_properties 和HTML rel 属性w3.org/TR/html5/links.html#linkTypes
  • 我想知道无序列表在语义上是否最好?!如果您遵循树状结构。面包屑中有一个订单。还有一点,在树列表之前为屏幕阅读器添加一些内容可能会有所帮助,例如“你在这里:”。

标签: html accessibility breadcrumbs wai-aria


【解决方案1】:

我会避免使用aria-level,而是使用&lt;ol&gt; 元素。最好避免在存在本地替代方案的地方使用 aria 属性。使用 aria 增加了一层额外的复杂性。简单的 HTML 要好得多,并且已经具有向 AT 显示的语义。这是first rule of ARIA

借用WAI-ARIA-Practices document,面包屑看起来像这样:

<nav aria-label="Breadcrumb" class="breadcrumb">
    <ol>
      <li>
        <a href="../../">
          WAI-ARIA Authoring Practices 1.1
        </a>
      </li>
      <li>
        <a href="../../#aria_ex">
          Design Patterns
        </a>
      </li>
      <li>
        <a href="../../#breadcrumb">
          Breadcrumb Pattern
        </a>
      </li>
      <li>
        <a href="./index.html" aria-current="page">
          Breadcrumb Example
        </a>
      </li>
    </ol>
</nav>

一些注意事项:

  1. 将面包屑包裹在 &lt;nav&gt; 元素中,让屏幕阅读器用户可以快速找到并跳转到面包屑。
  2. 使用&lt;ol&gt; 元素向屏幕阅读器用户显示订单。
  3. &lt;ol&gt; 应该是&lt;nav&gt; 的子代。一些实现将role="nav" 应用于&lt;ol&gt; 本身。这是错误的,将覆盖默认的&lt;ol&gt; 语义。
  4. aria-current 通知屏幕阅读器用户这是当前页面。如果当前页面的最后一个面包屑不是链接,aria-current 属性是可选的。

【讨论】:

  • 不能否认这是截至 CURRENT_YEAR 的绝对官方答案。
  • 这是这个问题的最佳解决方案。但不要忘记的一件事是如何设置分隔符的样式并确保它们不会被屏幕阅读器用户宣布。你可以看到full example of the breadcrumbs pattern
【解决方案2】:

从使用屏幕阅读器到阅读this blog postrel 属性不会对 A.T. 产生影响。至于使用aria-level,放在锚标签上就可以了。我还建议将列表包装在 nav 元素中,出于语义目的,并在您不需要时无需在列表中放置导航角色。

我最终使用了这个标记,因为我认为它是一个不错的面包屑。使用 CSS 隐藏子弹(恐怕我没有停下来这样做),我会说它很好。

<nav aria-label="breadcrumb" role="navigation">
  <ul>
    <li><a href="#" aria-level="1">Home</a></li>
    <li><a href="#" aria-level="2">News</a></li>
  </ul>
</nav>

希望这会有所帮助!

【讨论】:

  • 感谢您的反馈克雷格。我没想过将ul 包装在nav 中。我曾认为水平是相关的,但不确定它到底在哪里。根据stackoverflow.com/questions/14180785/…,这似乎建议始终使用&lt;nav role="navigation"
  • 感谢您指出这一点。好的,这是一个非常有趣的阅读。我会修改我的答案来做到这一点,因为它将涵盖所有基础。不确定它是否矫枉过正,但至少对 Firefox 中的 NVDA 没有影响。
  • 您对当前页面的最后一个链接有什么想法吗?它应该对读者隐藏吗?它应该有一个咏叹调吗?
  • 嗯,不知道有没有具体的答案。按照惯例,我猜大多数 A.T 用户会习惯它根本不是链接,而只是纯文本。或者,另一个答案是将 aria-disabled="true" 放在锚点上,这样他们就知道它不可点击。我认为任何一个都足以解释。
  • W3C 验证器说带有aria-level 的元素缺少role 属性。
【解决方案3】:

你可以像下面这样使用

<nav role="navigation"  aria-label="breadcrumbs">
    <p id="breadcrumblabel">You are here:</p>
    <ol id="breadcrumb" aria-labelledby="breadcrumblabel">
        <li><a href="index.html" title="Home">Home</a></li>
        <li><a href="products.html" title="Menu1">Menu1</a></li>
        <li><a href="shoes.html" title="Menu2">Menu2</a></li>
    </ol>
</nav>

【讨论】:

  • 你不需要将角色属性应用到&lt;nav&gt;,因为它在语义上已经合适了。
  • @RalphDavidAbernathy,虽然在理想情况下不需要该角色,因为它是隐含的,但某些浏览器不会正确处理 nav 元素,因此应使用 aria 角色以清楚起见。
  • 这是一个很好的解决方案。但我认为You are here: 部分应该是&lt;h2&gt;,以便将标题添加到文档大纲中。
【解决方案4】:

在网上搜索可访问面包屑的彻底解决方案时,@Craig Brett 的解决方案乍一看似乎不错。但是在阅读了几个来源之后,aria-level 似乎在那里被滥用(除了 W3C 验证问题,请参阅我上面的评论)。
因此,我想提出这种方法:

<nav aria-labelledby="bc-title" role="navigation">
    <h6 id="bc-title" class="vis-off">You are here:</h6>
    <a href="~/" aria-labelledby="bc-level-1">
        <span id="bc-level-1" class="vis-off">Homepage Website-Title </span>Home
    </a>
    <a href="~/news" aria-labelledby="bc-level-2">
        <span id="bc-level-2" class="vis-off">Level 2: News </span>News
    </a>
    <a href="#" aria-disabled="true">@Model.Title</a>
</nav>

在这个解决方案中,我们有一个 HTML5 分段元素 (nav),它应该 有一个标题,并且 *tada* 在那里。 vis-off 类表示仅对屏幕阅读器可用的元素。使用aria-labelledby,我是在告诉屏幕阅读器阅读该标题。

与 Chris 的解决方案相比,&lt;ul&gt;aria-level 不存在了。
如有必要,我会选择&lt;ol&gt;,因为这些物品是按order 的。最好把它去掉,否则它会在每个页面上的许多屏幕阅读器中变得非常冗长(“列表项 1……”)。
在我的理解中,aria-level 似乎在上述解决方案中被滥用。它必须child of a role attribute like f.e. role="list",并且该角色仅表示未在结构上标记的非交互式列表。
也许treeitem 的角色可能更合适。恕我直言,这是矫枉过正。

PS:我在这里没有使用BEM notation 来缩短 id 和类以提高可读性。

【讨论】:

  • 亲爱的匿名反对者。请给我一些反馈!我已经在 ChromeVox 扩展中为 Chrome chromevox.com 测试了该解决方案,这对我来说效果很好!
  • 感谢您的回答。我遇到了另一个说使用aria-label="You are here:" 而不是aria-labelledby (here) 的消息来源。你的方法比这有优势吗?
  • @Jordan 在我提出的解决方案中,我还处理了 HTML5 轮廓 w3.org/TR/html5/sections.html#headings-and-sections - 它表示每个 section,在这种情况下 &lt;nav&gt; 应该以明确的标题元素开头。虽然目前没有任何浏览器供应商实现大纲算法!所以选择哪种方式就看你自己了,我是按照现行标准的规范来的。
  • 感谢您的澄清!
  • @VolkerE。一年后回到这里,我建议删除 h6 标签并使用其他东西。由于面包屑位于页面顶部,因此使用 h6 意味着标题的使用不再符合要求。显然,这在从上到下的源排序中起作用的方式,标题标签不应该重复,并且应该始终降序。 h1 h2 h3 h2 h3 无效 h1 h2 h3 h4 h5 有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多