当文档大纲中的位​​置不可知时使用哪个标题级别?

Which heading level to use when position in document outline is unknowable?

我正在构建一个 HTML 片段,它将动态包含在页面上。该片段看起来像这样:

<article>
    <h2>Title</h2>
    <p>Content</p>
</article>

问题是我无法知道该片段将包含在文档大纲中的哪个位置。它可能直接出现在 <h1> 下,也可能嵌套在 <h4> 下的几层深处。换句话说,我的大纲可能是这样的:

<h1>
    <h2>
        <h3>
    <h2>
    <h2>

很符合逻辑。或者它可能看起来像这样:

<h1>
    <h2>
        <h2>
    <h2>
    <h2>

不太合逻辑。或者它甚至可能看起来像这样:

<h1>
    <h2>
        <h3>
            <h2>
    <h2>
    <h2>

奇异无比,我无法知道也无法控制!

我不关心样式,只关心语义。

我认为最好的解决方案是在所有地方都使用 <h1>s 并让分节元素根据新的 HTML5 文档大纲处理语义,但我的研究建议我反对那是因为没有客户真正支持这种概述方法。那么最好的解决方案是什么?

编辑

评论中提出了一些使用脚本解决问题的想法。这些可能有效,但我想我想知道是否有一个明智的解决方案不需要增加代码的复杂性来完成我认为浏览器应该自己做的事情。

假设,如果出于某种原因无法使用此类脚本解决方案,那么仅使用 <h1> 创建平面大纲而不是使用嵌套不当的 sub-levels 创建完全错误的大纲是否有意义?

就 HTML5 规范而言, 您可以使用任何标题元素 (h1-h6),只要因为您总是使用分段元素(例如 article)。

所有这些片段都是有效的,它们创建了相同的大纲,并且它们在语义上是等价的:

<!-- h1 + h2 -->
<body>
  <h1>heading for 'body'</h1>
  <article>
    <h2>heading for 'article'</h2>
  </article>
</body>
<!-- h1 + h1 -->
<body>
  <h1>heading for 'body'</h1>
  <article>
    <h1>heading for 'article'</h1>
  </article>
</body>
<!-- h1 + h6 -->
<body>
  <h1>heading for 'body'</h1>
  <article>
    <h6>heading for 'article'</h6>
  </article>
</body>
<!-- h5 + h1 -->
<body>
  <h5>heading for 'body'</h5>
  <article>
    <h1>heading for 'article'</h1>
  </article>
</body>

因为在这些片段中每个分节元素的标题不超过一个,所以标题元素 h1-h6 的工作方式与(经常提出的)h 元素类似:排名不没关系。

但是,像往常一样,由于各种原因,某些用户代理可能不遵循此处的规范,。如果你也想向这些 UA 传达预期的大纲,你将不得不依赖标题元素排名(就像 HTML 4.01 中的情况一样)。这就是为什么 the spec recommends to do this:

Authors should use heading rank (h1-h6) to convey document structure.

如果无法计算排名怎么办?尽可能做出最佳猜测¹,并接受不支持的 UA 的 non-ideal 大纲完整的 HTML5 大纲算法。对于支持HTML5大纲算法的UA,可以正常工作。


¹ 猜测如下:

  • 它永远不应该是 h1,因为您的代码段将是一个分节元素,所以它至少从文档中的第 2 级开始(第 1 级将始终是任何标题元素body 作为最近的分段 parent)。

  • 根据代码段的性质,低标题不太可能出现。例如,如果该片段是博客文章的评论表单,则它应该与 article 元素处于同一级别或低于它的一级(如果它嵌套在 article 中),因此通常 h2h3.

  • 如果代码段代表对用户非常重要的内容,则应使用较高的标题,因为使用较低的标题,依赖大纲进行导航的用户可能永远无法访问代码段的内容,因为它可以"hidden" 在深层大纲中,在用户可能不感兴趣的条目下方(因此他们可能会跳过整个部分及其所有 children)。