热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

html文档类型DTD与浏览器怪异模式

虽然在兼容IE6时候经常会注意到两个模式的区别,但是系统的理解起来,还没有认真总结过。看了一些网上的资料。结合自己的理解汇总了一下,放在这里备忘并分享给大家。浏览器从服务端获取网页后会根据文

虽然在兼容IE6时候经常会注意到两个模式的区别,但是系统的理解起来,还没有认真总结过。看了一些网上的资料。结合自己的理解汇总了一下,放在这里备忘并分享给大家。

浏览器从服务端获取网页后会根据文档的DOCTYPE定义显示网页,如果文档正确定义了DOCTYPE浏览器则会进入标准模式(Standards Mode),否则浏览器会进入怪异模式或混杂模式(Quirks mode)。

 

浏览器开发初期W3C倡导的网页标准并不流行,因此浏览器有独特的对网页标签或属性的解析模式,随着日后网页标准的流行,浏览器增加了对新标准的支持(Standards Mode),但又没有放弃对原有模式的兼容(Quirks mode),这就是浏览器多种表现模式的来源。

当微软开始开发与标准兼容的浏览器时,他们希望确保向后兼容性。为了实现这一点,他们IE6.0以后的版本在浏览器内嵌了两种表现模式: Standards Mode(标准模式或Strict Mode)和Quirks mode(怪异模式或兼容模式Compatibility Mode)。在标准模式中,浏览器根据W3C所定的规范来显示页面;而在怪异模式中,页面将以IE5,甚至IE4的显示页面的方式来表现,以保持以前的网页能正常显示。

 

对于这两种模式引起最大的问题就是盒模式的问题,或者现在大家已经忽视了IE5的存在,但是,IE在怪异模式运行的盒模式依然在最新版本的IE保留着,甚至在IE6—IE10都保留有多种模式供开发者使用。其实为了与可能数量众多的网页维持兼容,现代的网页浏览器一般都具有多种渲染模式:在“标准模式”(standards mode) 页面按照 HTML 与 CSS 的定义渲染,而在“quirks 模式”中则尝试模拟更旧的浏览器的行为。一些浏览器(例如,那些基于Mozilla 的 Gecko 渲染引擎的,或者 Internet Explorer 8 在 strict mode 下)也使用一种尝试于这两者之间妥协的“近乎标准”(almoststandards) 模式,实施了一种表单元格尺寸的怪异行为,除此之外符合W3C标准定义。


 

IE盒模型缺陷

(InternetExplorer box model bug)是指早期版本的IE调整网页元素大小的方法,和W3C为层叠样式表(CSS)语言推荐的标准方式不同。在IE6中,浏览器支持一种解决了这种差异的可选的渲染模式(叫做“遵从标准模式”)。然而,出于向后兼容的原因,所有版本的IE (截至 IE 9 及 IE 10 Developer Preview) 仍然默认表现为通常的,非标准的模式。Internet Explorerfor Mac不受这种非标准行为影响。此外,Internet Explorer 10 于其 Consumer Preview 之中也改变其默认怪异模式为一种更加符合规范的类似于非 IE 浏览器的怪异模式。

 

模式之间的差异和示例

 

Quirks和Standards的区别大部分都可以归为IE5和IE6的区别。

 

在 Quirks 模式和标准模式之间一个突出的不同是对 CSS IE盒模型缺陷的处理。在第 6 版之前,InternetExplorer 曾经使用一种决定一个元素的盒模型的宽度和高度的,与 CSS 规范所指定相冲突的算法,而且由于 Internet Explorer 的流行,很多依赖于这种不正确的算法的网页被创建。而在版本 6, Internet Explorer 在标准模式下渲染时使用了CSS规范的算法,而在quirks模式下使用先前不规范的算法。

 

另一个值得一提的不同点是某些行内 (inline) 元素的垂直对齐;很多早期的浏览器对齐图片至包含它们的盒子的下边框,虽然 CSS 的规范要求它们被对齐至盒内文本的基线。标准模式下,基于 Gecko 的浏览器将会对齐至基线,而在 quirks 模式下它们会对齐至底部。

 

此外,很多早期的浏览器对表格内部的字体样式不实施继承;结果是,字体样式必须为整个文档作为一个整体指定一次,并且为表格再次指定一次,尽管 CSS 规范要求字体样式被继承进表格。如果字号使用相对单位指定,一个标准兼容的浏览器会继承基准字号,然后应用于表格内的相对字号:比如,一个声明了基准字号为 80% 的页面内声明表格为 80% (以保证在不正确继承字号的浏览器中有 80% 的字号)的字号将会,在一个标准兼容的浏览器里,显示具有 64% 字号的表格。结果是,浏览器在怪异模式典型的不对表格继承字号。.

 

IE6 IE7 在怪异模式下盒模型是一模一样的  即width=width
IE6 IE7 在标准模式下 盒模型也是一模一样的即width=width+padding+border

代码实例http://bbs.blueidea.com/thread-2839403-1-1.html

 

在strict mode中 :

width是内容宽度,也就是说,元素真正的宽度 = margin-left + border-left-width + padding-left + width +padding-right + border-right-width + margin-right;

在quirks mode中 :

width则是元素的实际宽度,内容宽度 = width - (margin-left +margin-right + padding-left + padding-right + border-left-width +border-right-width)

怪异模式CSS上区别《Quirks mode and strict mode》

Javascript上的区别


以下是一些重要的不同点:

1)盒模型的高宽包含内边距padding和边框border


    在W3C标准中,如果设置一个元素的宽度和高度,指的是元素内容的宽度和高度,而在IE5.5及以下的浏览器及其他版本的Quirks模式下,IE的宽度和高度还包含了padding和border。

2)可以设置行内元素的高宽

    在Standards模式下,给span等行内元素设置wdith和height都不会生效,而在quirks模式下,则会生效。

3)可设置百分比的高度

    在standards模式下,一个元素的高度是由其包含的内容来决定的,如果父元素没有设置高度,子元素设置一个百分比的高度是无效的。

4)用margin:0 auto设置水平居中在IE下会失效

    使用margin:0 auto在standards模式下可以使元素水平居中,但在quirks模式下却会失效,quirk模式下的解决办法,用text-align属性:

   body{text-align:center};#content{text-align:left}

5)quirk模式下设置图片的padding会失效

6)quirk模式下Table中的字体属性不能继承上层的设置

7)quirk模式下white-space:pre会失效


接近标准模式

 

根据 CSS2 的规范维持了“传统的”表单元格的垂直方向大小调整的叫做“接近标准模式”(almoststandards mode) 或者“严格模式”(strictmode) 的第三种兼容性模式,已被在这些浏览器中实施:Safari, Opera 7.5 (和以上), 所有基于 Gecko (自 1.0.1) 的浏览器(比如 Firefox)和 Internet Explorer 8。

“接近标准”模式的渲染和“标准”模式除了一点之外,在所有细节上相匹配。表单元格内部图片的布局采用和“quirks”模式相同的方式被处理,而不是按照标准,这点和例如 Internet Explorer 7 (以及更早)的旧版 (en) 浏览器相当一致。这意味着使用表格内图像片的布局在“quirks”或“接近标准”模式下的浏览器中,比起“标准”模式下,更不至于分崩离析。

 

触发不同渲染模式

 

DOCTYPE,简称为DTD,是英文DocumentType Definition的缩写,中文“文档类型”

DOCTYPE标签是单独出现的

说明:

    文档类型,会使浏览器使用相应标准加载网页并显示

    文档类型定义在HTML文档的第一行,在html标签之前

文档不定义DOCTYPE,浏览器将无法获知HTML或XHTML文档的类型,因此会进入混乱模式。

 

通常,浏览器基于页面中文件类型描述DTD的存在以决定采用哪种渲染模式;如果存在一个完整的 DOCTYPE 则浏览器将会采用标准模式,而如果它缺失则浏览器将会采用怪异模式。例如,一个以如下 DOCTYPE 开始的网页将会触发标准模式:

 

"http://www.w3.org/TR/html4/strict.dtd">

 

如下 DOCTYPE 语法上是无效的,因为它包含公共标识符关键字 PUBLIC 却没有公共标识符(指示所用 HTML 版本的名称),也没有 HTML 文档类型定义的系统标识符 URL。这将会触发怪异模式:

 

 

此外,一个不含任何DOCTYPE 的网页将会以 quirks 模式渲染。

 

对此一个值得一提的例外是微软的 Internet Explorer 6 浏览器,如果 DOCTYPE 之前有一个 XML 声明,不管是否指定完整的DOCTYPE,它就会以 quirks 模式渲染一个页面。因此以如下代码开始的 XHTML 页面会被 IE 6 渲染为 quirks 模式:

 

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

 

在一定程度上,上述代码是有用的,然而它仅仅会对 IE 6 触发怪异模式。

 

如果 DOCTYPE 之前有任何语句,quirks 模式在任何版本的 IE 中(截至 IE 9)同样会被触发。例如,如果一个超文本文件在 DOCTYPE 前包含一个注释或者任何标签,IE (截至 9) 会使用 quirks 模式:

 

"http://www.w3.org/TR/html4/strict.dtd">

 

XML 声明的问题在Internet Explorer 7 中被解决了,在此 XML 声明只是简单的被忽略。然而,为对现存和更早的网页浏览器的最大程度的兼容,万维网联盟,维持 XML 规范的组织,建议 XHTML文件的作者可以考虑省略XML 声明。


Javascript中的区别

Quirks mode的Table of measurements 

点击打开链接

MSDN

DOM中的document有一个属性叫compatMode,其返回值是BackCompat和CSS1Compat,分别对应quirks mode和strict mode。

function detectMode(){

varmode=document.compatMode;

if(mode="BackCompat")

alert("当前以quirks mode的方式渲染页面");

elseif(mode="CSS1Compat")

alert("当前已strict mode的方式渲染页面");

elsealert("浏览器版本不支持compatMode");

}

IE8以前的版本compatMode只取决于DocType,IE8+不建议使用compatMode判断,而建议使用documentMode,http://msdn.microsoft.com/en-US/library/cc196988.aspx

 

常用的浏览器表现模式

IE

IE包括两种模式:标准模式(Standards Mode)与怪异模式或混杂模式(Quirks mode)。

简称为IE(S)与IE(Q)

FireFox

FIreFox包括三种模式:Full Standards Mode、Almost Standards Mode与Quirks Mode。对这三种模式的描述见:Mozilla's DOCTYPE sniffing

Opera

Opera包括三种模式:Quirks、Standards与Almost Standards。对这三种模式的描述见:DOCTYPE Switches supportin Opera

当没有使用DTD声明或者使用HTML4以下(不包括HTML4)的DTD声明时,基本所有的浏览器都是使用Quirks Mode呈现。

 

文档类型的比较

 

Henri Sivonen 编译了一个不同文档类型以及在最常见的浏览器中它们被如何对待的清单,展示了这些情况下,页面是否被渲染为怪异 (Q),标准 (S) 或接近标准 (A) 模式。接近标准模式的判定标准是非标准的表单元格高度的渲染。这个表格应用于Content-Type 为 text/html 的内容。Content-Type 为 application/xhtml+xml 的内容在 Chrome, Firefox, InternetExplorer 9 (以及 10), Safari和 Opera 被渲染为标准模式。Internet Explorer 6, 7 和 8 不支持 application/xhtml+xml 的 Content-Type。

 

Doctype

NS6

Mozilla0.9.5-1.0

IE 8+
Firefox
Chrome
Safari
Opera 7.5+
Netscape 7+
Mozilla 1.0.1+
Konq 3.5+
HTML5spec

IE 7
Opera 7.10

IE 6
Opera 7.0

Mac IE 5

Konq 3.2

Q

Q

Q

Q

Q

Q

Q

HTML 3.2

Q

Q

Q

Q

Q

Q

Q

   

HTML 4.01

Strict

有系统标识符

{{{text}}} S

{{{text}}} S

{{{text}}} S

A

A

A

A

   

无系统标识符

{{{text}}} S

{{{text}}} S

{{{text}}} S

A

A

Q

A

   

Transitional

有系统标识符

{{{text}}} S

{{{text}}} S

A

A

A

A

Q

   

无系统标识符

Q

Q

Q

Q

Q

Q

Q

   

HTML5

Q

{{{text}}} S

{{{text}}} S

A

A

A

?

   

XHTML Basic

有系统标识符且无 XML 声明

{{{text}}} S

{{{text}}} S

{{{text}}} S

A

A

A

A

   

XHTML 1.0

Strict

有系统标识符和 XML 声明

{{{text}}} S

{{{text}}} S

{{{text}}} S

A

Q

A

Q

   

有系统标识符且无 XML 声明

{{{text}}} S

{{{text}}} S

{{{text}}} S

A

A

A

A

   

无系统标识符,也无 XML 声明

{{{text}}} S

{{{text}}} S

{{{text}}} S

A

A

A

?

   

Transitional

有系统标识符且有 XML 声明

{{{text}}} S

{{{text}}} S

A

A

Q

A

Q

   

有系统标识符,无 XML 声明

{{{text}}} S

{{{text}}} S

A

A

A

A

Q

   

无系统标识符,无 XML 声明

{{{text}}} S

{{{text}}} S

A

A

A

A

?

   

XHTML 1.1

有系统标识符和 XML 声明

{{{text}}} S

{{{text}}} S

{{{text}}} S

A

Q

A

Q

   

有系统标识符,无 XML 声明

{{{text}}} S

{{{text}}} S

{{{text}}} S

A

A

A

A

   

Doctype

NS6

Mozilla0.9.5-1.0

IE 8+
Firefox
Chrome
Safari
Opera 7.5+
Netscape 7+
Mozilla 1.0.1+
Konq 3.5+
HTML5spec

IE 7
Opera 7.10

IE 6
Opera 7.0

Mac IE 5

Konq 3.2

   

 

模式验证

 

在绝大多数浏览器,文档对象模型的扩展 document.compatMode 指示当前页面的渲染模式。在标准模式和接近标准模式,document.compatMode 包含值 CSS1Compat,然而在怪异模式该值为 BackCompat。

此外,在 MozillaFirefox 和 Opera 一个给定页面的渲染模式也被指示在“页面信息”的信息框中。而在Internet Explorer 8 及更高版本的 IE 中,文档模式被显示于Internet Explorer开发人员工具中,且可以被用户更改。在 Internet Explorer 中还有 document.documentMode 的私有 Javascript 扩展,其取值为 5, 7, 8, 9, 10 之一的浮点型变量。

 

参考文章及扩展:

IE盒模型缺陷

怪异模式

Quirks mode and strict mode 

IE9的文档模式和Javascript

compatMode property 

DOCTYPE Switches support in Opera Presto2.10  

Mozilla's DOCTYPE sniffing

HTML DOCTYPE文档类型举例说明  

HTML5 Quirks 模式

Mozilla浏览器的怪异模式  

用doctype激活浏览器模式 

Quirks模式与standards模式区别


转载自:http://blog.csdn.net/freshlover/article/details/11616563


推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 本文介绍了腾讯最近开源的BERT推理模型TurboTransformers,该模型在推理速度上比PyTorch快1~4倍。TurboTransformers采用了分层设计的思想,通过简化问题和加速开发,实现了快速推理能力。同时,文章还探讨了PyTorch在中间层延迟和深度神经网络中存在的问题,并提出了合并计算的解决方案。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 突破MIUI14限制,自定义胶囊图标、大图标样式,支持任意APP
    本文介绍了如何突破MIUI14的限制,实现自定义胶囊图标和大图标样式,并支持任意APP。需要一定的动手能力和主题设计师账号权限或者会主题pojie。详细步骤包括应用包名获取、素材制作和封包获取等。 ... [详细]
author-avatar
渤海科技城
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有