Ответ 1
Ну, <head>
не имеет ничего общего с <header>
. В head
появляются все метаданные и прочее, а header
- это просто компонент макета.
И макет приходит в body
. Поэтому я не согласен с вами.
В настоящее время я использую вышеуказанные теги (классический порядок тегов):
<html>
<head>...</head>
<body>
<header>...</header>
<section>...</section>
<footer>...</footer>
</body>
</html>
Использование тегов и спецификации были очень жесткими в предыдущих версиях HTML (4.x), в то время как HTML5 действительно не нуждается в тегах <head>
и даже <body>
.
Итак, я бы использовал следующую структуру, которая ИМХО гораздо более семантическая, чем предыдущая.
<html>
<header>...</header> <!-- put header and footer outside the body tag -->
<body>
<section>...</section>
<section>...</section>
<section>...</section>
</body>
<footer>...</footer>
</html>
Как вы думаете?
Ну, <head>
не имеет ничего общего с <header>
. В head
появляются все метаданные и прочее, а header
- это просто компонент макета.
И макет приходит в body
. Поэтому я не согласен с вами.
Давайте получим здесь канонический ответ. Я буду ссылаться на спецификацию HTML5.
Прежде всего, 12.1.2.4 Дополнительные теги:
A
head
тег запуска элемента может быть опущен, если элемент пуст, или если первое, что внутри элементаhead
является элементом.A
head
тег конца элемента может быть опущен, если за элементомhead
не следует сразу пробельный символ или комментарий.A
body
тег запуска элемента может быть опущен, если элемент пуст, или если первое, что внутри элементаbody
не является символом пробела или комментарием, за исключением того, что первое, что находится внутри элементаbody
является элементомscript
илиstyle
.A
body
тег конца элемента может быть опущен, если элементbody
не сразу следует комментарию.
Затем 4.1.1 Элемент html:
Модель контента: A
head
, за которым следует элементbody
.
Имея указанные ограничения и строго определенный порядок элементов, мы можем легко определить, какие правила размещения неявного тега <body>
.
Так как <head/>
должен быть первым, и он может содержать только элементы (а не прямой текст), все элементы, подходящие для <head/>
, станут частью неявного <head/>
, вплоть до первого блуждающего текста или <body/>
-специфический элемент. В этот момент все остальные элементы и текстовые узлы будут помещены в <body/>
.
Теперь рассмотрим ваш второй фрагмент:
<html>
<header>...</header>
<body>
<section>...</section>
<section>...</section>
<section>...</section>
</body>
<footer>...</footer>
</html>
Здесь элемент <header/>
не подходит для <head/>
(это потоковое содержимое), тег <body>
будет помещен непосредственно перед ним. Другими словами, документ будет пониматься браузером следующим образом:
<html>
<head/>
<body>
<header>...</header>
<body>
<section>...</section>
<section>...</section>
<section>...</section>
</body>
<footer>...</footer>
</body>
</html>
И это, конечно, не то, что вы ожидали. И в качестве примечания это также недействительно; см. 4.4.1 Элемент body:
Контексты, в которых этот элемент может использоваться: В качестве второго элемента в элементе
html
.[...]
В соответствующих документах имеется только один элемент
body
.
Таким образом, <header/>
или <footer/>
будут корректно использоваться в этом контексте. Ну, они будут практически эквивалентны первому фрагменту. Но это приведет к дополнительному элементу <body/>
в середине <body/>
, который недействителен.
Как побочная заметка, вы, вероятно, путаете <body/>
здесь основную часть контента, которая не имеет определенного элемента. Вы можете найти эту страницу для других решений по получению того, что вы хотите.
Цитата 4.4.1 Элемент body еще раз:
Элемент
body
представляет основное содержимое документа.
что означает все содержимое. И верхний и нижний колонтитулы являются частью этого содержимого.
Я вижу, что вы пытаетесь сделать, вы пытаетесь использовать тег <body>
в качестве контейнера для основного содержимого страницы. Вместо этого используйте тег <main>
, как указано в спецификации HTML5. Я использую этот макет:
<!DOCTYPE html>
<html>
<head> *Metadata* </head>
<body>
<header>
*<h1> and other important stuff </h1>*
<nav> *Usually a formatted <Ul>* </nav>
</header>
<main> *All my content* </main>
<footer> *Copyright, links, social media etc* </footer>
</body>
</html>
Я не уверен на 100%, но я думаю, что что-либо вне тега <body>
считается метаданным и не будет отображаться браузером. Я не думаю, что DOM также может получить к нему доступ.
В заключение, используйте тег <main>
для вашего контента и сохраните форматирование своего HTML правильно, как в первом фрагменте кода. Вы использовали тег <section>
, но я думаю, что при попытке применить CSS возникают некоторые странные проблемы с форматированием.
Если вы действительно хотите, чтобы он выглядел более семантическим, например, с <body>
в середине, вы можете использовать элемент <main>
. Со всеми последними достижениями элемент <body>
не является семантическим, как когда-то, но вам просто нужно подумать об этом как обертке, в которой видит порт представления.
<html>
<head>
</head>
<body>
<header>
</header>
<main>
<section></section>
<article></article>
</main>
<footer>
</footer>
<body>
</html>
В соответствии со стандартом HTML модель содержимого элемента HTML:
Элемент головы, за которым следует тело элемент.
Вы можете определить элемент BODY в исходном коде:
<html>
<body>
... web-page ...
</body>
</html>
или вы можете опустить элемент BODY:
<html>
... web-page ...
</html>
Однако недопустимо размещать элемент BODY внутри содержимого веб-страницы (между другими элементами или текстовым контентом), например:
<html>
... content ...
<body>
... content ...
</body>
... content ...
</html>
Я согласен с некоторыми ответами других. Теги <head>
и <header>
имеют две уникальные и очень несвязанные функции. Тег <header>
, если я не ошибаюсь, был введен в HTML5 и был создан для повышения доступности, а именно для чтения с экрана. Он обычно используется для указания заголовка вашего документа и, чтобы работать надлежащим образом и эффективно, должен быть помещен внутри тега <body>
. Тег <head>
, поскольку он является источником, используется для SEO в том, что он создает все необходимые метаданные и тому подобное. Действительная структура HTML для вашей страницы с включенными двумя тегами будет выглядеть примерно так:
<!DOCTYPE html/>
<html lang="es">
<head>
<!--crazy meta stuff here-->
</head>
<body>
<header>
<!--Optional nav tag-->
<nav>
</nav>
</header>
<!--Body content-->
</body>
</html>
Это общая структура html-документа.
<html>
<head>
Title, meta-data, scripts, etc go here... Don't confuse with header
</head>
<body>
You body stuff comes here...
<footer>
Your footer stuff goes here...
</footer>
</body>
</html>
Несмотря на то, что теги <head>
и <body>
не требуются, элементы все еще существуют - это просто, что браузер может решить, где теги были бы из остальной части документа.
Другие элементы, которые вы используете, все еще должны находиться внутри <body>