是否有必要编写HEAD、BODY和HTML标记?

是否有必要编写HEAD、BODY和HTML标记?,html,tags,Html,Tags,是否需要编写、和标记 例如,我可以制作这样一个页面: <!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"> &

是否需要编写
标记

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

<!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>

页面标题
一些html
Firebug正确地将头部和身体分开:

W3C验证说它是有效的

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


是否有理由编写这些标记?

Firebug正确地显示了这一点,因为浏览器会自动为您修复错误的标记。此行为没有在任何地方指定,并且可能(将)因浏览器而异。这些标记是您正在使用的DOCTYPE所必需的,不应忽略


是每个html页面的根元素。如果您查看所有其他元素的描述,它会指出元素的使用位置(几乎所有元素都需要头部或身体)。

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

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

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

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

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

在真正的XHTML5中省略它们是无效的,尽管这几乎从未被使用过(相对于XHTML-acting-like-HTML5)


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

省略
html
head
body
标记肯定是html规范允许的。其根本原因是浏览器总是试图与现有网页保持一致,而HTML的早期版本并没有定义这些元素。当HTML2.0第一次这样做时,它是以这样一种方式完成的,即当缺少标记时会推断出标记

我经常发现,在进行原型设计时,尤其是在编写测试用例时,省略标记是很方便的,因为它有助于将标记集中在有问题的测试上。推理过程应该以您在Firebug中看到的方式创建元素,浏览器在这方面非常一致

但是

IE在这方面至少有一个已知的bug。甚至IE9也展示了这一点。假设标记是这样的:

<!DOCTYPE html>
<title>Test case</title>
<form action='#'>
   <input name="var1">
</form>
但在IE中,你会得到:

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


这个bug似乎仅限于任何文本内容前面的
表单
开始标记和任何
正文
开始标记。

与@Liza Daly关于HTML5的注释相反,该规范实际上非常具体地说明了哪些标记可以省略,以及何时可以省略(这些规则与HTML4.01有点不同,主要是为了澄清注释和空格等模糊元素的归属)

相关参考是,它说:

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

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

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

  • 如果head元素后面没有紧跟空格字符或注释,则可以省略head元素的end标记

  • 如果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>

页面标题
一些html

请注意,注释“此脚本将位于头部”实际上是作为主体的一部分进行解析的,尽管脚本本身是头部的一部分。根据规范,如果您希望这一点有所不同,则不能忽略
标记。(尽管相应的
标记仍然可以被删除)

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

它有两个效果——它使规范变得更复杂,这反过来又使浏览器作者更难编写正确的实现(如IE出错所示)

这使得规范的这些部分出现浏览器错误的可能性很高。作为网站作者,您可以通过包含这些标记来避免问题-因此,虽然规范没有说您必须这样做,但这样做可以减少出错的机会,这是一种良好的工程实践

更重要的是,最新的HTML5.1WG规范目前表示(请记住,这是一项正在进行的工作,可能还会发生变化)

如果主体元素为空,则可以省略该元素的开始标记,或者 如果body元素中的第一个元素不是空格字符或 注释,除非body元素中的第一个内容是 元、链接、脚本、样式或模板元素

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

那么这个

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

你好
...
结果script元素是body元素的子元素,但是

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

你好
将导致脚本标记成为head元素的子元素

你可以通过这样做来明确

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

你好
然后,不管你有什么
<html>
    <body>
      <script ... >
      <h1>hello</h1>
<!-- 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.