关于 href="#" 的辅助功能

Accessibility Regarding href="#"

我正在构建一个需要符合 WCAG 标准的站点(在 WordPress 中,用于上下文)。我有一个主导航,可以完全通过键盘导航,包括切换子菜单。

我 运行 遇到的问题是:在我的包含子菜单的导航项中,有些实际上 link 到页面,而其他人使用 href="#",因为它们包含一个子菜单,但实际上 link 不在任何地方。

通常我会在使用 href="#" 的导航项上使用 aria-label,但由于它们是自动生成的(由 WordPress)我不能这样做。

有人有什么建议吗?这甚至是相关的 WCAG 问题吗?每个 href="#" 导航项后跟一个 V 形(用于切换其子菜单),其中包含 "Toggle submenu" 的 arial-label。够好了吗?

谢谢!

编辑: 我试图回答此问题的特定任务已被搁置。解决后,我可以使用我们追求的解决方案更新此问题。我将 @slugolicious 的回答标记为首选,因为在他的评论中,他提供了一个合乎逻辑的解释,说明为什么不建议保留当前系统的不一致的顶级导航项。

我无法与 wordpress 对话,但可以评论 html 应该 应该 生成,但是生成的某些内容取决于您想要的行为。

您希望用户打开菜单并使用箭头 up/down 浏览列表,还是要他们 tab 浏览列表?

前者需要您自己管理焦点(箭头键的键盘处理程序并维护 tabindex 属性),而后者要简单得多 - 浏览器可以通过 link 处理制表符s 在菜单中。

通常,如果您的菜单用于导航,则需要后者。

对于前者(箭头键导航),应该使用菜单角色(menu, menuitem) and attributes (aria-haspopup)。当屏幕 reader 看到这些属性时,它会告诉用户使用箭头键进行导航。如果您有一个包含子菜单的菜单项,那么该菜单项应该指定 aria-haspopup。

对于后者(tab键导航),不要使用上述任何菜单角色。相反,您的菜单应该只是 link 的列表 (<ul>)(列表通常有 list-style:none)。如果您的任何列表项有子菜单,它们应该包含一个子列表(嵌套 <ul>)并且列表项应该有 aria-expanded 属性。

关于子菜单的人字形,人字形是一个单独的制表位吗?

更新 以回答@LCW 在此答案的第一条评论中提出的其他问题。

aria-expanded 在您 select 显示子菜单的元素上继续,因此在您的情况下,它将是人字形本身,至少根据我对您的描述的理解。听起来如果你 select a link 它会转到另一个页面,但如果你 select 人字形,它会在该项目下打开一个子菜单?如果是这样,那么您的代码将是这样的:

<nav>
  <ul>
    <li>
      <a>menu item 1</a>
    </li>
    <li>
      <a>menu item 2</a>
      <button aria-expanded="false">chevron</button>
      <ul style="display: none">
        <li>
          <a>submenu item 1</a>
        </li>
        <li>
          <a>submenu item 2</a>
        </li>
      </ul>
    </li>
    <li>
      <a>menu item 3</a>
    </li>
  </ul>
</nav>

V 形按钮最初有 aria-expanded="false",当您 select 编辑它时,您应该将值切换为 "true" 并取消隐藏子菜单。您可以在 Abercrombie & Fitch 购物页面 https://www.abercrombie.com/shop/us 上看到类似的例子。但是,A&F 会隐藏人字形,直到您 TAB 为止。鼠标用户永远不会看到它,因为子菜单在鼠标悬停时打开。他们的人字形上也设置了 aria-expanded

我认为 link 为空不违反 WCAG。但是,如果使用 link 的主要目的只是为了触发 JS 函数,那么对于 Screen reader 用户来说就有问题了。 SR 读取

时不会有任何区别
    <a href="#">HTML</a> vs <a href="https://www.w3schools.com/html/">HTML</a>. 

两者都将被读作 "Link HTML",因此用户希望 link 在新选项卡中打开并离开当前页面并显示相关信息。

如果不能用aria-label/aria-labelledby/aria-describedby说明link的目的 给用户,那么我建议使用(按钮)标签而不是锚标签。

听起来这里的核心问题是...如何修改 Wordpress 菜单弹出的默认 HTML 元素。

然后您可以应用您想要的任何辅助功能。

https://digwp.com/2011/11/html-formatting-custom-menus/

这是过时的,但应该为您指明正确的方向。您的主题可以通过多种不同方式放置导航。如果该指南未涵盖您的主题如何生成导航,则需要有关您的 wordpress/theme 设置的更多信息以进行进一步分析。