是否需要编写HEAD,BODY和HTML标签?

是否有必要写<html><head><body>标签?

例如,我可以制作这样一个页面:

 <!DOCTYPE html> <meta http-equiv="Content-type" content="text/html; charset=utf-8"> <title>Page Title</title> <link rel="stylesheet" type="text/css" href="css/reset.css"> <script src="js/head_script.js"></script><!-- this script will be in head //--> <div>Some html</div> <!-- here body starts //--> <script src="js/body_script.js"></script> 

和Firebug正确分离头部和身体: 在这里输入图像描述

W3C验证说它是有效的。

但是我很少在网上看到这种做法。

是否有任何理由写这些标签?

HTML规范当然允许省略htmlheadbody 标签 。 其根本原因是浏览器一直试图与现有的网页保持一致,而早期的HTML版本并没有定义这些元素。 当HTML 2.0 首先,它是以一种当失踪的时候推断标签的方式完成的。

我经常发现,在原型设计时,特别是在编写测​​试用例时省略标签是很方便的,因为它有助于保持关注测试的标记。 推理过程应该按照您在Firebug中看到的方式创建元素,而且浏览器在这个过程中也是非常一致的。

但…

IE在这方面至少有一个已知的bug。 即使IE9展品。 假设标记是这样的:

 <!DOCTYPE html> <title>Test case</title> <form action='#'> <input name="var1"> </form> 

你应该(并在其他浏览器中)得到一个如下所示的DOM:

 HTML HEAD TITLE BODY FORM action="#" INPUT name="var1" 

但在IE中,你得到这个:

 HTML HEAD TITLE FORM action="#" BODY INPUT name="var1" BODY 

亲眼看看

这个错误似乎局限于任何文本内容和任何body开始标签之前的form开始标签。

Google的HTML样式指南建议省略所有可选标签。
包括<html><head><body><p><li>

https://google.github.io/styleguide/htmlcssguide.html#Optional_Tags

为了文件大小优化和可扫描性目的,考虑省略可选标签。 HTML5规范定义了什么标签可以省略。

(这种方法可能需要一个宽限期,作为一个更宽泛的指导原则,因为它与网络开发人员通常所教的内容有很大的不同。出于一致性和简单性的原因,最好省略所有可选标签,而不仅仅是一个选项。

 <!-- Not recommended --> <!DOCTYPE html> <html> <head> <title>Spending money, spending bytes</title> </head> <body> <p>Sic.</p> </body> </html> <!-- Recommended --> <!DOCTYPE html> <title>Saving money, saving bytes</title> <p>Qed. 

与@Liza Daly关于HTML5的注意事项相反,该规范实际上对于哪些标签可以省略以及什么时候(以及规则与HTML 4.01有点不同,主要是为了澄清注释和空白等不明确的元素属于哪里)

相关的参考文献是http://www.w3.org/TR/2011/WD-html5-20110525/syntax.html#optional-tags ,它说:

  • 如果html元素中的第一个内容不是注释,则可以省略html元素的开始标记。

  • 如果html元素没有紧接着注释,则可以省略html元素的结束标记。

  • 如果元素为空,或者头元素内的第一个元素是元素,则可以省略头元素的开始标记。

  • 如果头部元素之后没有紧跟空格字符或注释,则可以省略头元素的结束标记。

  • 如果元素为空,或者body元素中的第一个元素不是空格字符或注释,则body元素的开始标记可以省略,除非body元素中的第一个元素是脚本或样式元素。

  • 如果body元素之后没有注释,则可以省略body元素的结束标记。

所以你的例子是有效的HTML5,并将像这样解析,html,head和body标签隐含的位置:

 <!DOCTYPE html><HTML><HEAD> <meta http-equiv="Content-type" content="text/html; charset=utf-8"> <title>Page Title</title> <link rel="stylesheet" type="text/css" href="css/reset.css"> <script src="js/head_script.js"></script></HEAD><BODY><!-- this script will be in head //--> <div>Some html</div> <!-- here body starts //--> <script src="js/body_script.js"></script></BODY></HTML> 

请注意,“这个脚本将在头”的评论实际上被解析为身体的一部分,尽管脚本本身是头的一部分。 根据规范,如果你想要有所不同,那么</HEAD><BODY>标签不能省略。 (尽管相应的<HEAD></BODY>标签仍然可以)

在HTML4中省略它们是有效的:

 7.3 The HTML element start tag: optional, End tag: optional 7.4.1 The HEAD element start tag: optional, End tag: optional 

http://www.w3.org/TR/html401/struct/global.html

在HTML5中,完全没有“必需的”或“可选的”元素,因为HTML5语法的定义更为松散。 例如, title

在大多数情况下,标题元素是必需的子元素,但是当高层协议提供标题信息时,例如当HTML用作电子邮件创作格式时,在电子邮件的主题行中,标题元素可以省略。

http://www.w3.org/TR/html5/semantics.html#the-title-element-0

在真正的XHTML5中忽略它们是没有道理的,尽管它几乎从来没有被使用过(与XHTML-acting-like-HTML5相比)。

但是,从实际的角度来看,您通常希望浏览器以“标准模式”运行,以便呈现HTML和CSS的可预测性。 提供一个DOCTYPE和一个更加结构化的HTML树将保证更可预测的跨浏览器结果。

确实,HTML规范允许某些标签在某些情况下被省略,但通常这样做是不明智的。

它有两个作用 – 它使规格更加复杂,这反过来又使浏览器作者难以编写正确的实现(IE浏览器显示错误)。

这使得这些规范中浏览器错误的可能性很高。 作为一个网站作者,你可以通过包含这些标签来避免这个问题 – 所以虽然规范没有说你必须这样做,这样做会减少事情出错的机会,这是很好的工程实践。

此外,最新的HTML 5.1工作组规范目前说(记住这是一个正在进行的工作,可能还会改变)。

如果元素为空,或者body元素中的第一个元素不是空格字符或注释,则body元素的开始标记可以省略,除非body元素中的第一个元素是meta,link,script,style或模板元素。

http://www.w3.org/html/wg/drafts/html/master/sections.html#the-body-element

这有点微妙。 您可以省略身体和头部,然后浏览器将推断这些元素应该插入的位置。 这带来了不明确的风险,这可能导致混淆。

所以这

 <html> <h1>hello</h1> <script ... > ... 

导致脚本元素是body元素的子元素,但是这个

 <html> <script ... > <h1>hello</h1> 

会导致script标签是head元素的子元素。

你可以明确这样做

 <html> <body> <script ... > <h1>hello</h1> 

然后,无论你有第一,剧本还是H1,他们都会,可预见地出现在身体元素。 这些是在重构和调试代码时容易忽略的东西。 (比如说,你有JS正在寻找正文中的第一个脚本元素 – 在第二个片段中它将停止工作)。

作为一般规则,对事物的明确总是好于将事物置于解释之上。 在这方面,XHTML更好,因为它强制你完全明确你的代码中的元素结构,这使得它更简单,因此不太容易被误解。

所以是的,你可以忽略它们,在技术上是有效的,但这样做通常是不明智的。

Firebug正确地显示这个,因为你的浏览器自动修复了坏的标记。 这种行为在任何地方都没有指定,并且可能会(随着浏览器的不同而不同)。 这些标签是您正在使用的DOCTYPE所必需的,不应该被省略。

html元素是每个html页面的根元素。 如果你看看所有其他元素的描述,它说明一个元素可以被使用的地方(几乎所有的元素都需要头或者身体)。