Давайте получим канонический ответ здесь. Я буду ссылаться на HTML5 спецификацию .
Прежде всего, 12.1.2.4 Дополнительные теги :
Элемент *1011* start * элемента может быть опущен, если элемент пуст или если первым элементом в элементе head
является элемент.
A head
конечный тег элемента может быть опущен, если за элементом head
сразу не следует пробел или комментарий .
A body
начальный тег элемента может быть опущен, если элемент пустой или если первое, что находится внутри элемента body
, не является пробелом или комментарий , за исключением случаев, когда первым элементом внутри body
является элемент script
или style
.
Элемент элемента *1040* end * может быть опущен, если сразу за элементом body
не следует комментарий .
Затем элемент 4.1.1 html :
Модель содержимого: элемент head
, за которым следует элемент body
.
Имея указанные ограничения и строго определенный порядок элементов, мы легко можем определить, каковы правила размещения неявного тега <body>
.
Поскольку <head/>
должен стоять первым, и он может содержать только элементы (но не прямой текст), все элементы, подходящие для <head/>
, станут частью неявного <head/>
, вплоть до первого случайного текста или <body/>
-специфичный элемент. В этот момент все остальные элементы и текстовые узлы будут помещены в <body/>
.
Теперь давайте рассмотрим ваш второй фрагмент:
<html>
<header>...</header>
<body>
<section>...</section>
<section>...</section>
<section>...</section>
</body>
<footer>...</footer>
</html>
Здесь элемент <header/>
не подходит для <head/>
(это flow flow ), тег <body>
будет размещен непосредственно перед ним. Другими словами, документ будет восприниматься браузером следующим образом:
<html>
<head/>
<body>
<header>...</header>
<body>
<section>...</section>
<section>...</section>
<section>...</section>
</body>
<footer>...</footer>
</body>
</html>
И это, конечно, не , что вы ожидали. И как примечание, это также недействительно; см 4.4.1 Элемент тела :
Контексты, в которых этот элемент может использоваться: В качестве второго элемента в элементе html
.
[...]
В соответствующих документах есть только один элемент body
.
Таким образом, <header/>
или <footer/>
будет правильно использоваться в этом контексте. Ну, они будут практически эквивалентны первому фрагменту. Но это приведет к дополнительному элементу <body/>
в середине <body/>
, что недопустимо.
Как примечание, вы, вероятно, путаете <body/>
здесь с основной частью содержимого , которое не имеет определенного элемента. Вы можете найти на этой странице другие решения, чтобы получить то, что вы хотите.
Цитата 4.4.1 Элемент body еще раз:
Элемент body
представляет основное содержание документа.
, что означает все содержание. И верхний и нижний колонтитулы являются частью этого контента.