传统上,Doctype或Document Type Declaration将文档与Document Type Definition相关联。
文档类型定义是特定 XML 或 SGML 文档的标准。除了标签和属性的一般工作方式之外,XML 和 SGML 本身没有太多的模式或非常具体的规则集。您可以将 DTD 视为对特定类型文档(如 HTML、SVG 或 MathML)的规则的描述。他们说在哪里允许使用哪些标签(例如,一个html
元素必须包含一个head
元素,后跟一个body
元素)。
有 DTD 的替代品,例如今天更常用的 XML 模式。
然而,浏览器根本不使用 DTD。他们读取 Doctype 来确定呈现模式,但解析文档的规则完全嵌入到浏览器中。
这就是为什么 HTML 5 有一个 Doctype(用于确定呈现模式)但没有 DTD。
渲染模式
早期的网络浏览器漏洞百出。当新版本发布时,他们必须保持与前辈和竞争对手的兼容性。这使得修复 bug 变得非常困难,因为网站的构建依赖于它们。
为了解决这个问题,现代浏览器有不同的渲染模式(标准模式,用于根据标准渲染文档和 css,以及怪癖模式,其中浏览器模拟早期浏览器的错误,以及介于两者之间的几乎标准模式)。
选择文档类型
选择 Doctype 时需要考虑两个因素:
- 它会触发标准模式吗?(对于新页面应该是,您需要与不支持标准模式的浏览器兼容的情况在今天非常罕见)。
- 它是否支持我需要的功能?
一般来说,这意味着您应该使用 HTML 5。它是当前标准,最能反映浏览器的实际工作方式:
<!DOCTYPE html>
失败了。严格的文档类型避免了大多数应该用 CSS 处理的特性。
在XHTML 1.0中编写时,这种 Doctype 很常见:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
更多过时的功能可通过以下方式获得:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
当用HTML 4.01编写时,这个很常见:
<!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 HTML 4.01 Frameset//EN"
"http://www.w3.org/TR/html4/frameset.dtd">
请注意,以上大部分内容都有变体(例如,您可以省略 URL 并依赖公共标识符),这对标准模式的支持有影响。这篇文章包括一个广泛的列表。
关于严格文档类型与过渡文档类型的辩论
(请注意,以下内容很多, 2021 年的真实性肯定不如 2008 年的真实性)
标准传播者呼吁 Web 开发人员停止在新页面上使用 Transitional Doctype,而是使用 Strict。同样,这是一个理论和实践难以协调的案例。过渡型 Doctype 最初的希望是为遗留网站向标准合规性过渡提供一个中途站。使用过渡文档类型,对元素和属性的限制实际上是“不那么严格”,因此开发人员可以更快地在标准模式下运行他们的工作,并随着时间的推移逐步消除突出的差异。
存在争议是因为开发人员在企业环境中更改 Doctype 并不总是那么简单。中小型网站的自由开发者和制造商通常可以更轻松地确定他们的 Doctype 并进行这种转换。在高需求的基于 Web 的服务的企业生产环境中,对遗留系统和 3rd 方代码产品本身存在更复杂的依赖关系,它们本身可能在移除或重新设计的路线图上,但这些更改的执行必须是有条不紊地、循序渐进地完成。
有用的工具
W3C(万维网联盟)是一个在定义这些标准方面发挥积极作用的组织。他们在http://validator.w3.org/维护了一个有用的在线工具,用于根据他们的标准验证和验证文档。还有许多其他具有类似功能的3rd 方工具和浏览器扩展。