在HTML中 doctype 有两个主要目的。
- 对文档进行有效性验证:
它告诉用户代理和校验器这个文档是按照什么DTD 写的。这个动作是被动的,每次页面加载时,浏览器并不会下载DTD 并检查合法性,只有当手动校验页面时才启用。
- 决定浏览器的呈现模式:
对于实际操作,通知浏览器读取文档时用哪种解析算法。如果没有写,则浏览器则根据自身的规则对代码进行解析,可能会严重影响HTML 排版布局。浏览器有三种方式解析HTML文档。
-
非怪异(标准)模式
-
怪异模式
-
部分怪异(近乎标准)模式
2000 年 1 月 5 日,微软发表声明要发布 「IE5 for Mac」。
我们先不要惊叹 IE 居然开发过 Mac 版本,也不要惊讶 Mac 版本的 IE2 到 IE5 存在了长达十年,更不要惊呼 IE for Mac 作为 Mac 的默认浏览器存在了五六年的时间。
以当时的眼光来说,那个时候的 IE5 非常先进,它完全实现了当时最新的 html 标准「HTML 4.0」。但是随之而来的问题是,对于一些旧的网页却不能正确的呈现(或者说,他们是被正确渲染了),那些网页是按照当时占统治地位的浏览器的渲染模式来渲染的,IE5 肯定不能就这样发布。
微软想到了一个解决方案,没错,这就是 「DOCTYPE」。使用新标准的页面可以在 之前加上 doctype 来激活新的标准模式。很快,各个浏览器都采用了这个方案,使用「混杂模式(Quirks)」和「标准模式(Standard Mode)」来进行渲染,但是实际上很多网页在使用标准模式时,却是基于某种混杂模式来写的,于是 Mozilla 1.1 创造了「准标准模式(Almost Standard Mode)」。
总结起来,混杂模式是不符合 Web 标准的模式,准标准模式是几乎要符合标准的模式,标准模式是符合标准的模式。
我们可以使用不同的 doctype 来激活不同的模式。
<!DOCTYPE html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
No doctype
除了上面这些还有非常多的 doctype 类型,而他们在不同的浏览器中又会激活不同的模式,以我的经验而言,现在最常用的就是这两个:
第一种是 html5 的 doctype,激活标准模式
<!DOCTYPE html>
第二种是 XHTML 1.0 用于过渡的 doctype,它会激活准标准模式
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
可以说,这两种 doctype 占了整个互联网页面的绝大部分,现在的网页除了第一种就是第二种。这两种 doctype 的背后也有很多故事可以讲。
什么是 XHTML
首先我们先来明确一点,什么是 XHTML?
W3C 发布了 HTML4 之后转向了 XHTML,「XHTML is the future」。XHTML 1.0 并没有在 HTML4 的基础上增加新的特性,而是用 XML 将 HTML4 进行了重写。这次重写对 HTML 进行了严格的限制,比如要使用 <br/>
而不是<br>
,要在属性值上使用双引号。而一旦遇到一个错误就要立刻停止解析,并显示错误信息。而当时的页面绝大多数都不可能满足这种严格的标准,所以开发者们也使用了这种新的语法,但是却是以 text/html 的形式来发布的。
声明自己使用的是 XHTML 1.0 的方式就是使用 doctype,
而随后发布的 XHTML 1.1 却没有得到广泛的支持,因为它只允许以 application/xhtml+xml 的形式发布,所以 WEB 开发者们就直接忽略掉了。
HTML5 的 doctype
为什么 html5 的 doctype 这么简单呢?因为 HTML5 不再是基于 SGML 的语言,而 doctype 只是用来激活模式的。
HTML5 之前,HTML 都是用 SGML 来书写的,DOCTYPE 则用来声明文档类型,它可以告诉 SGML parser 使用什么 DTD 来解析文档。所以到了 HTML5,根本就没有对应的 DTD,也就没有后面一串异常复杂的表述了。
那么,为什么 HTML5 不再是 SGML 了呢?
我想它的原因可能是这样:SGML 需要在 DTD 中定义好标签和属性,但是 HTML5 中要允许自定的标签和属性的,原来的框架太过束缚,它需要更加广大的范围来放飞自己。
什么是 SGML
它是可以定义标签语言的元语言,比如 HTML5 之前的版本都是拿 SGML 来写的。
总结
回到主题,doctype 有什么作用,它的作用就是用来激活各种渲染模式啊。
拓展链接: