代码之家  ›  专栏  ›  技术社区  ›  Chris Conway

HTML中的不同doctypes是什么?它们是什么意思?

  •  35
  • Chris Conway  · 技术社区  · 16 年前

    如标题所述,可用的不同doctypes是什么,它们是什么意思?我注意到当我从

    <!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">
    

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

    谢谢!

    6 回复  |  直到 11 年前
        1
  •  53
  •   community wiki 21 revs keparo    12 年前

    文档类型 文件类型声明 将文档与 文档类型定义 .

    这个 文档类型定义 是XML文档的标准。XML和XHTML文档都有许多DTD。除了要求所有东西都是格式良好的之外,XML本身没有太多的模式或非常特定的规则集。你可以把DTD看成是一个更具体的 文档的架构 .

    渲染模式

    由于标准的变化,大多数现代浏览器实际上有不同的渲染模式。( 标准模式 ,用于根据最新的Web标准呈现文档和CSS,以及 怪癖模式 ,其中浏览器从早期的网络中带回了一些渲染的想法)。这些模式是为了向后兼容而建立的。在网络的第一个时代创建的网页的巨大景观是按照其时代的规则呈现的,而更新的文档可以吸引新的标准浪潮。随着时间的推移和新格式的设想,可能会创建相应的DTD。

    浏览器差异

    在理想情况下,由浏览器加载的页面将读取顶部的doctype并使用它查找文档类型定义。然后,它将使用该DTD的模式作为读取文档其余部分的基础。那么,doctypes对于验证标记文档是必不可少的。DTD将提供验证文档所依据的标准。

    不幸的是,这不是一个理想的世界。浏览器在这里的行为不一定一致,如果一致,那么一致的行为与doctypes的最初设想不太一致。虽然解析是独立于doctype完成的,但是主要浏览器至少会检查doctype以确定呈现模式。如果您的doctype不存在或不完整,浏览器很可能正在 怪癖模式 . 为了使书写良好的现代文档正确显示,浏览器应该 标准模式 . Mozilla、Safari和一些最新版本的Opera实际上实现了 Almost Standards 模式,完全专用于过渡页。

    当您更改doctype并注意到页面显示方式的更改时,这是因为浏览器在试图分析文档时可能应用了一组稍有不同的规则。因此,结果页面可能有点不同,这取决于其所有部分是否符合DTD,或者至少取决于浏览器,您的数据是否在doctype建议的呈现模式下验证。

    选择doctype

    为了符合标准,应尽可能使用严格的doctypes。

    写作时 XHTML ,此doctype很常见:

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

    写作时 HTML 4.1 这是常见的:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
    

    为了完整起见,这里列出了XHTML和HTML4的其他一些常见文档类型:

    <!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 Frameset//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
    
    <!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 Frameset//EN"
    "http://www.w3.org/TR/html4/frameset.dtd">
    

    关于严格与过渡性学说的争论

    标准传道者已经呼吁Web开发人员停止在新页面上使用过渡doctype,而是使用strict。同样,这是一个理论和实践难以调和的案例。过渡文档类型最初的希望是为将传统网站转变为标准遵从性提供一个中转站。对于过渡的doctypes,对元素和属性的限制实际上是“不那么严格”,因此开发人员可以更快地在标准模式下运行他们的工作,并随着时间的推移逐步消除显著的差异。

    存在争议是因为开发人员在企业环境中更改doctype并不总是那么简单。自由职业的开发人员和中小型网站的制作者通常更容易确定他们的文档类型并进行这种转换。在一个要求很高的基于Web的服务的企业生产环境中,对遗留系统和第三方代码产品的依赖性本质上更加复杂,它们本身可能在删除或重新设计的路线图上,但这些更改的执行必须有条不紊地、渐进地进行。

    有用的工具

    W3C World Wide Web Consortium )是一个在定义这些标准方面起到积极作用的群体。他们在 http://validator.w3.org/ 用于验证文件是否符合标准。还有许多其他第三方工具和 browser extensions 功能相似。

        2
  •  7
  •   Community PPrice    7 年前

    浏览器 don't care 你使用什么样的doctype(好吧,几乎是真的),他们只对一件事使用它:决定 渲染模式 使用。参见 Fx Opera documentation 对于决定使用哪种模式的算法的实际例子(我想也有一些关于IE的文档埋在msdn的某个地方…[这可能是正确的页面]( http://msdn.microsoft.com/en-us/library/ms535242(VS.85).aspx) ,我不知道,对不起)。

    然而,在大多数浏览器中有两种主要模式(有些浏览器具有 almost standards mode 同样):

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

    您可以使用(非标准) document.compatMode 属性来检查用于呈现当前文档的模式。

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

    顺便说一句:另一个答案中的建议(或看起来像是建议的内容)被破坏了, transitional DTD不应用于新文档。始终严格使用(术语“严格”是一种误导,应该是“违约”或其他一些不可怕的),句号:

    作者应尽可能使用严格的DTD,但在需要支持表示属性和元素时,可以使用过渡DTD。—— HTML 4.01: 22 Transitional Document Type Definition .

    我们建议作者编写符合严格DTD的文档,而不是本规范定义的其他DTD。—— HTML 4.01: 4 Conformance: requirements and recommendations

    有很多关于这个的博客文章,例如 no more Transitional DOCTYPEs, please (从2006岁开始,但 一些 显然,这方面仍然存在问题:)。

    这篇文章首先指出浏览器不关心你选择什么,然后发展成一篇关于如何选择正确的DTD,有趣的…但是,如果你要花费(/浪费?)选择DTD的时间和精力,您也可以选择正确的DTD(从HTML4.01标准的角度)。

    ,您可以忽略所有这些并使用以下内容, soon anyway :

    <!doctype html>
    

    ( This answer “有什么理由不开始使用HTML5doctype吗?”与最后一部分有点关联。)

        3
  •  3
  •   Noah Goodrich    16 年前
        5
  •  2
  •   JacquesB    16 年前

    关于doctypes有很多错误信息。这种混淆源于这样一个事实:doctypes最初是为一个目的而设计的(用于标识DTD,即所使用的HTML版本),但在现实世界中,浏览器却用于完全无关的目的。

    doctype声明仅用于 一件事 在今天的浏览器中,这是在 怪癖 渲染模式和 标准 CSS的呈现模式。所以基本上它是一个CSS的东西,而不是一个HTML的东西。

    怪癖模式渲染与旧浏览器中的一些旧渲染错误向后兼容,对于您不想修复的旧内容最有用。新内容应该始终使用标准模式,因为它在浏览器之间呈现出更正确和一致的效果。(在使用标准模式时,浏览器之间仍然存在呈现差异,但在怪癖模式中则更糟。)

    它确实 无论您是选择HTML还是XHTML文档类型,都会有任何不同,如果您选择严格或过渡文档类型,也不会有任何不同。渲染模式基本上是这样选择的:

    • 如果文档没有任何doctype, 怪癖 已选择模式。
    • 如果文件有 未被承认的 DOCTYPE, 标准 已选择模式。这意味着您可以编写类似 <!DOCTYPE Chris> 它会很好地工作。
    • W3C官方文件类型 没有 正确的URL(标记中的第二个字符串)选择 怪癖 模式。所有其他doctypes都选择标准模式。(编辑:当然,这比这要复杂得多,而且浏览器之间的差异甚至在于哪种已识别的doctypes触发了quirks模式。硒 hsivonens overview ,链接到另一个答案。)

    历史上,doctypes用于声明使用了哪个版本和html的子集。HTML4定义了几个版本,其中“transitional”允许许多元素和“strict”中不允许的属性(如字体)。理论上,浏览器可以处理不同于“过渡”文档的“严格”文档。然而 没有浏览器真正做到这一点 .

    编辑:scunlife指出IE8还有另一种渲染模式,“IE8标准”模式。但是,afaik此模式不是由doctype触发的,而是由meta标记触发的。

        6
  •  0
  •   dicroce    16 年前

    基本上,doctype决定了有多疯狂。

    如果你不把它设置为XHTML,或者“严格”的话,当它出现在IE中时,你将生活在一个充满伤害的世界中(即使你设置了它,你仍然会讨厌IE,但它确实使它变得更好)。