DOCTYPE與瀏覽器模式詳解(標准模式&混雜模式)


關於渲染模式:

在多年以前(IE6誕生以前),各瀏覽器都處於各自比較封閉的發展中(基本沒有兼容性可談)。隨着WEB的發展,兼容性問題的解決越來

越顯得迫切,隨即,各瀏覽器廠商發布了按照標准模式(遵循各廠商制定的統一標准)工作的瀏覽器,比如IE6就是其中之一。但是考慮到以

前建設的網站並不支持標准模式,所以各瀏覽器在加入標准模式的同時也保留了混雜模式(即以前那種未按照統一標准工作的模式,也叫怪

異模式)。經過多年的發展,后來又出現了近似標准模式(在一種模式中同時融入標准模式和部分混雜模式的特性,也稱為接近標准模式、

准標准模式、最有限混雜模式)和超級標准模式(近似標准模式、標准模式、超級標准模式三者也共同被稱作標准模式)。因此,瀏覽器的

模式可以分為兩類:標准模式和混雜模式,其中,標准模式又可更嚴格的分為近似標准模式、標准模式、超級標准模式。

 

需要注意的是,不同廠商瀏覽器的標准模式也是有細微差別的(這是標准實現程度的問題)。此外,同品牌不同版本瀏覽器的標准模式也是

有差別的,比如IE6&IE7時代的標准模式在現在看來或許已經不那么標准了(IE8和IE9都在不斷的提高標准的實現程度,因此差距越來越大是

必然的),但盡管如此它們依然叫做標准模式,畢竟它們在那個特定時代那個特定版本中確實是按照盡可能遵循標准的方式工作的。

什么是DOCTYPE:

DOCTYPE,或者稱為 Document Type Declaration(文檔類型聲明,縮寫 DTD)。通常情況下,DOCTYPE 位於一個 HTML 文檔的最前面的

位置,位於根元素 HTML 的起始標簽之前。這樣一來,在瀏覽器解析 HTML 文檔正文之前就可以確定當前文檔的類型,以決定其需要采用的

渲染模式(不同的渲染模式會影響到瀏覽器對於 CSS 代碼甚至 JavaScript 腳本的解析)。

DOCTYPE與各種模式的關系:

混雜模式:

不寫DOCTYPE

近似標准模式:

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

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

標准模式:

<!DOCTYPE html>

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

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

我們可以看到,過渡型或框架型HTML聲明與過渡型或框架型XHTML聲明均可使瀏覽器進入近似標准模式,同時,html5的DOCTYPE聲明和嚴

格型HTML聲明以及嚴格型XHTML聲明則會使瀏覽器進入標准模式。

三種模式下的表現差異:

首先,混雜模式是不可取的,因為其沒有兼容性可言。在IE(IE6~IE9)中,混雜模式即使用IE5.5內核來解析並渲染頁面。其次,近似標准

模式是在盡可能遵循標准的基礎上兼容部分非標准代碼,比如一些已經棄用的標簽等。標准模式則是對統一標准實現最好的模式,它要求標

簽必須閉合(唯一不需要閉合的就是DOCTYPE標簽),不能使用已經廢棄的標簽等等。目前,使用最多的DOCTYPE聲明為過渡型HTML或

XHTML,因為它能最大話的兼容一些老代碼。不過,技術領先的公司(比如google、facebook、twitter等都如此)都已經使用了html5的

DOCTYPE聲明,即<!DOCTYPE html>,它所觸發的模式與嚴格型HTML或嚴格型XHTML所觸發的模式完全相同,但好處是節省代碼且向前兼

容(HTML5時代)。

其它激活混雜模式的情況:

前面已經介紹了,當我們不寫DOCTYPE聲明時,所有瀏覽器都會進入混雜模式。但是也存在一些因其他情況而進入混雜模式的時候,這些情

況都是我們應該避免的,最常見的就是在DOCTYPE聲明前面出現了這些內容:普通文本、HTML 標簽、HTML 注釋、XML 聲明、IE條件注

釋。對於普通文本和HTML標簽,各瀏覽器均進入了混雜模式,這個很好理解,都看到疑似的HTML文檔正文了,瀏覽器就不需要再往下追查

DOCTYPE在哪里了。對於HTML注釋和XML聲明,它們和上面的普通文本和HTML標簽有些差別,它們不會在頁面中展示出來,即不可視。這

時,有的瀏覽器則顯得十分“智能”,非IE瀏覽器均會忽略它們的存在,DOCTYPE 被正確解析。但是在IE6中,DOCTYPE之前的 XML 聲明會導

致頁面進入混雜模式,而如果DOCTYPE之前出現了HTML注釋,則所有IE都會進入混雜模式。有的作者很聰明,他既在DOCTYPE之前加入了

他需要的內容,卻又沒有使IE由於這些內容而進入混雜模式。他可能會這么寫:

 

<![if !IE]><!-- some comments --><![endif]>

<![if false]><!-- some comments --><![endif]>

上面這些IE條件注釋在非IE瀏覽器中,可能完全被忽略,可能被解釋為普通HTML注釋。但是在IE中它們全部消失了,因為這就是IE條件注釋

的作用。所以這也是目前比較合適的在DOCTYPE之前寫點什么又保證所有瀏覽器均為標准模式的做法,但我們仍然不推薦在DOCTYPE之前

加入任何非空白內容。

用JS判斷瀏覽器當前的模式:

document.write(document.compatMode == "CSS1Compat" ? "當前處於標准模式" : "當前處於混雜模式");

From: http://hi.baidu.com/flondon/item/4da1a01c3885967f7b5f2598


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM