【问题标题】:Nesting of the HTML5 nav and other semantic elementsHTML5 导航和其他语义元素的嵌套
【发布时间】:2016-09-16 01:48:42
【问题描述】:

在 HTML 中使用<nav> 元素时,应如何处理包含链接以及其他内容(例如下例中的徽标)的导航元素?

我发现自己在 <nav> 元素中包含所有内容:

<nav>      
  <div class="logo"></div>
  <div class="links">
    <a href>One</a>
    <a href>Two</a>
    <a href>Three</a>
  </div>
</nav>

但我应该只将 实际 导航元素包装在 &lt;nav&gt; 中吗? (本案例中的链接)

<div class="nav">      
  <div class="logo"></div>
  <nav>
    <a href>One</a>
    <a href>Two</a>
    <a href>Three</a>
  </nav>
</div>

这同样适用于其他一些标签,例如 &lt;time&gt;,如果它包含额外的数据:

<div class="time">
  Article posted: <time>2016-09-16</time>
</div>

<time>
  Article posted: <span>2016-09-16</span>
</time>

我不是在谈论代码的可读性,而是关于优化标记结构以利于爬虫 (SEO) 和可访问性。

编辑:徽标只是一个示例。经常有更多的内容,为了简洁,我只是以徽标为例。

【问题讨论】:

    标签: html seo accessibility semantic-markup


    【解决方案1】:

    一个 HTML 元素应该只包含与元素的定义相匹配的内容(或与元素的目的相关的内容)。

    nav element 用于“指向其他页面或页面内部分的链接”,因此不应包含徽标,除非它是指向主页的链接,或者上下文需要它(例如,参见最后一个HTML5 规范中的示例,它表明 nav 还可以包含用作链接上下文的文本。

    如果徽标(或任何其他内容)与 navyou could 中的内容“有密切关系”,请使用 aside 元素。

    time element 用于“日期、时间、时区偏移量和持续时间”,因此不应包含“已发布文章”标签。使用time,您可以标记日期,而不是任何其他内容。

    不过,这个决定并不总是一个明确的决定。考虑可能的用例(例如,消费者可以对特定元素的内容做什么)可能会有所帮助,并确定所讨论的内容是否通常用于该目的(主要基于规范)。

    【讨论】:

    • 以@unor 的time 为例:time 对辅助技术和搜索引擎没有任何特别之处。考虑在元素中使用属性为解析器(微数据)提供一些价值。例如:&lt;time datetime="2016-09-06T21:14:08+00:00"&gt;September 6, 2016&lt;/time&gt;
    • 感谢您的回答。虽然您没有具体谈到有关爬虫的问题,但我认为这暗示他们还假设我的代码遵循规范,因此偏离规范可能会导致问题?
    • @Luke:就是这个想法,是的。作者遵循规范来标记他们的内容,消费者(例如爬虫)遵循规范来构建符合标准的代理。 -- 请注意,在 Stack Overflow 上讨论爬虫喜欢/不喜欢什么是题外话(因为这将是 SEO 建议);可以在Webmasters 上提出此类问题 - 但是,通常没有太多要说的,因为它没有公开/记录爬虫的工作方式,所以,再一次,只有遵循规范并思考什么的好习惯对您的用户有好处。一个好的爬虫不应该期望作者这样做。
    • @unor 你说的很好,他们没有记录在案,所以偏离规范是不明智的。在我未来的项目中,我会牢记这一点。 PS。我没有意识到存在其他 stackexchange 站点,感谢您指出:)
    【解决方案2】:

    正如其他人所提到的,“nav”元素内的项目应该是导航链接。徽标可以点击主页,因此它可以被视为导航链接(尽管这可能有点不寻常),而其他元素(例如非链接页面标题、段落文本、日期或其他一些非导航内容) 将是无效的。

    正确使用语义 html 对于读取代码的机器技术非常重要。这适用于屏幕阅读器、SEO 爬虫甚至浏览器。正如其他人所提到的,时间元素旨在包含机器可读格式的内容 - 这样可以通过简单的点击(在某些设备/浏览器中)将其添加到用户日历中,以及作为时间宣布屏幕阅读器和其他可能利用它的技术的元素。将非日期/时间内容放在该块中将禁止该功能。在其他示例中,违反语义最佳实践将导致您的应用变得更难访问和/或对 SEO 不友好。

    这是 WCAG(Web 内容可访问性指南)涵盖的成功标准:WCAG - Using semantic elements to mark up structure

    【讨论】:

    • 感谢您的回答。关于您所说的机器可读格式,我完全理解,但是它们如何收集上下文?比如说我有&lt;time&gt;15:00&lt;/time&gt; - 如果没有补充信息,Google 怎么知道这与什么有关?
    • @Luke 很难说如果没有额外的上下文,Google 将如何知道如何处理您的时间示例,但这实际上有助于说明在整个文档中使用适当的语义将如何有助于上下文。如果您在 &lt;aside&gt; 元素中有一个事件列表,其中包含 &lt;time&gt;15:00&lt;/time&gt;,则它可能与在 &lt;article&gt; 的正文中使用相同元素的相关性较低,例如在 &lt;h1&gt; 下标签。 Google 使用您的语义来分解文档并根据您的页面上下文提供最相关的结果。编码良好的页面将受益最多。
    【解决方案3】:

    我个人认为,对于 SEO 和可访问性来说,保持与导航元素相关的导航内容会更好,这是该 html 标记的期望和使用,即使不是无效的 html 内部还有其他标记。

    为了向您提供该方法可能导致某些问题的实际示例,某些网站为无法使用鼠标的用户提供了使用 Tab 键直接跳到网页某些部分的可能性,这要感谢“跳过导航”隐藏在页面顶部的链接,http://webaim.org/techniques/skipnav/。在这种情况下,用户的期望是直接导航菜单项,但是如果在到达链接之前有额外的标记,则可能会卡住所有其他元素。

    希望对你有帮助

    【讨论】:

    • 读起来很有趣。基于此,如果您使用固定的顶部导航,您可能会受益于将其放在标记的末尾。它仍然会显示它的意图,但不会成为页面开头的屏幕阅读器的长期障碍。
    【解决方案4】:

    &lt;nav&gt; 包装器用于指定导航链接的主要块。它将接受属于“流内容”类别的任何标签。

    规范中没有明确禁止在其中放置图标,但除非徽标是可点击的链接(通常是这样),否则我建议将其留在导航标签之外。

    【讨论】:

    • 我并不是专门指其中有一个徽标,该徽标只是与导航无关的附加内容的一个示例。
    • 在这种情况下,它应该被省略/放置在
    猜你喜欢
    • 2012-12-15
    • 1970-01-01
    • 2012-08-22
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2016-10-06
    • 2015-06-20
    相关资源
    最近更新 更多