首发地址:http://ieun.gitee.io/blog/pages/0db06d/
文档类型
再介绍文档类型之前,我们先来看下 HTML 文件的基本结构:
<!-- 文档类型 -->
<!DOCTYPE html>
<html>
<!-- 头部信息 -->
<head>
<!-- 编码 -->
<meta charset="utf-8">
<title>我的测试站点</title>
</head>
<!-- 网页内容 -->
<body>
<p>这是我的页面</p>
</body>
</html>
其中 <!DOCTYPE html>
就是文档类型(Document Type Defination, DTD)声明。
HTML 来源于 SGML, SGML 用 DTD 来定义每一种文档类型。在 HTML5 出现之前,HTML 都是使用符合 SGML 规定的 DTD。这些复杂的 DTD 写法并没有什么实际作用(浏览器根本不会用 SGML 引擎解析它们)。因此,到了 HTML5,干脆放弃了 SGML 子集这项坚持,规定了一个简单的,大家都能记住的 DTD:
<!DOCTYPE html>
。
<!DOCTYPE html>
必须声明在 HTML 文档的第一行。
<!DOCTYPE html>
不是 HTML 标签,它是用来告诉浏览器使用哪种模式来渲染页面,以及使用什么规则来验证页面。
<!DOCTYPE html>
告诉浏览器当前页面是使用哪个 HTML 版本编写的指令,浏览器会根据不同的 HTML 版本规则来校验页面。
文档模式
上面我们说 <!DOCTYPE html>
会告诉浏览器使用使用哪种模式来渲染页面,那么一共有几种文档模式呢?
目前浏览器的排版引擎有三种文档模式:
- 怪异/混杂模式(Quirks mode):该模式是为了兼容很早之前针对旧版本浏览器的设计,并未严格遵循 W3C 标准而产生的一种页面渲染模式,浏览器用自己的方式解析代码。排版会模拟 Navigator 4 与 Internet Explorer 5 的非标准行为渲染页面;
- 接近标准模式(Almost standards mode):相较怪异模式,只有少数的怪异行为;
- 标准/严格模式(Standards mode):该模式严格按照 W3C 规定的 HTML 与 CSS 标准来渲染页面;
严格模式与混杂模式存在的意义与其来源密切相关,如果说只存在严格模式,那么许多旧网站必然受到影响,如果只存在混杂模式,那么会回到当时浏览器大战时的混乱,每个浏览器都有自己的解析模式。
这几种模式的区别主要是会影响 CSS 内容的呈现,但在某些情况下也会影响到 JavaScript 的解释执行。
声明 <!DOCTYPE html>
,浏览器会默认开启标准模式;否则,部分浏览器会使用混杂模式渲染页面(有些浏览器仍会按照标准模式来解析)。
[附录]H5前常用的DOCTYPE声明
HTML 4.01 Strict
该 DTD 包含所有 HTML 元素和属性,但不包括展示性的和弃用的元素(比如 font)。不允许框架集(Framesets)。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
HTML 4.01 Transitional
该 DTD 包含所有 HTML 元素和属性,包括展示性的和弃用的元素(比如 font)。不允许框架集(Framesets)。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
HTML 4.01 Frameset
该 DTD 等同于 HTML 4.01 Transitional,但允许框架集内容。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
XHTML 1.0 Strict
该 DTD 包含所有 HTML 元素和属性,但不包括展示性的和弃用的元素(比如 font)。不允许框架集(Framesets)。必须以格式正确的 XML 来编写标记。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
XHTML 1.0 Transitional
该 DTD 包含所有 HTML 元素和属性,包括展示性的和弃用的元素(比如 font)。不允许框架集(Framesets)。必须以格式正确的 XML 来编写标记。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
XHTML 1.0 Frameset
该 DTD 等同于 XHTML 1.0 Transitional,但允许框架集内容。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
XHTML 1.1
该 DTD 等同于 XHTML 1.0 Strict,但允许添加模型(例如提供对东亚语系的 ruby 支持)。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">