首先要引入一個概念——排版引擎(Layout Engine,Rendering Engine),就是經常上網的人也許都聽說過的瀏覽器內核,負責解析網頁語法(如HTML、JavaScript)並渲染、展示網頁。各品牌瀏覽器的內核是不同的,不同的內核處理同一段代碼的時候思路不同。因此可以說,瀏覽器間內核的差異是產生兼容性問題的根本原因。這就是我們苦逼前端工程師們經常希望瀏覽器大一統的原因了。當然這只是個夢,那好我們回歸現實,下面我將對四種常用的瀏覽器內核進行簡單的介紹。
Trident
Trident(IE內核):該內核程序在1997年的IE4中首次被采用,是微軟在Mosaic代碼的基礎之上修改而來的,並沿用到IE11,也被普遍稱作”IE內核”。Trident實際上是一款開放的內核,其接口內核設計的相當成熟,因此才有許多采用IE內核而非IE的瀏覽器(殼瀏覽器)涌現。由於IE本身的“壟斷性”而使得Trident內核的長期一家獨大,微軟很長時間都並沒有更新Trident內核,這導致了兩個后果——一是Trident內核曾經幾乎與W3C標准脫節(2005年),二是Trident內核的大量 Bug等安全性問題沒有得到及時解決,然后加上一些致力於開源的開發者和一些學者們公開自己認為IE瀏覽器不安全的觀點,也有很多用戶轉向了其他瀏覽器,Firefox和Opera就是這個時候興起的。非Trident內核瀏覽器的市場占有率大幅提高也致使許多網頁開發人員開始注意網頁標准和非IE瀏覽器的瀏覽效果問題。國內大部分瀏覽器(比如360)都是“雙核”甚至是“多核”,其中一個內核是Trident,然后再增加一個其他內核。國內的廠商一般把其他內核叫做“高速瀏覽模式”,而Trident則是“兼容瀏覽模式”,用戶可以來回切換。(補充:IE從版本11開始,初步支持WebGL技術。IE8的JavaScript引擎是Jscript,IE9開始用Chakra,這兩個版本區別很大,Chakra無論是速度和標准化方面都很出色。)
Gecko
Presto是一個由Opera Software開發的瀏覽器排版引擎,目前Opera 7.0~10.00版本使用該款引擎。Presto的特點就是渲染速度的優化達到了極致,它是目前公認的網頁瀏覽速度最快的瀏覽器內核,然而代價是犧牲了網頁的兼容性。
Presto 實際上是一個動態內核,與Trident、Gecko等內核的最大區別就在於腳本處理上,Presto有着天生的優勢,頁面的全部或者部分 都能夠在回應腳本事件時等情況下被重新解析。此外該內核在執行JavaScript時有着最快的速度,根據同等條件下的測試,Presto內核執行同等 JavaScript所需的時間僅有Trident和Gecko內核的約1/3。不過,不足之處在於Presto是商業引擎,使用Presto的除了 Opera以外,只剩下NDS Browser、Nokia 770網絡瀏覽器等,這在很大程度上限制了Presto的發展。 Opera Widget引擎采用的就是Presto引擎。
Webkit
微軟於 2001 年 8 月 27 日發布的 IE6(Internet Explorer 6)增強了對 CSS1 的兼容,這使得 IE6 對 CSS 的解析及渲染與它的前一個版本 IE5.5 有了很大的差別,如對盒模型的理解、表格尺寸的算法等。
為了保持良好的向后兼容性,微軟為用戶提供了一個“開關”,來決定瀏覽器的工作模式,這個“開關”就是頁面頂部的 DTD。
某些 DTD 將使 IE6 工作在“標准兼容模式”(即“標准模式”),這種模式使用了 IE6 最新的處理方式,包括對 CSS1 的兼容及一些 DHTML 方面的增強。
而另一些 DTD,包括不設置 DTD 將使 IE6 工作在“向后兼容模式”(即“混雜模式”),這種模式對頁面的處理是與 IE5.5 保持一致的,這樣就可以保證對一些在 IE5.5 中表現良好的頁面在 IE6 中也能達到同樣的效果。
微軟在后續推出的 IE7、IE8 中,也使用了上述“開關”,與 IE6 一樣,在 IE7、IE8 的“混雜模式”下,對頁面處理方式仍與 IE5.5 一致。因此可以說,IE 系列的“混雜模式”,將瀏覽器的行為凍結在了 IE5.5 這個版本,雖然 IE 各版本的混雜模式也略有區別,但它們的本意都是向后兼容。
隨着時間的推進和標准的進步,IE6、IE7 的“標准模式”逐漸已經變得不夠標准了,2009年3月19日發布的 IE8 重新定義了“標准模式”,再次增強了對標准規范的支持,同時為了保持對 IE7 的兼容,IE8 增加了一種工作模式:“接近標准模式”。於是,IE8 的工作模式就分成了三種:“標准模式”、“接近標准模式”和“混雜模式”。
目前所有主流瀏覽器對於向后兼容問題的處理都與 IE 系列一樣,提供了不同的模式來保證向后兼容。
瀏覽器的工作模式就是在這種背景下誕生的,它很好的解決了瀏覽器對標准支持上的不斷增強及對一些錯誤的修復而導致的向后兼容問題,但也將瀏覽器在不同情況下的表現及行為變得更加復雜多樣。
通過以上的內容,我們可以得出結論:如果一個頁面能使各瀏覽器都工作在“標准模式”下,那么各瀏覽器都將盡量兼容標准,因此各瀏覽器之間表現出的差異是很少的。相反,如果一個頁面使各瀏覽器都工作在“混雜模式”下,那么各瀏覽器都將盡量向后兼容,因此各瀏覽器之間表現出的差異將會最大化。

在編寫一個頁面時,要使用可以觸發各瀏覽器“標准模式”的DTD,並書寫符合規范的代碼,以保證您的頁面在各瀏覽器中可以最大程度的兼容。相信大家看了這些會對瀏覽器的兼容性有更深刻的了解,最起碼知道那些萬惡bug的來源了。