HTML中有哪些不同的文档类型,它们代表什么意思?

35
作为标题所述,有哪些不同的文档类型可用,它们代表什么?我注意到在IE7中从切换时布局看起来略有不同

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

to

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

还有其他的吗?它们会产生什么影响或后果?

谢谢!


我认为这一定应该是社区维基。 - Wayne Koorts
6个回答

54

Doctype(文档类型声明)通常是将文档与文档类型定义(DTD)相关联的。文档类型定义是针对特定XML或SGML文档的标准。在XML和SGML中,除了标签和属性的一般工作方式之外,它们本身并没有太多的模式或非常具体的规则。您可以将DTD视为特定类型文档的规则描述(例如HTML、SVG或MathML)。它们指定了允许哪些标记位于何处(例如,html元素必须包含恰好一个head元素,后跟一个body元素)。

有DTD等选择方案,但如今更普遍使用的是XML模式。

然而,浏览器根本不使用DTD。它们读取Doctype以确定渲染模式,但解析文档的规则完全内置于浏览器中。

这就是为什么HTML 5有一个Doctype(用于确定渲染模式)但没有DTD的原因。

渲染模式

早期的Web浏览器非常漏洞百出。当发布新版本时,它们必须与前辈和竞争对手保持兼容性。这使得修复错误变得非常困难,因为网站依赖于它们。

为了解决这个问题,现代浏览器有不同的渲染模式(标准模式,用于按照标准呈现文档和CSS,以及怪异模式,其中浏览器模拟早期浏览器的错误以及几乎标准模式,介于两者之间)。

选择Doctype

在选择Doctype时需考虑两个因素:

  • 是否会触发标准模式?(对于新页面来说,应该是这样的。如果需要与不支持标准模式的浏览器兼容,则这种情况很少见)
  • 是否支持我需要的功能?

通常意味着您应该使用HTML 5。它是当前的标准,并最好反映了浏览器实际工作方式:

<!DOCTYPE html>

如果无法实现此目标。严格的文档类型可以避免使用 CSS 处理的大多数功能。

在编写 XHTML 1.0 时,通常会使用此文档类型:

<!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并依赖于公共标识符),这对于支持标准模式具有影响。 本文包括一个详细的列表
严格DOCTYPE与过渡DOCTYPE之争
(请注意,以下内容在2021年比2008年要少得多)
标准倡导者呼吁Web开发人员停止在新页面上使用过渡DOCTYPE,而改用严格DOCTYPE。再次说明,理论和实践存在一些难以调和的困难之处。过渡DOCTYPE的最初希望是为传统网站向符合标准的过渡提供一个过渡阶段。使用过渡DOCTYPE,元素和属性的限制实际上“更加宽松”,因此开发人员将能够更快地在标准模式下运行其工作,并逐步消除尚未解决的差异。
争议的原因在于,在企业环境中,开发人员不总是能够轻松更改DOCTYPE。自由职业者和中小型网站的制造商通常更容易确定他们的DOCTYPE并进行此转换。在高度需求的基于Web的服务的企业生产环境中,对遗留系统和第三方代码产品有固有的更复杂的依赖关系,这些产品本身可能正在进行删除或重新设计的路线图,但必须逐步和有序地执行此类更改。
有用的工具
W3C(World Wide Web Consortium)是定义这些标准的活跃团体。他们在http://validator.w3.org/上维护了一个有用的在线工具,可以验证文档是否符合标准。还有许多其他第三方工具和浏览器扩展程序具有类似的功能。

8
浏览器 不关心 您使用的文档类型(好吧,几乎是真的),它们仅用于一个目的:决定要使用哪个 渲染模式。例如,请参见 FxOpera 文档,了解实际上使用了哪些算法来决定使用哪种模式(我猜在 MSDN 的某处可能有一些 IE 的文档...[这可能是正确的页面](http://msdn.microsoft.com/en-us/library/ms535242(VS.85).aspx),但我不知道,抱歉)。
然而,在大多数浏览器中有两种主要模式(一些浏览器也有 几乎标准模式)。
  • 怪异模式(当浏览器没有找到“正确”的文档类型时使用,“正确”是从浏览器的角度来看的):尝试将文档呈现为旧版本的IE所做的方式之一(最重要的差异之一,即影响呈现最多的是,在此模式下,一些浏览器利用IE盒子模型漏洞)。
  • 标准模式(当浏览器找到它认为正确的文档类型时使用):尝试按照标准执行。

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

(关于XHTML的说明:我假设您将文档作为HTML(text/html)提供,如果您将文档作为XHTML(可能是application/xhtml+xml),大多数浏览器直接进入标准模式,并且完全不关心文档类型,据我所知。)

顺便说一句:另一个答案中的建议(或者看起来像建议)已经过时了,转换DTD不应该在新文档中使用。始终使用严格(“严格”这个词有点误导,应该是“默认”或其他非可怕的术语),就这样:

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

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

有许多关于此的博客文章,例如不再使用过渡性DOCTYPE,请(来自2006年,但显然仍然有些问题 :)。

这篇文章起初指出浏览器不关心你选择什么,然后发展成为一篇关于如何选择正确DTD的抱怨,很有趣...但如果你要花时间和精力选择DTD,那么你最好选择正确的DTD(从HTML 4.01标准的角度来看)。

或者,你可以忽略所有这些,改用以下内容,即将到来 无论如何

<!doctype html>

“有没有任何理由不开始使用HTML 5 DOCTYPE?”的此答案与最后一部分有点相关。


1
对于开发(即通过验证进行正确性测试),文档类型确实起到作用。之后,您所说的就适用了。 - Konrad Rudolph

4

3

3

有很多关于文档类型的错误信息。混淆的原因在于文档类型最初是为了一个目的而设计的(即标识DTD,即所使用的HTML版本),但在实际浏览器中用于完全不相关的目的。

在今天的浏览器中,doctype声明仅用于一件事情,那就是在CSS中切换quirks渲染模式和standards渲染模式。因此,它基本上是一个CSS问题,而不是HTML问题。

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

选择HTML或XHTML文档类型以及选择strict或transitional doctype都不会产生任何影响。渲染模式基本上是这样选择的:

  • 如果文档没有任何文档类型声明,则选择 怪异模式
  • 如果文档具有一个 无法识别 的文档类型声明,则选择 标准模式。这意味着您可以编写一个随机的文档类型声明,如 <!DOCTYPE Chris>,而它将完美地工作。
  • 不带 正确 url(在标签中的第二个字符串)的官方 W3C 文档类型声明会选择 怪异模式。所有其他文档类型声明都选择标准模式。(编辑:当然,情况比这更复杂,甚至在识别的文档类型声明触发怪异模式方面,不同的浏览器也存在差异。请参见另一个答案链接的 hsivonens 概述。)

历史上,文档类型声明旨在声明使用的 HTML 版本和子集。HTML4 定义了几个版本,其中“过渡”允许使用一些元素和属性(如 FONT),而在“严格”模式下不允许。理论上,浏览器可以以不同于“过渡”文档的方式处理“严格”文档。然而,没有浏览器实际这样做

编辑:scunliffe指出IE8将拥有另一个渲染模式,“IE8标准”模式。但是据我所知,这种模式不是由doctype触发的,而是由meta标签触发的。


1
不,这不仅仅是CSS的问题。在不同模式下访问DOM时,浏览器的行为也会有所不同(或者至少IE是这样的)。更糟糕的是,在IE8中,有三种不同的模式:quirks、standards和IE8 standards mode。 - scunliffe

0

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

如果你不将它设置为XHTML或“严格模式”,当涉及到IE时你会深感苦恼(即使你将其设置了,你仍然会讨厌IE,但它确实可以让它变得更好)。


如果您需要针对IE 6或7进行目标定位,那么您只能获得几乎标准模式。 - Casebash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接