浏览器渲染模式:标准模式和怪异模式、为什么需要文档声明 !DOCTYPE?使用 document.body 还是 document.documentElement?

什么是文档声明?

<!DOCTYPE> 声明必须是 HTML 文档的第一行,位于 <html> 标签之前。所有文档的开头都会有文档声明<!DOCTYPE>标签来声明它采用哪种标准来解析当前网页。

<!DOCTYPE> 声明不是 HTML 标签;它是指示 web 浏览器关于页面使用哪个 HTML 版本进行编写的指令。

DTD 是什么?  

DTD:文档类型定义(Document Type Definition)是一套关于标记符的语法规则。DTD 在 <!DOCTYPE> 声明中引用。

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

以上是html4 的文档声明。在声明标签中引用了 DTD 文件。

浏览器渲染的两种模式:

要想写出跨浏览器的CSS,必须知道浏览器解析CSS的两种模式:

  • 标准模式(strict mode) //CSS1Compat
  • 怪异模式(quirks mode) // BackCompat  也叫兼容模式

文档声明和渲染模式的关系(标准模式和怪异模式):

       所谓的标准模式是指,浏览器按W3C标准解析执行代码;怪异模式则是使用浏览器自己的方式解析执行代码,因为不同浏览器解析执行的方式不一样,所以我们称之为怪异模式。浏览器解析时到底使用标准模式还是怪异模式,与你网页中的DTD声明直接相关,DTD声明定义了标准文档的类型(标准模式解析)文档类型,会使浏览器使用相应的方式加载网页并显示,忽略DTD声明,将使网页进入怪异模式(quirks mode)。

        没有文档声明的话大多数浏览器都将会转换到为怪异模式(quirk mode),有些地方会称为混杂模式或兼容模式,这种模式下浏览器会以老版本的浏览器使用的规则来渲染页面,不同浏览器的混杂模式表现不一样

         也就是说,如果在文档开头有文档声明,浏览器就会遵循声明中 DTD 文档标准(html4 以及之前的版本需要在文档声明中引用D TD。html5 的文档声明不需要引用DTD,因为html5 不遵循DTD 标准),进入标准模式 CSS1Compat;

         否则,文档缺少声明或者缺少 DTD 标准,则进入怪异模式(兼容) BackCompat         

没有文档声明,将会进入怪异模式

<html>
    <head>
        <title>认真学习前端</title>
    </head>
    <body>
        <h3>好好学习,天天向上</h3>
    </body>
</html>

       如果你的网页代码不含有任何声明,那么浏览器就会采用怪异模式解析,便是如果你的网页代码含有DTD声明,浏览器就会按你所声明的标准解析。


html 4 的文档声明:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <title>认真学习前端</title>
    </head>
    <body>
        <h3>好好学习,天天向上</h3>
    </body>
</html>
html5 的文档声明:不需引用 DTD 文件

<!DOCTYPE html>
<html>
    <head>
        <title>认真学习前端</title>
    </head>
    <body>
        <h3>good good study day day up</h3>
    </body>
</html>

到底标准模式和怪异模式有什么不同呢?

       Quirks mode-怪异模式、混杂模式、兼容模式(document.compatMode=BackCompat),浏览器使用自己的怪异模式解析渲染页面目的是向后兼容),浏览器都按照自己的方式解析渲染页面,那在不同的浏览器就会显示不同的样式(无<!DOCTYPE html>声明 以HTML5为例)。而且,由于不遵循文档标准,所以对不严格的语法会产生兼容。

      Strict/Standards mode-标准模式、严格模式(document.compatMode=CSS1Compat),浏览器使用W3C的标准解析渲染页面(有<!DOCTYPE html>声明 以HTML5为例) 。

       浏览器都支持两种解析模式,在旧的、没有采用W3C标准的网页中,使用怪异模式解析,可以使页面正常显示;在声明采用标准模式的网页中,使用标准模式解析,可以让页面使用W3C的标准特性


怎么根据不同情况写文档声明?

  • 如果使用html5 写的文档
<!DOCTYPE html>
  • 如果你接手的是一个遗留网页,最初并没有DTD声明,并且使用了很多在XHTML中已经废除的标签,需要向后兼容,那么,我们建议你使用 XHTML兼容模式(也叫过渡模式),声明如下:
<!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">

如何判定现在是标准模式还是怪异模式:

方法一:window.document.compatMode 用来判断当前浏览器采用的渲染方式。

alert(window.document.compatMode) 
//BackCompat  表示怪异模式
//CSS1Compat  表示标准模式

方法二:jquery为我们提供的方法,如下:

//在 Internet Explorer 怪癖模式(QuirksMode)中返回 False
//标准模式 返回 true

alert($.boxModel)  
alert($.support.boxModel)

标准模式(CSS1Compat)、怪异模式(BackCompat) 和 document.body 、document.documentElement 什么关系?  

总结:

两种模式下,提取浏览器的尺寸时,使用的语法不同:

  • 怪异模式(BackCompat)使用 document.body 
  • 标准模式(CSS1Compat)使用 document.documentElement
if (document.compatMode == "BackCompat") { 
    cWidth = document.body.clientWidth; 
    cHeight = document.body.clientHeight; 
    sWidth = document.body.scrollWidth; 
    sHeight = document.body.scrollHeight; 
    sLeft = document.body.scrollLeft; 
    sTop = document.body.scrollTop; 
} 
else { //document.compatMode == "CSS1Compat" 
    cWidth = document.documentElement.clientWidth; 
    cHeight = document.documentElement.clientHeight; 
    sWidth = document.documentElement.scrollWidth; 
    sHeight = document.documentElement.scrollHeight; 
    sLeft = document.documentElement.scrollLeft == 0 ? document.body.scrollLeft :             document.documentElement.scrollLeft; 
    sTop = document.documentElement.scrollTop == 0 ? document.body.scrollTop :     document.documentElement.scrollTop; 
} 

PS:(IE>=9)建议使用 window.pageYOffset 来代替 window.scrollY,使用 window.pageXOffset 代替 window.scrollX

猜你喜欢

转载自blog.csdn.net/weixin_41796631/article/details/89396949