Почему для элемента заголовка HTML5 требуется тег h?

Согласно HTML5Doctor.com и другим вводным сайтам HTML5, элемент заголовка должен содержать тег h1-h6, а также другое навигационное или вводное содержимое. Однако традиционный «заголовок» на большинстве веб-сайтов состоит только из логотипа и некоторых навигационных элементов.

Многие крупные сайты, включая Facebook и Twitter, используют тег h1 для своего логотипа, что мне кажется нелогичным, поскольку логотип не является самым важным или самым информативным элементом на странице.

Тег h1 появляется в разделе контента 95% веб-сайтов, а не в разделе заголовка. Так почему же нам предписано включать тег h в заголовок? Если нужно, то почему Facebook и Twitter не используют вместо этого тег h6?


person colmtuite    schedule 17.10.2011    source источник


Ответы (3)


Вам следует взглянуть на алгоритм структуры для HTML5.

Вы, вероятно, хотите, чтобы название/логотип вашего сайта были h1.

Представьте себе небольшую веб-страницу, состоящую из заголовка страницы (логотип, название сайта, …), навигации по сайту и записи в блоге (основное содержание этой страницы):

<body>
 <!-- not using sectioning elements, for the sake of the example -->

 <header>ACME Inc.</header>

 <div class="navigation">
  <ul>…</ul>
 </div>

 <div class="content">
  <h1>Lorem Ipsum</h1>
  <p>…</p>
 </div>

</body>

Здесь единственный заголовок — h1 внутри div. Семантически это будет означать, что все содержимое этой страницы находится в рамках этого заголовка. См. план этой страницы:

  1. Лорем Ипсум

Но это было бы неверно (в семантическом плане): иерархически заголовок страницы «ACME Inc.» не является «частью» записи в блоге. То же самое касается навигации; это навигация по сайту, а не для "Lorem Ipsum".

Таким образом, заголовок сайта и навигация по сайту нужны в заголовке. Попробуем также поставить им h1:

<body>
 <!-- not using sectioning elements, for the sake of the example -->

 <header>
  <h1>ACME Inc.</h1>
 </header>

 <div class="navigation">
  <h1>Site navigation</h1>
  <ul>…</ul>
 </div>

 <div class="content">
  <h1>Lorem Ipsum</h1>
  <p>…</p>
 </div>

</body>

Лучше! Контур страницы теперь выглядит так:

  1. АКМЕ Инк.
  2. Навигация по сайту
  3. Лорем Ипсум

Но все же не идеально: все они на одном уровне, но «ACME Inc.» это то, что заставляет все веб-страницы формировать веб-сайт, в этом весь смысл, почему веб-страницы вообще существуют. Навигация и запись в блоге являются частью ACME Inc., которая представляет компанию и сам веб-сайт.

Итак, мы должны пойти и изменить заголовки навигации и записей блога с h1 на h2:

<body>
 <!-- not using sectioning elements, for the sake of the example -->

 <header>
  <h1>ACME Inc.</h1>
 </header>

 <div class="navigation">
  <h2>Site navigation</h2>
  <ul>…</ul>
 </div>

 <div class="content">
  <h2>Lorem Ipsum</h2
  <p>…</p>
 </div>

</body>

Теперь у нас есть такая схема:

  1. ACME Inc.
    1. Site navigation
    2. Лорем Ипсум

И это именно то, что содержание примера веб-страницы означает. (Кстати, это будет работать и в HTML 4.01.)

Как объяснено в ссылке, HTML5 дает нам элементы секционирования, которые играют важную роль для структуры (вместо div, который не влияет на структуру). Мы должны использовать их:

<body>

 <header>
  <h1>ACME Inc.</h1>
 </header>

 <nav>
  <h2>Site navigation</h2>
  <ul>…</ul>
 </nav>

 <article>
  <h2>Lorem Ipsum</h2
  <p>…</p>
 </article>

</body>

Контур остается прежним. Мы могли бы даже изменить h2 (внутри nav и article) обратно на h1, контур тоже остался бы прежним.

Если вам не нужен «явный» заголовок для навигации, вы можете удалить его: схема останется прежней (теперь с неявным/«безымянным» заголовком для nav). Каждый раздел имеет заголовок, независимо от того, добавите вы его или нет.

Вы даже можете изменить h1 внутри header на h6, и контур не изменится. Вы можете думать об этом заголовке как о «заголовке body».

Дополнительные замечания

  • В этих примерах элемент header не нужен. Я добавил это только потому, что вы упомянули об этом в своем вопросе.
  • Если вы хотите использовать логотип вместо текстового имени («ACME Inc.»), вы все равно должны использовать h1 и добавить img в качестве дочернего. Тогда значение атрибута alt должно давать имя.
  • Заголовок верхнего уровня не обязательно должен быть «самым важным или наиболее информативным элементом на странице». Заголовки используются не для этого. Они придают структуру/схему и «маркируют» контент с ограниченной областью действия. В этом примере вы можете предположить, что article (с заголовком внутри) является наиболее важным содержимым.
  • Если вы используете элементы секционирования каждый раз, когда это необходимо, вам больше не нужны нужны h2h6 (но вы можете использовать их для ясности или обратной совместимости).
  • Вы можете поэкспериментировать и протестировать некоторые конструкции разметки с помощью HTML Outliner: http://gsnedders.html5.org/outliner/ (в нем были неисправленные ошибки) HTML5 Outliner.
person unor    schedule 11.08.2012
comment
что я должен делать? Я не уверен, почему я нахожу все это таким запутанным. структура моей страницы следующая: <body><header><h1><img id='logo'/></h1><nav><a></a><a></a><a></a></nav></header>. Насколько я понимаю, я мог бы повторно использовать <h1> в явном разделе <nav>. тем не менее, MDN предлагает вам никогда не использовать более одного <h1>, но при этом все элементы <a></a> в навигации по сайту равноправны в моих глазах? Пример MDN заключался в использовании <h2><a></a></h2><h2><a></a></h2><h2><a></a></h2>. это правильно и не могли бы вы уточнить немного больше? - person oldboy; 15.03.2019
comment
@Anthony: Это звучит как отдельная проблема, и ее следует задавать в отдельном вопросе. Короче говоря, отдельные ссылки в nav не должны быть частями заголовка; весь nav может получить один заголовок (или несколько заголовков, если в навигации есть какая-то структура), если хотите -- это может быть h1, но (в основном для обратной совместимости) лучше использовать заголовок рассчитанный ранг, т. е. h2 в данном случае. - person unor; 15.03.2019

Не путайте «должен содержать» и «должен» содержать. Вы не обязаны иметь в заголовке что-либо, что вам не нужно, но «семантическая» цель заголовка заключается в том, что вы должны искать и размещать такие вещи в заголовке документа. Точно так же, как вы искали бы заголовок, введение или оглавление в верхней части печатной страницы.

person Rob    schedule 17.10.2011
comment
Но я бы НИКОГДА не искал название веб-страницы в шапке. Я не верю, что кто-то когда-либо смог бы. h1 всегда находится в разделе контента. Заголовок содержит логотип, слоганы и навигацию. - person colmtuite; 19.10.2011
comment
@Moppy - Тогда вам нужно прочитать спецификацию W3C, где они делают именно это: dev.w3.org/html5/spec-author-view/ - person Rob; 19.10.2011

Это гибкая, но важная концепция для SEO и базового HTML-программирования. Несмотря на то, что в этом стандарте есть место для маневра, он не сделает и не сломает ваш сайт.

Например, вы упомянули, что Facebook использует логотип вместо H1 в заголовке. Это наполовину верно, поскольку их заголовок находится внутри пары тегов h1, что делает его практически таким же, как и любой другой текст H1:

<h1><a href="https://www.facebook.com/" title="Go to Facebook Home"><i class="fb_logo img sp_-NykExE5Q03 sx_a7f409"><u>Facebook logo</u></i></a></h1>

Опять же, не совсем идеально, но они Facebook и могут делать, что хотят. С другой стороны, вы, возможно, захотите более внимательно относиться к этим рекомендациям при создании сайта.

person Eric Conklin    schedule 21.04.2015