如何在HTML5中正确使用H1


78

以下哪种是构造页面的正确方法:

1)h1仅在header

<header>
    <h1>Site title</h1>
    <nav>...</nav>
</header>
<section>
    <h2>Page title</h2>
</section>

如果我h1仅将内部header用作网站的标题,则每个页面的h1标签内容都相同。这似乎并不十分有用。


2)h1header和中section,用于网站和页面标题

<header>
    <h1>Site title</h1>
    <nav>...</nav>
</header>
<section>
    <h1>Page title</h1>
</section>

我还看到了h1headersection标签中多次使用的示例。但是,在同一页面上具有两个标题不是错吗?此示例显示了多个标头和h1标签http://orderedlist.com/resources/html-css/structural-tags-in-html5/


3)h1仅在中section,强调页面标题

<header>
    <p>Site title</p>
    <nav>...</nav>
</header>
<section>
    <h1>Page title</h1>
</section>

最后,W3似乎建议h1在主要section元素内使用,这是否意味着我不应该在header元素内使用它?

各节可以包含任何级别的标题,但是强烈建议作者仅使用h1元素,或者对该节的嵌套级别使用适当级别的元素。


5
关于这个话题的一个有趣的话题是:iheni.com/html-5-to-the-h1-debate-rescue
Michael Jasper

Answers:


59

正如我在评论中指出的,并且您在W3C中引用的那样,h1是标题而不是标题。每个切片元素都可以具有自己的标题元素。您不能仅将h1视为页面的标题,而应将其视为页面特定部分的标题。就像报纸的首页一样,每篇文章都可以有自己的标题(或标题)。

这是一篇很好的文章。


1
得到它了。因此,可以在HTML5中多次使用h1。从文章“在HTML 5中,您可以在页面上专门标记所有“辅助”内容,例如导航,品牌,版权声明”,正确的品牌标记(徽标+网站标题)是什么?
deb

1
如您所选择的,最合乎逻辑的将是标题元素。它是对任何部分的介绍,对于您而言,也是整页的介绍。在其中,您可以使用div,nav,hgroup等对事物进行分组,或者仅保留图像本身作为元素。
罗布

2
@Rob:我的问题是,“什么定义了一个‘切片元素’它必须是一个实际的?<section><article>或其他HTML5元素,也可以是这样一个<div>带有sectioncallout上学吗?”。
tenub 2014年

1
除了@tenub文章外,nav和section是作为sectioning元素的唯一元素。您可以在此处阅读有关它的全部信息:developers.whatwg.org/content-models.html#sectioning-content-0
Rob

16

我建议h1整个使用。忘记h2通过h6

回到HTML4,使用6个标题级别隐式定义了各个部分。例如,

<body>
<h1>This is a top-level heading</h1>
<p>some content here</p>
<h2>This is the heading of a subsection</h2>
<p>content in the subsection</p>
<h2>Another subsection begins here</h2>
<p>content</p>
<h1>another top-level heading</h1>

现在有了这个section元素,您可以显式定义这些部分,而不必依靠浏览器读取不同标题级别创建的隐式部分。配备HTML5的浏览器知道,section元素内的所有内容都会在文档大纲中被“降级”。因此,例如asection > h1在语义上被视为an h2,asection > section > h1被视为an h3,等等。

令人困惑的是,浏览器仍然基于h2h6标题级别创建隐式部分,但是h2h6元素不会改变其样式。这意味着h2无论嵌套多少节,an都会看起来仍然像一个h2(至少在Webkit中)。如果您的h2标题是例如4级标题,这将令人困惑。

混合h2-h6section导致非常意外的结果。只需坚持h1,并用于section创建显式部分。

<body>
<!-- optional --><header>
    <h1>This is a top-level heading</h1>
    <p>you may optionally wrap this p and the h1 above it inside a header element.
     the header element doesn't affect the doc outline.
     the section element does, however.</p>
<!-- optional --></header>
<section>
    <h1>even though this is an h1, the browser "treats it" like an h2
        because it's inside an explicit section.
        (it got demoted).</h1>
    <p>content in the subsection</p>
</section>
<section>
    <h1>Another subsection begins here, also treated like an h2</h1>
    <p>content</p>
    <h2>This is misleading. it is semantically treated like an h3.</h2>
    <p>that is because after an h1, an h2 is demoted one level. the h1 above is
        already a "level 2" heading, so this h2 becomes a "level 3" heading.</p>
    <section>
        <h1>just do this instead.</h1>
        <p>it is treated like an h3 because it's in a section within a section.
            (It got demoted twice.)</p>
    </section>
</section>
<h1>another top-level heading</h1>

此外,你可以使用<main>元素。此元素仅包含特定于该页面的信息,并且不应包含在整个网站范围内重复的内容,例如导航链接,网站标头/页脚等。可能 <main>存在一个元素<body>。因此,您的解决方案可能像这样简单:

<header>
    <h1>Site title</h1>
    <nav>...</nav>
</header>
<main>
    <h1>Page title</h1>
    <p>page content</p>
</main>

我改变了主意。重新阅读您写的内容后,我了解您要提出的要点,但感到您的写作令人困惑;例如关于降级hx元素的观点,如果从字面上看,这是错误的,但是在大纲的上下文中,我可以看到您来自何处。
罗布(Rob)

请注意,您不能将<main>嵌套<article>中。从逻辑上讲,标记每篇文章的主要内容(例如,当整个HTML文档包含多个博客条目的呈现时,每个博客条目的主要内容)是有意义的,但这是规范所不允许的。
Mikko Rantalainen

7

但是,不要忘记可访问性问题。根据MDN的说法,“目前在图形浏览器或辅助技术用户代理中没有大纲算法的已知实现”。这意味着屏幕阅读器可能无法仅使用来弄清各部分的相对重要性<h1>。它可能需要更多的标题级别,例如<h2><h3>


因此,如果我们的重点是对SEO的可访问性,那么大纲算法和@chharvey的答案就没有意义吗?我们是否应该使用OP的方案#1,其中h1只是站点标题,而所有页面标题都是h2?
swhitmore

1
不完全是。我同意Adrian Roselli的观点,他说每页使用一个<h1>,例如页面标题而不是网站标题。因此,其内容将与<title>标签相同,但网站名称,市场营销标语等除外。文档大纲算法仍未在任何浏览器中实现。对于节标题,我使用h2。无论您将其嵌套在哪里,h1都是顶级标题。
Michael McGinnis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.