HTML之DOCTYPE

先看几种doctype 声明类型:

<!-- html5 -->
<!doctype html>
<!-- 严格版本 -->
< !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">
<!-- 基于框架的 HTML 文档 -->
< !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
"http://www.w3.org/TR/html4/frameset.dtd">

DOCTYPE是document type(文档类型)的简写,在文档中用于声明文档类型。
在html文档中定义DOCTYPE是十分必要的,浏览器根据DOCTYPE声明,能够了解预期的文档类型,从而决定通过哪一种规范(DTD)解析文档(比如html/xhtml)。

DTD

DTD(Document Type Definition)概念缘于SGML,每一份SGML文件,均应有相对应的DTD。DTD 即文档类型定义(Document Type Definition)是一套为了进行程序间的数据交换而建立的关于标记符的语法规则。它是标准通用标记语言和 [1] 可扩展标记语言1.0版规格的一部分,文档可根据某种DTD语法规则验证格式是否符合此规则。文档类型定义也可用做保证标准通用标记语言、可扩展标记语言文档格式的合法性,可通过比较文档和文档类型定义文件来检查文档是否符合规范,元素和标签使用是否正确。文档类型定义文件是一个美国信息交换标准代码(American Standard Code for Information Interchange 简 称ASCII)文本文件。

声明不是 HTML 标签;它是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令,告诉浏览器该文档所使用的规则。决定了浏览器最终使用什么规则来解析并渲染你的文档。

DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
内部的 DOCTYPE 声明
假如 DTD 被包含在您的 XML 源文件中,它应当通过下面的语法包装在一个 DOCTYPE 声明中:<!DOCTYPE 根元素 [元素声明]>

<?xml version="1.0"?>
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>George</to>
  <from>John</from>
  <heading>Reminder</heading>
  <body>Don't forget the meeting!</body>
</note>

外部文档声明
假如 DTD 位于 XML 源文件的外部,那么它应通过下面的语法被封装在一个 DOCTYPE 定义中:<!DOCTYPE 根元素 SYSTEM "文件名">
网页中常见的为外链声明:

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

SGML
早在Web未发明之前,SGML(Standard Generalized Markup Language,标准通用标记语言)就已存在,正如它的名称所言,SGML是国际上定义电子文件结构和内容描述的标准。SGML具有非常复杂的文档结构,主要用于大量高度结构化数据的访问和其他各种工业领域,在分类和索引数据中非常有用。

HTML
1989年,HTML诞生,它抛弃了SGML复杂庞大的缺点,继承了SGML的很多优点。HTML最大的特点是简单性和跨平台性。
XML
可扩展标记语言,标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言。
XHTML 是以 XML 格式编写的 HTML
通过结合 XML 和 HTML 的长处,开发出了 XHTML。XHTML 是作为 XML 被重新设计的 HTML。
与 HTML 相比最重要的区别:
文档结构
XHTML DOCTYPE 是强制性的

中的 XML namespace 属性是强制性的 、、 以及 也是强制性的 元素语法 XHTML 元素必须正确嵌套 XHTML 元素必须始终关闭 XHTML 元素必须小写 XHTML 文档必须有一个根元素 属性语法 XHTML 属性必须使用小写 XHTML 属性值必须用引号包围 XHTML 属性最小化也是禁止的 一般来说 !DOCTYPE后面会有一个包含命名空间的html标签:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

xmlns是XHTML namespace的缩写。
作用:由于xml允许定义自己的标记,但你定义的标记和其他人定义的标记有可能相同,但表示不同的含义。当文档交换或者共享的时候就容易产生错误。为避免这种错误产生,xml采用名字空间声明,允许你通过一个网址来识别你的标记。
XHTML是HTML向xml过度的标记语言,它需要符合xml文档规则,因此,也需要定义命名空间,又因为XHTML1.0不能自定义标识,所以,它的名字空间都相同,就是:http://www.w3.org/1999/xhtml

html中常见的doctype

HTML4.01 strict:不允许使用表现性、废弃元素(如font)以及frameset。声明:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
 
HTML4.01 Transitional:允许使用表现性、废弃元素(如font),不允许使用frameset。声明:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 
HTML4.01 Frameset:允许表现性元素,废气元素以及frameset。声明:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
 
 
XHTML1.0 Strict:不使用允许表现性、废弃元素以及frameset。文档必须是结构良好的XML文档。声明:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
 
XHTML1.0 Transitional:允许使用表现性、废弃元素,不允许frameset,文档必须是结构良好的XMl文档。声明:
<!DOCTYPE html PUBLIC//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 
XHTML 1.0 Frameset:允许使用表现性、废弃元素以及frameset,文档必须是结构良好的XML文档。声明:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> HTML 5:<!doctype html>
HTML5中的!doctype是不区分大小写的;

我的DW默认的声明模板是下面这样的:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
我的webstrom中默认的模板是这样的:

<!DOCTYPE html>


浏览器的呈现模式

1、文档模式目前有四种:

混杂模式(quirks mode)
//让IE的行为与(包含非标准特性的)IE5相同
标准模式(standards mode)
//让IE的行为更接近标准行为
准标准模式(almost standards mode)
//这种模式下的浏览器特性有很多都是符合标准的,不标准的地方主要体现在处理图片间隙的时候(在表格中使用图片时问题最明显)。
超级标准模式:
//IE8引入的一种新的文档模式,超级文档模式可以让IE以其所有版本中最符合标准的方式来解释网页内容。
ps:
总的来看,混杂模式让IE像IE5,标准模式使用IE7的呈现引擎,而超级标准模式则是IE8的默认文档模式

现代的浏览器需要不同模式, 既要呈现久远的HTML界面, 不至于界面结构混乱不堪, 也需要呈现W3C标准的界面:

标准的显示方式就是—标准模式(strict),
不标准的显示方式—怪异模式(没定义doctype或者doctype错误等等情况,都会让界面进入quirk模式),
既可以显示标准的,也能够显示不标准的(过渡类型的文档类型定义transitional);

DOCTYPE切换

浏览器根据不同的DOCTYPE选择不同的渲染方法就叫做DOCTYPE切换。 其实DOCTYPE切换就是用来识别和兼容旧网页的。

触发严格模式:

<!-- HTML 4.01 严格型 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"  "http://www.w3.org/TR/html4/strict.dtd"> 
 
<!-- XHTML 1.0 严格型 -->
<!DOCTYPE html PUBLIC  "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

触发混杂模式

<!-- HTML 4.01 过渡型 -->
<!DOCTYPE HTML PUBLIC  "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd"> 
 
<!-- HTML 4.01 框架集型 -->
<!DOCTYPE HTML PUBLIC  "-//W3C//DTD HTML 4.01 Frameset//EN"  "http://www.w3.org/TR/html4/frameset.dtd"> 
 
<!-- XHTML 1.0 过渡型 -->
<!DOCTYPE html PUBLIC  "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
 
<!-- XHTML 1.0 框架集型 -->
<!DOCTYPE html PUBLIC  "-//W3C//DTD XHTML 1.0 Frameset//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

<!-- IE8关闭超标准模式 -->
<meta http-equiv="X-UA-Compatible" content="IE=7" />
content属性中IE的值用于指定使用哪个版本的呈现引擎来呈现页面。设计这个值的目的就是为了向后兼容那些专门为老版本的IE设计的站点和页面。

以下情况浏览器会采用标准模式渲染:

给出了完整的DOCTYPE声明

DOCTYPE声明了Strict DTD

DOCTYPE声明了Transitional DTD和URI

以下情况浏览器会采用怪异模式渲染:

DOCTYPE声明了Transitional DTD但未给出URI

DOCTYPE声明不合法

未给出DOCTYPE声明

现今情况

HTML5协议下 统一写 < !DOCTYPE html>。

HTML 5 不基于 SGML,因此不需要对 DTD 进行引用,也就没有严格模式与怪异模式的区别,但是需要 doctype 来规范浏览器的行为(html 5简化了这种声明,意在告诉浏览器使用统一的标准即可);HTML5 有相对宽松的语法,实现时,已经尽可能大的实现了向后兼容。( HTML5 没有严格和混杂之分)

如果不声明DOCTYPE会发生什么?

不同文档模式主要影响CSS内容的呈现,尤其是浏览器对盒模型的解析,但在某些情况下也会影响到JavaScript的解释执行。

如果你是使用最新标准编写的页面但未给出DOCTYPE声明,浏览器会采用怪异模式渲染,这时就可能会出现一些怪异的行为。 例如盒模型不正确、窗口的size不正确等问题。所以,尽量为你网站的所有页面都给出合法的DOCTYPE声明。

有没有其他进入怪异模式的方法?

除了不写DOCTYPE声明外,最常见的就是在DOCTYPE声明前面出现了这些内容:普通文本、HTML 标签、HTML 注释、XML 声明、IE条件注释。

参考文献:

参考一: 为何说 HTML5「no longer based on SGML」?

参考二: HTML_严格模式与混杂模式

参考三: 你知道什么是doctype,什么是文档模式吗

参考四: 严格模式与混杂模式-如何触发这两种模式,区分它们有何意义

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值