从可访问性的角度来看,我应该更喜欢 <nav><ul><li><a-or-other-tag> 还是 <nav><a-or-other-tag>?

Shoud I prefer <nav><ul><li><a-or-other-tag> or <nav><a-or-other-tag>, from an accessibility standpoint?

通常,在书籍、教程和一些实际网页中,我看到导航栏被标记为 <nav> 元素中的 <ul> 元素中的 <li>s 元素,就像这样:

.site-nav {
  display: flex;
  justify-content: space-around;
  list-style-type: none;
  padding-left: 0;
}

.site-nav > li > a {
  border: 1px solid black;
  padding: 1em;
  text-decoration: none;
}

li { padding: 1em; } /* just for better appearance here on SO */
<nav>
  <ul class="site-nav">
    <li><a href="x">first</a></li>
    <li><a href="y">second</a></li>
    <li><a href="z">third</a></li>
  </ul>
</nav>

但是,为什么我不喜欢下面这样的解决方案,其中 <nav> 直接包含上述示例中 <li> 的所有内容?

.site-nav {
  display: flex;
  justify-content: space-around;
  list-style-type: none;
}

.site-nav > a {
  border: 1px solid black;
  padding: 1em;
  text-decoration: none;
}
<nav class="site-nav">
  <a href="x">first</a>
  <a href="y">second</a>
  <a href="z">third</a>
</nav>

我看到的一个优势是针对 <a> 链接(或我放在它们位置的任何内容,例如 <button>s)所需的特异性较低,但我仍然知之甚少HTML 了解一种或另一种解决方案的含义,尤其是在可访问性方面。

答案很简单,语义和可访问性。

如果我在没有 <ul> 和屏幕 reader 的情况下得出你的第二个示例,那么我不知道有多少链接。

如果我到达第一个正确标记的屏幕示例reader,我会听到类似“导航地标,3 项列表”的声音。

这让我知道列表中有 3 个链接,因此当我在它们之间移动时,我可以直观地看到我在导航中的位置。

HTML 标签具有(除了 divspan 等例外)语义。你需要检查它们的存在或不存在会产生什么影响。

spec.whatwg.org: 4.3.4 The nav element

你有这个例子:

<nav>
 <h1>Navigation</h1>
 <p>You are on my home page. To the north lies <a href="/blog">my
 blog</a>, from whence the sounds of battle can be heard. To the east
 you can see a large mountain, upon which many <a
 href="/school">school papers</a> are littered.
 …

所以您在 nav 元素中有完整的文本。对于盲人,屏幕 reader 将读取此文本,以便 You are on my home page. To the north lies <a href="/blog">my blog</a> 可以理解为 You are on my home page. To the north lies my blog. 以及 my blog 是 link 指向的信息博客。

最后一个例子:

<nav class="site-nav">
  <a href="x">first</a>
  <a href="y">second</a>
  <a href="z">third</a>
</nav>

你认为屏幕阅读应该如何向人呈现 nav 的内容,如句子 first second third 以及该“句子”的每个单词都是 link?这没有多大意义吧?

这就是为什么您使用 ulol 元素对 link 进行分组的原因。赋予它 first second third 不是句子而是项目列表的语义。

您可能会假设特定屏幕 reader 足够智能,可以确定您的第二个示例不包含句子。但是当网站没有引入足够的语义时,你依赖屏幕 reader 可能引入的可选行为来解决问题。