!DOCTYPE的功能是什么?

33

我们经常看到下面这样的<!DOCTYPE ...>

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

!DOCTYPE 的功能是什么?

5个回答

32
DOCTYPE 最重要的作用是在怪异模式和标准模式之间切换浏览器呈现
这个功能的出现是因为旧版IE中的“损坏”呈现。人们意识到,如果微软只是“修复”IE渲染引擎,很多现有网站将无法正确呈现。所以,它的工作方式是,如果你在页面中放置任何有效的DOCTYPE声明,那么就假定你知道自己在做什么,你的浏览器将按照标准兼容的方式呈现,如果你不放置,则会以旧的“错误”方式呈现。
最初这是在Mac上的IE中完成的,但这种行为在所有版本的IE自IE5以来,以及Firefox、Chrome、Safari和Opera中都是相同的。
DOCTYPE的本意是文档类型定义。HTML是SGML(XML也是),DTD告诉解析器你正在使用哪种语法。因此,在网页中,你的DOCTYPE应该与你使用的HTML版本匹配。

“xhtml1-transitional.dtd” 是指怪异模式还是标准模式? - Ricky
1
所有有效的文档类型,包括XHTML 1.0 Transitional,将导致页面以标准模式显示。然而,如果省略文档类型,则页面将以quirks模式显示。 - Pär Wieslander

8

它告诉验证器你使用的是哪个版本的HTML。浏览器使用这些信息来正确地渲染页面。

以下是正确的DOCTYPE版本:

  • HTML 4.01 Strict, Transitional, Frameset

    <!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">
    
  • XHTML 1.0 Strict, Transitional, Frameset

    <!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">
    
  • XHTML 1.1

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    
  • HTML5

    <!DOCTYPE html>
    

这些定义有什么区别?XHTML 1.1和HTML 4是相同的吗? - hora
它们是不同的标准。 - ceth

3

主要是为了兼容性。

现代浏览器不再需要它。请参见没有! DOCTYPE的HTML文件:

<p>hello</p>

浏览器会自动插入!DOCTYPE声明,但这只适用于现代浏览器。在IE8中,一些CSS属性只有在声明了DOCTYPE后才能生效。因此,如果您不需要支持古老的浏览器,那么您就不需要它。但是,它已经成为程序员的习惯!更新:DOCTYPE之前需要DTD URL。DTD定义文档中的所有元素。如果您使用HTML 4.01 DTD,则HTML 5元素将无法正常工作。但并非所有功能都能正常运行。没有DOCTYPE时,绿色方块将占据50%的宽度。

div {
  width:50%;
  background-color:#00ff00;
}
<div>div</div>

但是有一个问题:

div {
  width:50%;
  background-color:#00ff00;
}
<!DOCTYPE html>
<div></div>

然而,堆栈片段自动添加了一个!DOCTYPE,所以您在此处看不到它。

0
DOCTYPE 的主要(实际)目的是将 IE 从“怪异模式”强制转换为“标准兼容模式”,这两个词都是“可怕的破碎模式”和“稍微破碎模式”的委婉说法。
在其他浏览器中,页面在没有 !DOCTYPE 的情况下正常响应,但有以下例外
- 尝试在 Internet Explorer 中使用 z-index CSS 属性。在怪异模式下,它不起作用。您需要处于标准兼容模式才能使其工作。当然,最简单的方法是使用 DOCTYPE。 - 浏览器在有和没有 !DOCTYPE 的情况下表现不同。以下是代码:
    <div>some text</div>
    <style type="text/css">
    div {
        background-color:#00ffff;
        height:10%;
        width:10%;
    }
    </style>
  • 当网页有DOCTYPE和没有DOCTYPE时,呈现效果不同。
    • 没有DOCTYPE:without doctype
    • 有DOCTYPE:with doctype 没有DOCTYPE时,元素的大小根据CSS来确定。但有DOCTYPE时,元素的大小取决于元素本身。

过去,!DOCTYPE并不是那么简单。你必须指定一个DTD URL:

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

DTD 大致如下:

<!ENTITY % HTML.Version "-//W3C//DTD HTML YOURVERSION Transitional//EN"
  -- this is a comment.
-->
<!ENTITY % HTML.Frameset "IGNORE">

<!ENTITY % ContentType "CDATA"
    -- media type, as per [RFC2045]
    -->

<!ENTITY % ContentTypes "CDATA"
    -- comma-separated list of media types, as per [RFC2045]
    -->

<!ENTITY % Charset "CDATA"
    -- a character encoding, as per [RFC2045]
    -->

<!ENTITY % Charsets "CDATA"
    -- a space-separated list of character encodings, as per [RFC2045]
    -->

<!ENTITY % LanguageCode "NAME"
    -- a language code, as per [RFC1766]
    -->

<!ENTITY % Character "CDATA"
    -- a single character from [ISO10646] 
    -->

<!ENTITY % LinkTypes "CDATA"
    -- space-separated list of link types
    -->

<!ENTITY % MediaDesc "CDATA"
    -- single or comma-separated list of media descriptors
    -->

<!ENTITY % URI "CDATA"
    -- a Uniform Resource Identifier,
       see [URI]
    -->

<!ENTITY % Datetime "CDATA" -- date and time information. ISO date format -->


<!ENTITY % Script "CDATA" -- script expression -->

等等,诸如此类。


0

它告诉您的浏览器正在加载哪个版本的HTML,使加载时间更快,因为浏览器知道可以期望什么。

doctype是由w3c定义的标准 - 当您听到基于标准的Web开发时,这就是他们所谈论的内容。使用doctype的想法是创建遵循doctype的有效HTML。

如果您聪明的话,实际上可以编写自己的doctype。


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