辅助功能:主页导航包含h2,h1标题在下方

Accessibility: Main page navigation contains h2, h1 heading is below

考虑这个标记:

<!doctype html>
<html>

    <head>
    </head>

    <body>
        <header>
            <nav>
                <ul>
                    <li>
                        <a href="/">
                            <h2>Home</h2>
                        </a>
                    </li>
                    <li>
                        <a href="/other">
                            <h2>Other</h2>
                        </a>
                    </li>
                </ul>
            </nav>
        </header>
        <main>
            <h1>Page Title</h1>
        </main>
    </body>

</html>

这个标记“很好”,但是,如果我理解正确的话,它既不易于访问也不符合语义 correct/recommended。问题是 h2 出现在 h1 之前,这会造成令人困惑的文档大纲:

1. Untitled BODY
  1. Home
  2. Other
2. Page Title

然而,明显的预期轮廓是:

1. Page Title
  1. Home
  2. Other

实现此目的的天真的方法是将整个 nav“移动”到 [=15= 之后的某处,在 main 内部或之后。但这不是我想要我的页面的样子,我显然希望我的导航高于我的主页内容。当然,我可以使用 CSS 以某种方式将 nav 在视觉上向上移动,但这似乎也不正确。

我的问题是:对于这种“困境”,最常见但最容易获得的解决方案是什么?请注意,我绝对希望 nav 继续使用 h2(或任何其他标题级别),因为据我所知,这是推荐的“语义”方式。这样,导航链接也会显示在文档大纲中。有没有什么方法可以告诉屏幕 reader 或浏览器某些标题应该在文档大纲中“交换”位置,也许是通过某些 aria- 属性?我还缺少其他选择吗?

我想到了一个解决方案,但对我来说“感觉”不对:

<!doctype html>
<html>

    <head>
    </head>

    <body>
        <header>
            <h1>
                Page Title
            </h1>
            <nav>
                <h2>
                    Page Navigation
                </h2>
                <ul>
                    <li>
                        <a href="/">
                            <h3>Home</h3>
                        </a>
                    </li>
                    <li>
                        <a href="/other">
                            <h3>Other</h3>
                        </a>
                    </li>
                </ul>
            </nav>
        </header>
        <main>
            <h2>Main Content Title</h2>
        </main>
    </body>

</html>

这感觉有点冗长,但至少会生成正确的文档大纲。这真的是解决我问题的唯一方法吗?

https://www.accessibility-developer-guide.com/examples/headings/visually-hidden-headings/ 回答了我在这里提出的大部分问题。

事实证明,只需将您不想显示但屏幕阅读器阅读的标题移出屏幕就可以了。这样也可以实现正确的文档大纲,而不会显得冗长。

从现在开始我可能会使用的解决方案是:

<!doctype html>
<html>

    <head>
    </head>

    <body>
        <header>
            <h1 class="visually-hidden">
                Page Title
                <!-- this can also just contain a logo -->
            </h1>
            <nav>
                <h2 class="visually-hidden">
                    Page Navigation
                </h2>
                <ul>
                    <li>
                        <a href="/">
                            <h3>Home</h3>
                        </a>
                    </li>
                    <li>
                        <a href="/other">
                            <h3>Other</h3>
                        </a>
                    </li>
                </ul>
            </nav>
        </header>
        <main>
            <h2>Main Content Title</h2>
        </main>
    </body>

</html>

visually-hidden class 将被描述为:

.visually-hidden {
    position: absolute;
    left: -10000px;
    width: 1px;
    height: 1px;
    overflow: hidden;
}

标记此类内容的正确方法(在语义和可访问性方面)如下——

<header>
  <nav aria-label="Main Navigation">
    <ul>
      <li><a href="#">Home</a></li>
      <li><a href="#">About</a></li>
      <li><a href="#">Lorem</a></li>
      <li><a href="#">Ipsum</a></li>
    </ul>
  </nav>
</header>
<main>
  <h1>Page Title</h1>
  <p>Additional page content...</p>
</main>

导航项不应标记为标题。只需要一个链接列表。 See this example from the Mozilla documentation on the navigation element.

如果要为辅助技术的导航添加隐藏标签,可以将 aria-label 属性添加到 <nav> 元素,详见 this example from the W3C Accessibility Guidelines Working Group。此外,这种方法避免了需要乱序添加标题。

最后,请务必将文档标题 (<h1>) 包含在 <main> 元素中,如 this example from the Mozilla documentation on the main element.