以前一直沒有注意過這個問題,這次是因為公司的項目把html的聲明
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
給注視掉了,才出現了這個問題,如果有這個聲明瀏覽器都是按照w3c的標准來解析元素布局模式的。公司因為有特殊的需求,自定義了很多東西,不想瀏覽器嚴格按照標准解析,就把這個給注視掉了。正因為這樣,讓我摸不着頭腦怎么回事,不同瀏覽器里明明stlye都一樣,div元素大小卻不一樣。現在知道怎么回事了。
IE和W3C分別有一套盒子模型,Firefox中采用W3C標准模型,而IE中則采用Microsoft自己的標准,
看下面2個示例圖:
很明顯,W3C標准認為,盒子的寬度僅僅是內容的寬度,而IE標准認為“內容+padding+border”才是盒子的寬度。
IE和W3C分別有一套盒子模型,Firefox中采用W3C標准模型,而IE中則采用Microsoft自己的標准,
看下面2個示例圖:
很明顯,W3C標准認為,盒子的寬度僅僅是內容的寬度,而IE標准認為“內容+padding+border”才是盒子的寬度
我們可以將用CSS Hack 來區分2個標准:(具體參見css Hack 說明,利用不同瀏覽器識別css特殊符號能力不同來定義css)
另外,如果在定義HTML使用了<!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”> 那么就不會有這個問題,所有的Box模型都將使用W3C標准,不管是在IE中還是其他瀏覽器中。
-----------------------------------------------------
瀏覽器的兩種模式quirks mode(怪異模式)和strict mode(嚴格格式)
1、quirks mode和strict mode是瀏覽器解析css的兩種模式,或者可以稱之為解析方法。目前正在使用的瀏覽器這兩種模式都支持 。
2、歷史原因。
當早期的瀏覽器Netscape 4和Explorer 4對css進行解析時,並未遵守W3C標准,這時的解析方式就被我們稱之為quirks mode(怪異模式),但隨着W3C的標准越來越重要,眾多的瀏覽器開始依照W3C標准解析CSS,仿照W3C標准解析CSS的模式我們叫做strict mode(嚴格模式).
3、后來的瀏覽器雖然支持strict mode,但眾多瀏覽器並未放棄支持quirks mode。
一個重要的原因就是為了之前大量在quirks mode下開發的網頁能夠得到正確的顯示。所以,這些支持兩種模式的瀏覽器當拿到一張網頁時,所做的一個前期工作就是判斷采取何種方式進行解析(判斷條件后面會說)。
4、瀏覽器如何判斷何用哪種方式解析CSS?
解決方案就是采用doctype聲明,大多數瀏覽器采用下面的這些判斷規則
- 瀏覽器要使老舊的網頁正常工作,但這部分網頁是沒有doctype聲明的,所以瀏覽器對沒有doctype聲明的網頁采用quirks mode解析。
- 對於擁有doctype聲明的網頁,什么瀏覽器采用何種模式解析,這里有一張詳細列表可參考:http://hsivonen.iki.fi/doctype/
- 對於擁有doctype聲明的網頁,這里有幾條簡單的規則可用於判斷:
對於那些瀏覽器不能識別的doctype聲明,瀏覽器采用strict mode解析
在doctype聲明中,沒有使用DTD聲明或者使用HTML4以下(不包括HTML4)的DTD聲明時,基本所有的瀏覽器都是使用quirks mode呈現,其他的則使用strict mode解析。
可以這么說,在現有有doctype聲明的網頁,絕大多數是采用strict mode進行解析的。
quirks mode和strict mode最大的不同就是提現在對盒模式的解釋上,上面已經提到了就不重復了。
5、在js中如何判斷當前瀏覽器正在以何種方式解析?
document對象有個屬性compatMode ,它有兩個值:
BackCompat 對應quirks mode
CSS1Compat 對應strict mode
就是沒有注意這個,發現ie打開項目的網頁都是默認用quirks模式,導致頁面亂掉,加上聲明后就好了。之前還在根據不同瀏覽器在js里,在css來做判斷進行樣式的調整,廢了不少力,現在把這個加上就規范得多了,不用弄得那么復雜,以后產品開發人員自定義開發的時候也簡單了。