35

正如标题所描述的,有哪些不同的文档类型可用,它们是什么意思?我注意到当我从 IE7 切换时布局看起来有点不同

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >

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

还有其他的吗?有什么影响或后果?

谢谢!

4

6 回答 6

54

传统上,DoctypeDocument 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 方工具和浏览器扩展。

于 2008-11-01T03:23:52.170 回答
7

浏览器不在乎您使用什么文档类型(嗯,几乎是真的),它们只将它用于一件事且仅一件事:决定使用哪种渲染模式。请参阅例如FxOpera 文档,了解有关使用哪些算法来决定使用哪种模式的真实示例(我想在 MSDN 的某个地方也有一些 IE 文档...... [这可能是正确的页面](http ://msdn.microsoft.com/en-us/library/ms535242(VS.85).aspx),我不知道,抱歉)。

然而,大多数浏览器有两种主要模式(一些浏览器也有几乎标准模式):

  • 怪癖模式(当没有找到“正确”的文档类型时使用,从浏览器的角度来看是“正确的”):尝试像某些旧版本的 IE 那样渲染文档(最重要的区别之一,即最影响渲染, 是某些浏览器在这种模式下利用了IE 框模型的 bug ),
  • 标准模式(当浏览器发现它认为正确的文档类型时使用):尝试按照标准所说的那样做。

您可以在前面提到的浏览器中使用(非标准)document.compatMode属性来检查用于呈现当前文档的模式。

(关于 XHTML 的注意事项:我假设您将文档作为 HTML ( text/html) 提供,如果您将文档作为 XHTML 提供(可能application/xhtml+xml)大多数浏览器会直接跳转到标准模式并且根本不关心文档类型 AFAIK。)

顺便说一句:另一个答案中的建议(或看起来像建议的内容)已损坏,过渡性DTD 不应用于新文档。始终使用严格(术语“严格”有点误导,应该是“默认”或其他不可怕的东西),句号:

作者应尽可能使用 Strict DTD,但在需要支持表示属性和元素时可以使用 Transitional DTD。- HTML 4.01:22 过渡文档类型定义

我们建议作者编写符合严格 DTD 而不是本规范定义的其他 DTD 的文档。-- HTML 4.01: 4 一致性:要求和建议

并且有很多关于此的博客文章,例如,请不要再使用过渡文档类型(从 2006 年开始,但有些显然仍然存在问题:)。

这篇文章一开始指出浏览器不在乎你选择什么,然后发展成为关于如何选择正确的 DTD 的咆哮,很有趣……但是如果你要花费(/浪费?)时间和精力要选择 DTD,您不妨选择正确的 DTD(从 HTML 4.01 标准的角度来看)。

或者,您可以忽略所有这些并使用以下命令无论如何

<!doctype html>

这个回答“有什么理由不开始使用 HTML 5 doctype?”与最后一部分有关。)

于 2008-11-01T16:29:39.900 回答
3

以下是 W3C 对各种 DTD 的官方解释:

http://www.w3.org/QA/2002/04/valid-dtd-list.html

您可能还会发现以下好处:

http://www.freedivs.com/tutorials/Choosing%20a%20DOCTYPE/

于 2008-11-01T03:23:06.070 回答
3

我写了一篇文章,解释了文档类型如何参与渲染模式选择

于 2008-11-02T21:00:33.737 回答
2

关于文档类型有很多错误信息。混淆源于这样一个事实,即 doctypes 最初是为了一个目的(识别 DTD,即使用的 HTML 版本),但在现实世界中,浏览器用于完全不相关的目的。

在当今的浏览器中, Doctype 声明仅用于一件事,即在quirks渲染模式和CSS标准渲染模式之间切换。所以基本上它是 CSS 的东西,而不是 HTML 的东西。

Quirks 模式渲染向后兼容旧浏览器中的一些旧渲染错误,并且对于您不想修复的遗留内容非常有用。新内容应始终使用标准模式,因为它在浏览器之间呈现更正确和一致。(使用标准模式时,浏览器之间仍然存在渲染差异,但在 quirks 模式下更差。)

无论您选择 HTML 还是 XHTML 文档类型都没有任何区别,如果您选择严格或过渡文档类型也没有任何区别渲染模式基本上是这样选择的:

  • 如果文档没有任何 doctype,则选择quirks模式。
  • 如果文档具有无法识别的文档类型,则选择标准模式。这意味着你可以编写一个随机的文档类型<!DOCTYPE Chris>,它会工作得很好。
  • 没有正确 url(标签中的第二个字符串)的官方 W3C 文档类型会选择quirks模式。所有其他文档类型选择标准模式。(编辑:当然它比这更复杂,甚至在浏览器之间会有所不同,哪些已识别的文档类型会触发怪癖模式。Se hsivonens overview,链接自另一个答案。)

从历史上看,文档类型旨在声明使用了哪个版本和 HTML 的子集。HTML4 定义了几个版本,其中“过渡”允许许多元素和属性(如 FONT)在“严格”中是不允许的。理论上,浏览器可以处理与“过渡”文档不同的“严格”文档。但是实际上没有浏览器这样做

编辑:sculiffe 指出 IE8 将有另一种渲染模式,“IE8 标准”模式。然而,AFAIK 这种模式不是由文档类型触发,而是由元标记触发。

于 2008-11-02T08:48:32.763 回答
0

基本上,文档类型决定了 IE 的疯狂程度。

如果您不将其设置为 XHTML 或“严格”,那么当涉及到 IE 时,您将生活在一个痛苦的世界中(即使您设置了它,您仍然会讨厌 IE,但它确实做到了好了很多)。

于 2008-11-01T22:11:25.373 回答