不同核心瀏覽器的差異以及瀏覽器渲染(轉)

來源:互聯網
上載者:User

標籤:

一、簡單介紹一下什麼是瀏覽器核心。


瀏覽器最重要或者說核心的部分是“Rendering Engine”,可大概譯為“解釋引擎”,不過我們一般習慣將之稱為“瀏覽器核心”。負責對網頁文法的解釋(如HTML、JavaScript)並渲染(顯示)網頁。 所以,通常所謂的瀏覽器核心也就是瀏覽器所採用的渲染引擎,渲染引擎決定了瀏覽器如何顯示網頁的內容以及頁面的格式資訊。不同的瀏覽器核心對網頁編寫文法的解釋也有不同,因此同一網頁在不同的核心的瀏覽器裡的渲染(顯示)效果也可能不同,這也是網頁編寫者需要在不同核心的瀏覽器中測試網頁顯示效果的原因。

 瀏覽器核心很多,如果加上所有的幾乎沒有什麼人在用的非商業的免費核心,那麼可能大約有10款以上甚至更多,不過通常我們比較常見的大約只有以下四種,下面先簡單介紹一下。 Trident: IE瀏覽器使用的核心,該核心程式在1997年的IE4中首次被採用,是微軟在Mosaic代碼的基礎之上修
改而來的,並沿用到目前的IE9。Trident實際上是一款開放的核心,其介面核心設計的相當成熟,因此才有許多
採用IE核心而非IE的瀏覽器湧現(如 Maxthon、The World 、TT、GreenBrowser、AvantBrowser等)。此外,
為了方便也有很多人直接簡稱其為IE核心(當然也不排除有部分人是因為不知道核心名稱而只好如此說)。由於IE本身的“壟斷性”(雖然名義上IE並非壟斷,但實際上,特別是從Windows 95年代一直到XP初期,就市場佔有率來說IE的確藉助Windows的東風處於“壟斷”的地位)而使得Trident核心的長期一家獨大,微軟很長時間都並沒有更新Trident核心,這導致了兩個後果——一是Trident核心曾經幾乎與W3C標準脫節(2005年),二是Trident核心的大量 Bug等安全性問題沒有得到及時解決,然後加上一些致力於開源的開發人員和一些學者們公開自己認為IE瀏覽器不安全的觀點,也有很多使用者轉向了其他瀏覽器,Firefox和Opera就是這個時候興起的。非Trident核心瀏覽器的市場佔有率大幅提高也致使許多網頁開發人員開始注意網頁標準和非IE瀏覽器的瀏覽效果問題。 Gecko: Netscape6開始採用的核心,後來的Mozilla FireFox (Firefox瀏覽器) 也採用了該核心,Gecko的特點
是代碼完全公開,因此,其可開發程度很高,全世界的程式員都可以為其編寫代碼,增加功能。因為這是個開源
核心,因此受到許多人的青睞,Gecko核心的瀏覽器也很多,這也是Geckos核心雖然年輕但市場佔有率能夠迅速
提高的重要原因。  事實上,Gecko引擎的由來跟IE不無關係,前面說過IE沒有使用W3C的標準,這導致了微軟內部一些開發人員的不滿;他們與當時已經停止更新了的 Netscape的一些員工一起創辦了Mozilla,以當時的Mosaic核心為基礎
重新編寫核心,於是開發出了Geckos。不過事實上,Gecko 核心的瀏覽器仍然還是Firefox (Firefox) 使用者最多,
所以有時也會被稱為Firefox核心。此外Gecko也是一個跨平台核心,可以在Windows、 BSD、Linux和Mac OS X
中使用。 Presto: 目前Opera採用的核心,該核心在2003年的Opera7中首次被使用,該款引擎的特點就是渲染速度的最佳化達到了極致,也是目前公認網頁瀏覽速度最快的瀏覽器核心,然而代價是犧牲了網頁的相容性。 

 實際上這是一個動態核心,與前面幾個核心的最大的區別就在指令碼處理上,Presto有著天生的優勢,頁面的全部或者部分都能夠在回應指令碼事件時等情況下被重新解析。

此外該核心在執行Javascrīpt的時候有著最快的速度,根據在同等條件下的測試,Presto核心執行同等Javascrīpt所需的時間僅有Trident和Gecko核心的約1/3(Trident核心最慢,不過兩者相差沒有多大)。
那次測試的時候因為Apple機的硬體條件和普通PC機不同所以沒有測試WebCore核心。只可惜Presto是商業引擎,使用Presto的除開Opera以外,只剩下NDSBrowser、Wii Internet Channle、Nokia 770網路瀏覽器等,這很大程度上限制了Presto的發展。 Webkit:蘋果公司自己的核心,也是蘋果的Safari瀏覽器使用的核心。 Webkit引擎包含WebCore排版引擎及JavaScriptCore解析引擎,均是從KDE的KHTML及KJS引擎衍生而來,它們都是自由軟體,在GPL條約下授權,同時支援BSD系統的開發。
所以Webkit也是自由軟體,同時開放原始碼。在安全方面不受IE、Firefox的制約,所以Safari瀏覽器在國內還是很安全的。

  限於Mac OS X的使用不廣泛和Safari瀏覽器曾經只是Mac OS X的專屬瀏覽器,這個核心本身應該說市場範圍並不大;但似乎根據最新的瀏覽器調查表明,該瀏覽器的市場甚至已經超過了Opera的Presto了——當然這一方面得益於蘋果轉到x86架構之後的人氣暴漲,另外也是因為Safari 3終於推出了Windows版的緣故吧。

Mac下還有OmniWeb、Shiira等人氣很高的瀏覽器。

  google的chrome也使用webkit作為核心。 

 WebKit 核心在手機上的應用也十分廣泛,例如 Google 的手機 Gphone、 Apple 的 iPhone, Nokia’s Series 60 browser 等所使用的 Browser 核心引擎,都是基於 WebKit。  二、瀏覽器渲染原理(http://hi.baidu.com/zhoumm1008/blog/item/03fa88f97fe5ddebfd037f4b.html)

Web頁面運行在各種各樣的瀏覽器當中,瀏覽器載入、渲染頁面的速度直接影響著使用者體驗簡單地說,頁面渲染就是瀏覽器將html代碼根據CSS定義的規則顯示在瀏覽器視窗中的這個過程。先來大致瞭解一下瀏覽器都是怎麼幹活的:
  1. 使用者輸入網址(假設是個html頁面,並且是第一次訪問),瀏覽器向伺服器發出請求,伺服器返回html檔案;
  2. 瀏覽器開始載入html代碼,發現<head>標籤內有一個<link>標籤引用外部CSS檔案;
  3. 瀏覽器又發出CSS檔案的請求,伺服器返回這個CSS檔案;
  4. 瀏覽器繼續載入html中<body>部分的代碼,並且CSS檔案已經拿到手了,可以開始渲染頁面了;
  5. 瀏覽器在代碼中發現一個<img>標籤引用了一張圖片,向伺服器發出請求。此時瀏覽器不會等到圖片下載完,而是繼續渲染後面的代碼;
  6. 伺服器返回圖片檔案,由於圖片佔用了一定面積,影響了後面段落的排布,因此瀏覽器需要回過頭來重新渲染這部分代碼;
  7. 瀏覽器發現了一個包含一行Javascript代碼的<script>標籤,趕快運行它;
  8. Javascript指令碼執行了這條語句,它命令瀏覽器隱藏掉代碼中的某個

(style.display=”none”)。杯具啊,突然就少了這麼一個元素,瀏覽器不得不重新渲染這部分代碼;
  9. 終於等到了</html>的到來,瀏覽器淚流滿面……
  10. 等等,還沒完,使用者點了一下介面中的“換膚”按鈕,Javascript讓瀏覽器換了一下<link>標籤的CSS路徑;
  11. 瀏覽器召集了在座的各位<span><ul><li>們,“大伙兒收拾收拾行李,咱得重新來過……”,瀏覽器向伺服器請
  求了新的CSS檔案,重新渲染頁面。

 

 

  瀏覽器每天就這麼來來回回跑著,要知道不同的人寫出來的html和css代碼品質參差不齊,說不定哪天跑著跑著就掛掉了。好在這個世界還有這麼一群人——頁面重構工程師,平時挺不起眼,也就幫視覺設計師們切切圖啊改改字,其實背地裡還是幹了不少實事的。

說到頁面為什麼會慢?那是因為瀏覽器要花時間、花精力去渲染,尤其是當它發現某個部分發生了點變化影響了布局,需要倒回去重新渲染,內行稱這個回退的過程叫reflow。


 

   reflow幾乎是無法避免的。現在介面上流行的一些效果,比如樹狀目錄的摺疊、展開(實質上是元素的顯示與隱藏)等,都將引起瀏覽器的 reflow。滑鼠滑過、點擊……只要這些行為引起了頁面上某些元素的佔位面積、定位方式、邊距等屬性的變化,都會引起它內部、周圍甚至整個頁面的重新渲染。通常我們都無法預估瀏覽器到底會reflow哪一部分的代碼,它們都彼此相互影響著。

   reflow問題是可以最佳化的,我們可以盡量減少不必要的reflow。比如開頭的例子中的<img>圖片載入問題,這其實就是一個可以避免的reflow——給圖片設定寬度和高度就可以了。這樣瀏覽器就知道了圖片的佔位面積,在載入圖片前就預留好了位置。

另外,有個和reflow看上去差不多的術語:repaint,中文叫重繪。 如果只是改變某個元素的背景色、文字顏色、邊框顏色等等不影響它周圍或內部布局的屬性,將只會引起瀏覽器repaint。repaint的速度明顯快於 reflow(在IE下需要換一下說法,reflow要比repaint 更緩慢)。

 

 

三、從瀏覽器的渲染原理講CSS效能(http://hi.baidu.com/zhoumm1008/blog/item/03fa88f97fe5ddebfd037f4b.html)

 

平時我們幾乎每天都在和瀏覽器打交道,寫出來的頁面很有可能在不同的瀏覽器下顯示的不一樣。苦逼的前端攻城師們為了相容各個瀏覽器而不斷地去測試和調試,還在腦子中記下各種遇到的BUG及解決方案,而我們好像並沒有去主動地關注和瞭解下瀏覽器的工作原理。如果我們對此做一點瞭解,我想在項目過程中就可以根據它有效避免一些問題以及對頁面效能做出相應的改進。今天我們主要根據瀏覽器的渲染原理對CSS的書寫效能做一點改進(當然還有JS本篇文章暫不考慮,後面的文章會做介紹),下面讓我們一起來揭開瀏覽器的渲染原理這一神秘的面紗吧:

最終決定瀏覽器表現出來的頁面效果的差異是:渲染引擎 Rendering Engine(也叫做排版引擎),也就是我們通常所說的“瀏覽器核心”,負責解析網頁文法(如HTML、JavaScript)並渲染、展示網頁。相同的代碼在不同的瀏覽器呈現出來的效果不一樣,那麼就很有可能是不同的瀏覽器核心導致的。

我們來看一下載入頁面時瀏覽器的具體工作流程(圖一):

(圖一)

1、解析HTML以重建DOM樹(Parsing HTML to construct the DOM tree ):渲染引擎開始解析HTML文檔,轉換樹中的標籤到DOM節點,它被稱為“內容樹”。

2、構建渲染樹(Render tree construction):解析CSS(包括外部CSS檔案和樣式元素),根據CSS選取器計算出節點的樣式,建立另一個樹 —- 渲染樹。

3、布局渲染樹(Layout of the render tree): 從根節點遞迴調用,計算每一個元素的大小、位置等,給每個節點所應該出現在螢幕上的精確座標。

4、繪製渲染樹(Painting the render tree) : 遍曆渲染樹,每個節點將使用UI後端層來繪製。

主要的流程就是:構建一個dom樹,頁面要顯示的各元素都會建立到這個dom樹當中,每當一個新元素加入到這個dom樹當中,瀏覽器便會通過css引擎查遍css樣式表,找到符合該元素的樣式規則應用到這個元素上。

注意了:css引擎尋找樣式表,對每條規則都按從右至左的順序去匹配。 看如下規則:

1 #nav  li {}

看起來很快,實際上很慢,儘管這讓人有點費解#_#。我們中的大多數人,尤其是那些從左至右閱讀的人,可能猜想瀏覽器也是執行從左至右匹配規則的,因此會推測這條規則的開銷並不高。在腦海中,我們想象瀏覽器會像這樣工作:找到唯一的ID為nav的元素,然後把這個樣式應用到直系子項目的li元素上。我們知道有一個ID為nav的元素,並且它只有幾個Li子項目,所以這個CSS選擇符應該相當高效。

事實上,CSS選擇符是從右至左進行匹配的。瞭解這方面的知識後,我們知道這個之前看似高效地規則實際開銷相當高,瀏覽器必須遍曆頁面上每個li元素並確定其父元素的id是否為nav。

1 *{}

額,這種方法我剛寫CSS的也寫過,殊不知這種效率是差到極點的做法,因為*萬用字元將匹配所有元素,所以瀏覽器必須去遍曆每一個元素,這樣的計算次數可能是上萬次!

1 ul#nav{} ul.nav{}

在頁面中一個指定的ID只能對應一個元素,所以沒有必要添加額外的限定符,而且這會使它更低效。同時也不要用具體的標籤限定類選擇符,而是要根據實際的情況對類名進行擴充。例如把ul.nav改成.main_nav更好。

1 ul li li li .nav_item{}

對於這樣的選取器,之前也寫過,最後自己也數不過來有多少後代選取器了,何不用一個類來關聯最後的標籤元素,如.extra_navitem,這樣只需要匹配class為extra_navitem的元素,效率明顯提升了

對此,在CSS書寫過程中,總結出如下效能提升的方案:

  1. 避免使用通配規則      如    *{} 計算次數驚人!只對需要用到的元素進行選擇
  2. 盡量少的去對標籤進行選擇,而是用class     如:#nav li{},可以為li加上nav_item的類名,如下選擇.nav_item{}
  3. 不要去用標籤限定ID或者類選擇符   如:ul#nav,應該簡化為#nav
  4. 盡量少的去使用後代選取器,降低選取器的權重值  後代選取器的開銷是最高的,盡量將選取器的深度降到最低,最高不要超過三層,更多的使用類來關聯每一個標籤元素
  5. 考慮繼承 瞭解哪些屬性是可以通過繼承而來的,然後避免對這些屬性重複指定規則

選用高效的選擇符,可以減少頁面的渲染時間,從而有效提升使用者體驗(頁面越快,使用者當然越喜歡^_^),你可以看一下CSS selectors Test,這個實驗的重點是評估複雜選擇符和簡單選擇符的開銷。也許當你想讓渲染速度最高效時,你可能會給每個獨立的標籤配置一個ID,然後用這些ID寫樣式。那的確會超級快,也超級荒唐!這樣的結果是語義極差,後期的維護難到了極點。

但說到底,CSS效能這東西對於小的項目來講可能真的是微乎其微的東西,提升可能也不是很明顯,但對於大型的項目肯定是有協助的。而且一個好的CSS書寫習慣和方式能夠協助我們更加嚴謹的要求自己。

 

不同核心瀏覽器的差異以及瀏覽器渲染(轉)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.