DOCTYPE 声明的历史背景
1995 年,HTML 2.0 正式发布,它是第一个正式标准化的 HTML 版本,它明确定义为标准通用标记语言(Standard Generalized Markup Language,SGML)的一个应用程序。所以,一个 HTML 文档就是一个 SMGL 文档。
SGML 是一种用于定义文档结构和内容的元语言。SGML 文档由三个部分组成:
- SGML 声明(SMGL Declaration):定义文档的具体语法,包括字符集、特征和分隔符。例如,指定标签使用
<和>,或自定义其他分隔符。这是文档的语法基础,通常放在文档开头。 - 序言(Prologue):包含 DOCTYPE 声明和 DTD(文档类型定义,Document Type Definition)。DOCTYPE 声明可以内联 DTD 或引用外部 DTD 文件。DTD 定义了文档的逻辑结构,包括允许的元素、属性和它们之间的关系。
- 文档实例(Instance):是文档的主体部分,包含实际内容,并使用 DTD 定义的元素进行标记。它从根元素开始,包含所有嵌套元素和文本。
在 HTML 文档中,SGML 声明是隐含的,所以 HTML 文档都省略 SGML 声明。一个简单的 HTML 2.0 版本的文档如下:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML>
<HEAD>
<TITLE>深入理解 HTML 中的 DOCTYPE 声明</TITLE>
</HEAD>
<BODY>
<H1>深入理解 HTML 中的 DOCTYPE 声明</H1>
<P>在 HTML5 中,DOCTYPE 的唯一目的仅仅是让浏览器使用标准模式来渲染页面</P>
</BODY>
</HTML>
直至 HTML 4.01,HTML 都是基于 SGML 编写的标记语言。
在 2014 年,HTML5 正式发布时,HTML 不再被定义为 SGML 的应用。HTML5 放弃了将 HTML 定义为 SGML 应用,明确定义了自己的解析规则,基于 XML 语法。
但 HTML5 依然需要写 DOCTYPE 声明,因为在 2000 年左右,浏览器渲染引擎将 DOCTYPE 声明作为条件判断是否使用标准模式来渲染页面。
浏览器渲染模式的历史背景
在 Web 早期(如1990年代),页面通常有两个版本:为网景(Netscape)的 Navigator 准备的版本,以及为微软(Miscrosoft)的 IE 准备的版本。当 W3C 在 1990 年代后期开始制定 Web 标准,浏览器无法直接采用新标准,否则会破坏大多数现有网站(基于非标准的浏览器行为而设计的)。因此,浏览器为了处理 Web 标准演化而采用了两种渲染模式,用来将符合新规范的网站和老旧网站区分开。
- 怪异模式(Quirks Mode):排版会模拟网景 Navigator 4 与 IE5 的非标准行为。这些网站通常不遵循 Web 标准,依赖旧浏览器的特定行为。
- 标准模式(Standards Mode):遵循现代 HTML 和 CSS 规范,确保页面在不同浏览器中一致渲染。
- 此外,还有几乎标准模式(Almost Standards Mode),实现少数怪异行为,主要影响表格单元格的高度计算。可以通过 HTML 4.01 的 Transitional 模式来触发。
对于 HTML 文件来说,浏览器使用文件开头的 DOCTYPE 声明来决定使用怪异模式或标准模式来渲染页面。
虽然 HTML5 已经不再定义为 SGML 应用了,但怪异模式和标准模式的逻辑依然存在以兼容旧网页。在 HTML5 中,DOCTYPE 声明的唯一的作用是启用标准模式。
DOCTYPE 声明的演化
HTML 2.0 (1995年)
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<!DOCTYOE HTML>指定文档类型为 HTML。PUBLIC表示 DTD 是公共的,由互联网工程任务组(IETF)维护。"-//IETF//DTD HTML 2.0//EN"是 DTD 的标识符,指向 HTML 2.0 的标准规则。
HTML 3.2 (1997年)
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
HTML 4.01 (1990年)
- 严格模式(Strict DTD):用于严格遵循 HTML 4.01 标准,不使用已废弃元素或属性的文档,促进标准合规性。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
- 过渡模式(Transitional DTD):允许使用已废弃的元素和属性,为从 HTML 3.2 向 HTML 4.01 过渡提供支持。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
- 框架模式(Frameset DTD):用于包含框架(frames)的文档,当时框架是常见的网页布局方式。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
"http://www.w3.org/TR/html4/frameset.dtd">
HTML5 (2014年)
<!DOCTYPE html>
不再需要引用 DTD,仅仅通过 <!DOCTYPE html> 告诉浏览器启用标准模式(Standards mode)渲染。
document.compatMode 查看模式
document.compatMode 返回的值可以是一个枚举值:
BackCompat:表示文档使用怪异模式渲染;CSS1Compat:表示文档使用标准模式或几乎标准模式渲染。
console.log(document.compatMode); // => "CSS1Compat"