2023年11月25日发(作者:)

DOCTYPE声明作⽤及⽤法详解

⼀、浏览器呈现模式和doctype

有的⽹页是遵循标准⽽创作的,但也有很多不是。即使你不能创建遵循标准的⽹页,也希望浏览器根据标准来正确显⽰那

些页。⽬前,⼤量⽹页充斥着⼤量⾮标准代码,它们仍能正常地⼯作。事实上,为旧版浏览器设计的⼤多数代码都能在新版浏

览器中正确显⽰(虽然呈现⽅式可能有所区别)。这是什么原因呢?事实上,假如严格遵循最新标准,会完全破坏那些页的⽣

存基础。对于任何希望有所作为的浏览器来说,这当然是令⼈⽆法接受的。

浏览器呈现模式

现代浏览器包括不同的呈现模式,⽬的是既⽀持遵循标准的⽹页,也⽀持为⽼式浏览器⽽设计的⽹页。其中, Standards

(标准)模式(也就是严格呈现模式)⽤于呈现遵循最新标准的⽹页,⽽ Quirks (包容)模式(也就是松散呈现模式或者兼

容模式)⽤于呈现为传统浏览器⽽设计的⽹页。另外,注意Mozilla/Netscape 6新增了⼀种 Almost Standards (近似标准)模

式,⽤于⽀持为标准的某个⽼版本⽽设计的⽹页。

什么是 doctype切换?

放在⽹页顶部的doctype声明是让浏览器进⼊正确呈现模式的关键。浏览器⾃动切换到恰当的呈现模式,以便正确显⽰由

doctype声明所指定的⽂档种类。

理论上,这应该是⼀个⾮常直观的切换。假如doctype指出当前⽹页是⼀个遵循标准(也就是HTML 4+XHTML 1+)的⽂

档,浏览器就会切换到Standards模式。假如没有指定doctype,或者指定HTML 3.2以及更⽼的版本,浏览器就切换到Quirks

模式。这样⼀来,浏览器既能正确显⽰遵循标准的⽂档,⼜不⾄于完全舍弃⽼式的、与标准不符的⽹页。

doctype切换的问题 但是,doctype切换是⼀个不完善的⽅案。即使你在Web⽂档中使⽤了⼀个doctype声明,浏览器也可

能不会采取你希望的呈现模式来显⽰⽹页。原因是多⽅⾯的,包括形式错误的doctype,以及不同

encoding="UTF-8"?>) 开头,其中包括XHTML⽹页。然⽽,IEOpera和旧版Safari都希望⽂档的第⼀⾏是doctype声明。所

以,如果在它之前还有其他任何东西(包括XML prolog),就⽆法识别doctype。因此,XML prolog的存在会使IEOpera

Safari进⼊Quirks模式。XML prolog并⾮必需的,所以你可在XHTML⽹页中安全地省略它。注意:⼀定要在http-equiv meta

记中包括⼀个charset属性,以弥补XML prolog中缺失的encoding属性。

丢失的URL或者相对URL

在完整的doctype声明中,要包括相应的⽂档类型定义(DTD)⽂件的URL。如果URL丢失,或者指定的是⼀个相对路径

(⽽不是完全限定的Internet地址),⼤多数浏览器都会进⼊Quirks模式,不管doctype声明规定的是什么模式。

形式错误的doctype

浏览器对doctype声明的形式和格式⾮常敏感,如果不能识别⼀个形式错误的doctype,就会强制进⼊Quirks模式(正是因

为这个原因,所以我们建议将⼀个已知正确的doctype拷贝和粘贴到⽂档中,⽽不是亲⾃输⼊它)。之所以出现形式错误的

doctype,⼀个常见的原因是在doctype 的第⼀部分与URL之间缺少⼀个空格。将⼀个分两⾏的doctype折叠成单独⼀⾏,常常

会丢失那个空格。

过渡期的 doctype

浏览器处理过渡期的doctype时,最容易出现不⼀致的问题。IEOpera使⽤Standards模式;Netscape 6和旧版本的Safari

使⽤Quirks模式;Netscape 7Mozilla 1和新版本的Safari使⽤NetscapeAlmost Standards模式,它是Standards模式的⼀

个具有更好容错性的版本。

未知的 doctype

浏览器在处理不能识别的doctype时,也存在不⼀致的现象。IEOpera会进⼊Standards模式;换⾔之,它假定不能识别

doctype 是尚未在浏览器中集成的⼀个新标准。Netscape 6则相反,会在遇到不能识别的doctype时切换到Quirks模式。

doctype切换也许是让浏览器进⼊正确呈现模式并正确显⽰⽹页的⼀种有效⼿段,前提是你注意到了各种浏览器的不⼀致,

并能积极主动地避免各种问题。

⼆、使⽤正确的doctype声明

我们平时在做页⾯的时候可能会忽视这⼀点(包括鄙⼈,通常都是懒于不写⽽使⽤浏览器默认),随着⽬前⽹页编码规范

化热潮的到来,⼤家都有必要了解⼀下这个细节,会有⽤处的。俗话说没有规矩不成⽅圆呢。

虽然⼤多数Web⽂档的顶部都有doctype声明,但很多⼈都没有注意它。它是在你新建⼀个⽂档时,由Web创作软件草率

处理的众多细节之⼀。虽然 doctype被许多⼈忽视,但在遵循标准的任何Web⽂档中,它都是⼀项必需的元素。doctype会影

响代码验证,并决定了浏览器最终如何显⽰你的 Web⽂档。

doctype的作⽤

doctype声明指出阅读程序应该⽤什么规则集来解释⽂档中的标记。在Web⽂档的情况下,阅读程序通常是浏览器或者校

验器这样的⼀个程序,规则则是W3C所发布的⼀个⽂档类型定义(DTD)中包含的规则。

每个DTD都包括⼀系列标记、attributesproperties,它们⽤于标记Web⽂档的内容;此外还包括⼀些规则,它们规定了

哪些标记能出现在其他哪些标记中。每个Web建议标准(⽐如HTML 4 FramesetXHTML 1.0 Transitional)都有⾃⼰的

DTD。假如⽂档中的标记不遵循doctype声明所指定的DTD,这个⽂档除了不能通过代码校验之外,还有可能⽆法在浏览器中

正确显⽰。对于标记不⼀致的问题,浏览器相较于校验器来说更宽容。但是,不正确的doctype声明经常导致⽹页不正确显

⽰,或者导致它们根本不能显⽰。

选择正确的doctype

为了获得正确的doctype声明,关键就是让DTD与⽂档所遵循的标准对应。例如,假定⽂档遵循的是XHTML 1.0 Strict

准,⽂档的doctype声明就应该引⽤相应的DTD。另⼀⽅⾯,如果doctype声明指定的是XHTML DTD,但⽂档包含的是旧式风

格的HTML标记,就是不恰当的;类似地,如果doctype声明指定的是HTML DTD,但⽂档包含的是XHTML 1.0 Strict标记,同

样是不恰当的。

有的时候,也可以根本不使⽤⼀个doctype声明。如果没有指定有效的doctype声明,⼤多数浏览器都会使⽤⼀个内建的默

DTD。在这种情况下,浏览器会⽤内建的DTD来试着显⽰你所指定的标记。对于⼀些临时性的、匆忙拼凑的⽂档(这种⽂

档有许多),你确实可以考虑省略doctype声明,并接受浏览器的默认显⽰。

完全可以从头编写⼀个doctype声明,并让它指向⾃⼰选择的⼀个DTD。然⽽,由于⼤多数Web⽂档都需要遵循由W3C发布的

某个国际公认的Web标准,所以那些⽂档通常都要包含以下标准doctype声明之⼀:

HTML 2

HTML 3.2

除了上⾯列出的doctype声明,具有特殊要求的⼀些⽂档还使⽤了其他⼏种声明。

doctype声明通常是⽂档的第⼀⾏,要在标记以及其他⽂档内容之前。注意,在XHTML⽂档中,doctype的前⾯偶尔

会出现⼀条XML处理指令(也称为XML prolog):

为了确保⽹页正确显⽰和顺利通过验证,使⽤正确的doctype是关键。与内容相反的、不正确的或者形式错误的doctype

⼤量问题的罪魁祸⾸。

开始制作符合标准的站点,第⼀件事情就是声明符合⾃⼰需要的DOCTYPE

打开⼀些符合标准的站点,例如著名web设计软件开发商 Macromedia ,设计⼤师 Zeldman 的个⼈⽹站,会发现同样的代

码。⽽另⼀些符合标准的站点(例如 )的代码则如下:

我们选择什么样的DOCTYPE

理想情况当然是严格的DTD,但对于我们⼤多数刚接触web标准的设计师来说,过渡的DTD(XHTML 1.0 Transitional)是⽬

前理想选择(包括本站,使⽤的也是过渡型DTD)。因为这种DTD还允许我们使⽤表现层的标识、元素和属性,也⽐较容易通过

W3C的代码校验。 注:上⾯说的"表现层的标识、属性"是指那些纯粹⽤来控制表现的tag,例如⽤于排版的表格、背景颜⾊标

识等。在XHTML中标识是⽤来表⽰结构的,⽽不是⽤来实现表现形式,我们过渡的⽬的是最终实现数据和表现相分离。

打个⽐⽅:⼈体模特换⾐服。模特就好⽐数据,⾐服则是表现形式,模特和⾐服是分离的,这样你就可以随意换⾐服。⽽

原来HTML4中,数据和表现是混杂在⼀起的,要⼀次性换个表现形式⾮常困难。呵呵,有点抽象了,这个概念需要我们在应

⽤过程中逐步领会。

补充

DOCTYPE声明必须放在每⼀个XHTML⽂档最顶部,在所有代码和标识之上。

四、官⽅是这样定义 DOCTYPE HTML PUBLIC

!DOCTYPE

--------------------------------------------------------------------------------

指定了 HTML ⽂档遵循的⽂档类型定义(DTD)

Microsoft? Internet Explorer 6 的新增内容。你可使⽤此声明将 Internet Explorer 6 及以后版本切换到标准兼容模式下。

语法

HTML 顶级元素 可⽤性 "注册//组织//类型 标签//定义 语⾔""URL"

可能值

顶级元素:指定 DTD 中声明的顶级元素类型。这与声明的 SGML ⽂档类型相对应。 HTML 默认。HTML

可⽤性:指定正式公开标识符(FPI)是可公开访问的对象还是系统资源。 PUBLIC 默认。可公开访问的对象。 SYSTEM

统资源,如本地⽂件或 URL

注册:指定组织是否由国际标准化组织(ISO)注册。 + 默认。组织名称已注册。 - 组织名称未注册。Internet ⼯程任务组

(IETF)和万维⽹协会(W3C)并⾮注册的 ISO 组织。

组织:指定表明负责由 !DOCTYPE 声明引⽤的 DTD 的创建和维护的团体或组织的名称,即 OwnderID IETF IETF

W3C W3C

类型:指定公开⽂本类,即所引⽤的对象类型。 DTD 默认。DTD

标签:指定公开⽂本描述,即对所引⽤的公开⽂本的唯⼀描述性名称。后⾯可附带版本号。 HTML 默认。HTML

定义:指定⽂档类型定义。 Frameset 框架集⽂档。 Strict 排除所有 W3C 专家希望逐步淘汰的代表性属性和元素,因为样

式表已经很完善了。Transitional 包含除 frameSet 元素的全部内容。

语⾔:指定公开⽂本语⾔,即⽤于创建所引⽤对象的⾃然语⾔编码系统。该语⾔定义已编写为 ISO 639 语⾔代码(⼤写两个

字母) EN 默认。英语。

URL:指定所引⽤对象的位置。

注释

此声明必须出现在⽂档的起始处,出现在 html 标签之前。

!DOCTYPE 元素不需要关闭标签。

此元素在 Microsoft? Internet Explorer 3.0 HTML 中可⽤。

你可使⽤此声明在 Internet Explorer 6 及以后版本中切换为严格的标准兼容模式。若想打开此开关,请在你的⽂档顶部包

!DOCTYPE 声明,在声明中指定合法的标签,在某些情况下,还需要指定定义和/ URL

注意 在标准兼容模式下,不能保证与其它版本的 Internet Explorer 保持兼容。当打开标准兼容模式时,⽂档的渲染⾏为也

许与将来版本的 Internet Explorer 不同。若内容本来就是固定的(如刻录在 CD ),则不应该使⽤此模式。

⽰例

下⾯的例⼦演⽰了如何使⽤ !DOCTYPE 声明指定⽂档遵从的 DTD,并将 Internet Explorer 6 及更⾼版本切换到标准兼容

模式。 下⾯例⼦中的声明都指定了遵从 HTML 4.0 DTD。第⼆种声明指定了“Strict”。第⼀种声明没有指定。这两种声明都将

会把 Internet Explorer 6 及以后版本切换到标准兼容模式。

下⾯例⼦中的声明都指定了遵从“Transitional”HTML 4.0 DTD。第⼆种声明指定了 DTD URL。第⼀种声明没有指定。第

⼆种声明将会把 Internet Explorer 6 及以后版本切换到标准兼容模式。第⼀种声明不会。