我们都知道,在编写一个标准化网页时,第一行的文档定类型义是必须的。其缘由是,浏览器厂商为了保证标准化之后浏览器可以向后兼容,即依然可以正确解析过去没有按照标准规范编写的网页,提供了两套模式解析方案:标准模式和怪异模式。

要简单介绍这两种模式的不同之处,有一个经典的例子,就是IE框模型的解析。怪异模式下元素的宽度包括了padding和border的总和,而标准模式下不会包括它们。

所以,我们之后必须要在网页第一行写上类似这样的文档类型定义,来保证浏览器会以正确模式来解析网页:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

另外,也提一下一些细节:

  1. 就算写了文档类型定义,但是如果在文档类型定义之前出现非空格和换行字符,浏览器也会激活怪异模式。
  2. 激活怪异模式的方式有很多种,不同浏览器有不同的激活方式。但是不写文档类型定义是最通用也是最简单的一种方式。
  3. 不要认为写了文档类型定义就表示一定不进入怪异模式,因为有某些文档类型定义方式就是用来激活怪异模式的。这篇文章《Activating Browser Modes with Doctype》有详细讲解。
  4. 许多高版本的现代浏览器已经不能进入怪异模式了,这倒也不是什么坏事。

我估计很多人在之前都会和我一样有一个误区:要让网页使用标准模式来解析,必须完整一字不错地把标准模式的文档类型定义写出来。这个想法倒没有错,错的是我们还认为,如果写错了,网页可能会进入怪异模式。而事实上,浏览器只要看到了文档类型定义标签:<!DOCTYPE html>,就已经默认是标准模式(严格模式)了,然后它会继续看其他信息,如果信息正确,它会激活相应的解析模型,如果信息不正确或者索性没有下文了,那文档就会直接按照标准模式来解析。

所以,我们在编写HTML5网页的时候,用<!DOCTYPE html>来声明文档类型定义是有两层含义的:

  1. 对于尚未支持HTML5的浏览器,它无法获得具体文档类型定义,默认激活标准模式,它会按照标准模式来解析文档
  2. 对于已经支持HTML5的浏览器,它会检测到这是HTML5的文档类型声明,激活相应解析模式,使HTML5特性可以表现出来

 

参考资料

Quirks mode and strict mode

为什么使用<!DOCTYPE HTML>

DOCTYPE Switches support in Opera Presto 2.6

Mozilla's DOCTYPE sniffing