是否需要编写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规范当然允许省略html
, head
和body
标签 。 其根本原因是浏览器一直试图与现有的网页保持一致,而早期的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页面的根元素。 如果你看看所有其他元素的描述,它说明一个元素可以被使用的地方(几乎所有的元素都需要头或者身体)。