摘要
本文主要讲述了:
- 背景
- 怪异模式
- 标准模式
- 选择机制
- 作用
正文
背景
由于历史原因,在 W3C 制订网页标准之前,曾存在两种事实标准:
- 适用于网景浏览器的网页标准
- 适用于 IE 浏览器的网页标准
为此,浏览器厂商共引入了三种渲染模式来保证兼容性:
- quirks mode 怪异模式
- almost standards mode 准标准模式,也被称作”limited quirks mode”(有限怪异模式)
- full standards mode 完全标准模式,也被称作”no quirks mode”(无怪异模式)
在怪异模式中,浏览器会按照古老浏览器的事实标准去渲染页面
在完全标准模式中,浏览器会按照 W3C 标准去渲染页面
在准标准模式中,浏览器会尽可能地按照 W3C 标准去渲染页面,但此模式中仍存在少量的怪异行为
准标准模式和完全标准模式统称为标准模式
怪异模式
不同浏览器所实现的怪异模式是有差异的。
例如:IE 6-9 的怪异模式实际上是模拟 IE5.5 的行为,而 IE 10-11 的怪异模式则开始趋向于实现由 WHATWG(网页超文本应用技术工作小组)正在制订的怪异模式标准。也正因此,IE 6-9 的怪异模式下的盒模型与 IE 10-11 的怪异模式下的盒模型不同。
示例:IE 6-9 的怪异模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=5" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <style> #foo { width: 100px; height: 100px; padding: 50px; background-color: #f00; } #bar { width: 100px; height: 100px; background-color: #00f; } </style> <div id="foo"></div> <div id="bar"></div> <script> alert(document.compatMode); </script> </body> </html>
|
示例:IE 11 的怪异模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE11" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <style> #foo { width: 100px; height: 100px; padding: 50px; background-color: #f00; } #bar { width: 100px; height: 100px; background-color: #00f; } </style> <div id="foo"></div> <div id="bar"></div> <script> alert(document.compatMode); </script> </body> </html>
|
标准模式
受限于各个浏览器对标准支持程度的不同,不同浏览器所实现的标准模式是有差异的。
选择机制
自动推断
对于 HTML 文档来说,浏览器会根据文档类型声明来决定是采用怪异模式或是标准模式
- 若文档类型声明为
<!DOCTYPE html>
,则浏览器会以完全标准模式渲染页面
- 若文档类型声明不存在,则浏览器会以怪异模式渲染页面
注意:
- 文档类型声明必须置于 HTML 文档的首行。若文档类型声明前还有其他字符(例如:注释或 XML 声明),在 IE9 及以下的浏览器中会触发怪异模式
- 在 HTML5 中,使用文档类型声明的唯一目的就是触发完全标准模式
人为设定
IE8+ 实现了非 HTML 标准的 HTTP 响应头X-UA-Compatible
,用于指定 IE 浏览器使用哪种模式渲染
注意:
- 仅 IE8+支持
- IE 浏览器会缓存
X-UA-Compatible
的值,若频繁变更同一个网页的X-UA-Compatible
的值,必要时候需要重启 IE 浏览器才能看到变更后的效果(清除浏览数据无效)
示例:怪异模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=5" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <style> #foo { width: 100px; height: 100px; padding: 50px; background-color: #f00; } #bar { width: 100px; height: 100px; background-color: #00f; } </style> <div id="foo"></div> <div id="bar"></div> <script> alert(document.compatMode); </script> </body> </html>
|
示例:若文档类型声明存在,IE8 的标准模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <style> #foo { width: 100px; height: 100px; padding: 50px; background-color: #f00; } #bar { width: 100px; height: 100px; background-color: #00f; } </style> <div id="foo"></div> <div id="bar"></div> <script> alert(document.compatMode); </script> </body> </html>
|
示例:若文档类型声明不存在,IE8 的怪异模式
没有
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <style> #foo { width: 100px; height: 100px; padding: 50px; background-color: #f00; } #bar { width: 100px; height: 100px; background-color: #00f; } </style> <div id="foo"></div> <div id="bar"></div> <script> alert(document.compatMode); </script> </body> </html>
|
示例:无论文档类型声明存在与否,IE8 的标准模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <style> #foo { width: 100px; height: 100px; padding: 50px; background-color: #f00; } #bar { width: 100px; height: 100px; background-color: #00f; } </style> <div id="foo"></div> <div id="bar"></div> <script> alert(document.compatMode); </script> </body> </html>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <style> #foo { width: 100px; height: 100px; padding: 50px; background-color: #f00; } #bar { width: 100px; height: 100px; background-color: #00f; } </style> <div id="foo"></div> <div id="bar"></div> <script> alert(document.compatMode); </script> </body> </html>
|
示例:若文档类型声明存在,当前浏览器所能支持的最高的标准模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <style> #foo { width: 100px; height: 100px; padding: 50px; background-color: #f00; } #bar { width: 100px; height: 100px; background-color: #00f; } </style> <div id="foo"></div> <div id="bar"></div> <script> alert(document.compatMode); </script> </body> </html>
|
示例:若文档类型声明不存在,当前浏览器所能支持的最高的怪异模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <style> #foo { width: 100px; height: 100px; padding: 50px; background-color: #f00; } #bar { width: 100px; height: 100px; background-color: #00f; } </style> <div id="foo"></div> <div id="bar"></div> <script> alert(document.compatMode); </script> </body> </html>
|
作用
compat,全称为”compatible”,中文意为兼容
document.compatMode
用于表示文档的渲染模式到底是怪异模式还是标准模式
document.compatMode
有两种取值:
BackCompat
怪异模式
CSS1Compat
标准模式
参考资料
本文对你有帮助?请支持我