简而言之,HTML5规范允许我们使用多个h1
元素。然而,关于此功能存在相当大的争议,有两个主要原因是为什么不使用它。
1。 SEO:主要是可疑的声称搜索机器人不支持它,而未经证实的声称它会“混淆”它们。但是,让我们将这种推测推迟到其他帖子。
2。用户代理不支持它:不幸的是,这背后的推理似乎不如SEO声明。
Sections and Outlines of an HTML5 Document的MDN文章提供了以下警告:
重要提示:目前在图形浏览器或辅助技术用户代理中没有已知的轮廓算法实现,尽管该算法是在其他软件中实现的,例如一致性检查器。因此,不能依赖轮廓算法将文档结构传达给用户。建议作者使用标题等级(h1-h6)来传达文件结构。
但它不像使用新文档大纲结构的文档不起作用。为了亲自了解浏览器的反应,我创建了一些使用多个独立文章在同一页面上的样本。
HTML4:
<!DOCTYPE html>
<html>
<head>
<title>Outline HTML4</title>
</head>
<body>
<div>
<h1>Section List</h1>
<div>
<h2>Alpha</h2>
<p>Alpha is the first letter of the greek alphabet.</p>
<h3>Subheading</h3>
<p>This is just filler.</p>
</div>
<div>
<h2>Beta</h2>
<p>Beta is the second letter of the greek alphabet.</p>
<h3>Subheading</h3>
<p>This is just filler.</p>
</div>
</div>
</body>
</html>
HTML5:
<!DOCTYPE html>
<html>
<head>
<title>Outline HTML5</title>
</head>
<body>
<main>
<h1>Section List</h1>
<section>
<h1>Alpha</h1>
<p>Alpha is the first letter of the greek alphabet.</p>
<h2>Subheading</h2>
<p>This is just filler.</p>
</section>
<section>
<h1>Beta</h1>
<p>Beta is the second letter of the greek alphabet.</p>
<h2>Subheading</h2>
<p>This is just filler.</p>
</section>
</main>
</body>
</html>
我看到的唯一可能的视觉问题是浏览器可能会将所有h1
标记渲染为相同的大小,但Firefox和Chrome的默认用户代理样式目前会缩小{{1}的大小标记h1
,article
,aside
和nav
标记(似乎表示浏览器执行识别此功能)。另外,我们在识别第二个section
标题意味着最后h2
部分的结尾时没有任何问题,所以我认为没有任何理由我们会遇到多个{{1}的视觉问题标签。
虽然我不能代表那些依赖屏幕阅读器的人喜欢浏览网页,但Apple的VoiceOver确实能够正确识别每个标题级别。
我的问题是,图形浏览器或辅助技术必须做什么完全才能“支持”他们尚未做过的大纲?
答案 0 :(得分:4)
以Jaws屏幕阅读器为例: http://webaim.org/resources/shortcuts/jaws#headings
它提供了转到同一级别的下一个标题的快捷方式。但添加了HTML5 section
和article
标记。这需要采取一些预防措施。
当你有这样的代码时:
<h1>Main title</h1>
<h2>sub part 1</h2>
<section>
<h1>first section inside sub part 1</h1>
<h2>subpart inside first section of sub part 1</h2>
</section>
<h2>sub part 2</h2>
如果您目前正在关注h2
&#34;子部分1&#34; 并按下2
键,您可能会转到 &#34;子部分2&#34; (即同一级别的下一个标题),但辅助技术将引导您进入DOM阅读顺序中的下一个h2。
出于这个原因,你应该尊重整个文档中标题的层次结构,好像没有任何部分(即使它尊重HTML5)。
现在,您可以完美地想象h1
中有两个body
,但您希望有一些方法可以在不依赖title
标记的情况下阅读当前页面的标题可以包含一些其他元素,如网站名称,网站中的类别/层次结构。因此,您应该只在h1
元素中使用一个body
元素作为当前页面的标题。
答案 1 :(得分:3)
造型修改非常肤浅。你可以在下面的例子中看到,对h1&#34; gamma&#34;的h2子标题。标题以比#34; h1&#34;更大的字体呈现。伽玛标题本身。
<!DOCTYPE html>
<html>
<head>
<title>Outline HTML5</title>
</head>
<body>
<main>
<h1>Section List</h1>
<section>
<h1>Alpha</h1>
<p>Alpha is the first letter of the greek alphabet.</p>
<h2>Subheading</h2>
<p>This is just filler.</p>
<section>
<h1>Gamma</h1>
<p>Gamma is the third letter of the greek alphabet.</p>
<h2>Subheading</h2>
<p>This is just filler.</p>
</section>
</section>
<section>
<h1>Beta</h1>
<p>Beta is the second letter of the greek alphabet.</p>
<h2>Subheading</h2>
<p>This is just filler.</p>
</section>
</main>
</body>
</html>
&#13;
在我看来,浏览器需要从大纲算法中计算每个元素的切片级别,然后通过CSS伪类公开它 - 例如div:level(3)
或:matches(h1, h2, h3, h4, h5, h6):level(4)
或仅:level(2)
,并通过JavaScript将其公开为元素状态,例如if (document.getElementById("myElement").level == 4) { ... }
答案 2 :(得分:2)
但它不像使用新文档大纲结构的文档不起作用。
为什么它不起作用?它们只是HTML元素,并且包含多个h1
标记完全在浏览器呈现容量范围内。
正如您所提到的,需要考虑的问题是样式。除非您调整不同h1
的样式,否则它们可能共享相同的视觉特征,例如大小。
我的问题是,图形浏览器或辅助技术必须做什么完全才能“支持”他们尚未做过的大纲?
用户代理呈现HTML代码。如前所述,浏览器可以轻松呈现多个h1
和depending on implementation HTML5元素。
然而,outline是另一回事。大纲基本上是DOM中的部分列表。通常,这个大纲可以用有用和有益的方式呈现给用户。
使用此HTML outlining tool,我打了 http://www.dell.com ,它生成了一个干净,有条理的网站大纲。
您突出显示的警告是,HTML5 大纲算法未得到广泛支持,无法传达类似的有用结果。
目前在图形浏览器或辅助技术用户代理中没有已知的轮廓算法实现,尽管该算法是在其他软件中实现的,例如一致性检查器。 因此,不能依赖大纲算法将文档结构传达给用户。 建议作者使用标题等级(h1-h6)来传达文档结构。 (强调我的)
这并不意味着代码不起作用,只是在语义上它可能很弱和/或无用。
更多信息:
答案 3 :(得分:0)
浏览器需要支持哪些HTML5文档大纲?
根据Outlines in HTML5 - A vocabulary and associated APIs for HTML and XHTML浏览器,需要支持分区内容和分割根元素。
警告只表示到目前为止(发布之日)文档编辑器未知任何实现。