让我们在这里得到一个规范的答案。我会参考HTML5规范。
首先,看12.1.2.4 可选标签:
如果head
元素是空的,或者head
元素内第一件事情是一个元素,则可以省略head
元素的开始标记。
如果head
元素后面不是紧跟着空格字符或注释,则可以省略head
元素的结束标记。
如果body
元素是空的,或者body
元素内第一件事情不是空格字符或注释(除非body
元素内第一件事情是script
或style
元素),则可以省略body
元素的开始标记。
如果body
元素后面不是紧跟着注释,则可以省略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/>
(它是 流内容),<body>
标签将会紧接着放在它之前。换句话说,浏览器将会按照以下方式理解文档:
<html>
<head/>
<body>
<header>...</header>
<body>
<section>...</section>
<section>...</section>
<section>...</section>
</body>
<footer>...</footer>
</body>
</html>
然而,这绝对不是你期望的结果。需要注意的是,它也是无效的;请参见4.4.1 The body element:
可以使用该元素的上下文:作为html
元素中的第二个元素。
[...]
在符合规范的文档中,只有一个body
元素。
因此,在这种情况下,<header/>
或<footer/>
将被正确地使用。嗯,它们实际上与第一段代码片段几乎相同。但这会导致在<body/>
中间出现一个额外的<body/>
元素,这是无效的。
顺便说一下,你可能会将这里的<body/>
与内容的主要部分混淆,后者没有特定的元素。你可以查看该页面以获取其他解决方案来获得你想要的内容。
再次引用4.4.1 The body element中的内容:
body
元素代表文档的主要内容。
这意味着所有内容,包括头部和底部。
head
е’Ңbody
ж Үзӯҫзҡ„еӯҳеңЁдёҺзјәеӨұ规еҲҷеңЁHTML5дёӯдёҺHTML 4.xе®Ңе…ЁзӣёеҗҢгҖӮе®һйҷ…дёҠпјҢе®ғ们дёҺHTML 2.0дёӯзҡ„规еҲҷе®Ңе…ЁзӣёеҗҢгҖӮеҸӘжңүXHTMLдёҚеҗҢгҖӮ - Alohci