文档类型声明去哪里了?

Where does doctype declaration go?

当我输入 <!doctype html> 时,它是否必须位于我的 html 的顶部并采用完全相同的格式?

但是,在我正在做的作业中,我需要使用而不是更改 html 代码,并且我只能添加 css 文件等。在这个 html代码,该结构对于我所见过的任何东西都是独一无二的,它看起来像这样:

<html>
<head>
</head>
<body>
    <doctype html>
    <link rel="stylesheet" ...>
    <h1>...</h1>
    ...
</body>
</html>

我了解文档类型是什么以及它的作用,而且我总是把它们放在一起,但我想知道该代码是否有效,或者浏览器是否忽略了问题并只是呈现它。

HTML <!DOCTYPE>声明

定义和用法

<!DOCTYPE> 声明必须是 HTML 文档中的第一件事,在 <html> 标记之前。

<!DOCTYPE>声明不是HTML标签;它是向 Web 浏览器发出的关于页面所用 HTML 版本的指令。

在HTML 4.01中,<!DOCTYPE>声明引用了一个DTD,因为HTML 4.01是基于SGML的。 DTD 指定标记语言的规则,以便浏览器正确呈现内容。

HTML5 不基于 SGML,因此不需要引用 DTD。

提示:请务必将 <!DOCTYPE> 声明添加到您的 HTML 文档中,以便浏览器了解预期的文档类型。

来源: http://www.w3schools.com/tags/tag_doctype.asp

W3C:

http://www.w3.org/QA/2002/04/valid-dtd-list.html

http://www.w3.org/QA/Tips/Doctype

Html 声明应该放在文件的顶部,因为它指示 Web 浏览器 我的 HTML 文档使用的是哪个版本。 HTML 标签取决于网络浏览器和我们使用的 HTML 版本。

根据此 informative but dated article,DOCTYPE 声明未正确编写或位于有效的正确位置。它实际上是 HTML 评论,而不是标签。

The <DOCTYPE> declaration must be the very first thing in your document, before the <html> tag.

它应该是 <!DOCTYPE html> 在文件顶部 html 标签上方。


就处理方式而言,

现代浏览器有一个 quirks-mode,它们试图解释不正确的书写 HTML。我不确定每个浏览器如何处理该标签,但这绝对值得关注:

  1. 标签没有关闭。所以它可能会将所有内容包裹在正文中,这会导致一些意想不到的 CSS 问题。
  2. 否则 doctype 标签将被完全忽略(这可能只是一厢情愿)

快速测试表明标签的处理方式很奇怪。它包装了其他内容.. 怎么样?嗯。奇怪:

http://jsfiddle.net/CoryDanielson/6d12grLg/

该 doctype 声明无效,至少会导致某些浏览器进入奇怪的兼容模式。

W3c(在 w3.org),在名为 html5/syntax.html 的页面上说 "a DOCTYPE is a required preamble",我认为这意味着它是必需的,并且必须先出现。

它还说它必须按顺序包含以下组件:

  1. 与字符串 <!DOCTYPE.
  2. 不区分大小写的 ASCII 匹配字符串
  3. 一个或多个 space 个字符。
  4. 与字符串 html.
  5. 不区分大小写的 ASCII 匹配字符串
  6. 可选的 DOCTYPE 遗留字符串或过时的允许 DOCTYPE 字符串。
  7. 零个或多个 space 个字符。
  8. 一个> (U+003E) 字符。

doctype 字符串需要位于开头才能生效。它对浏览器的影响是影响浏览器模式的选择,即“标准”、“几乎标准”或“怪癖”模式。当开头没有doctype字符串时,选择quirks mode。这对 CSS 的使用有相当大的影响。所以如果这是一个任务,他们要么是在耍你,要么是不称职。

规范说的是什么无关紧要(这在 SO 的旧问题的答案中有介绍)。如果您需要在问题中使用 HTML ,那么代码无论如何都是无效的(缺少 doctype 字符串,缺少 title 元素,无效的 <doctype html> 标记,以及 link 元素放置在 body) 内。然而,对于“工作”的某些值,代码是有效的,但在怪癖模式下。