精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

瀏覽器的渲染原理簡介

開發 前端
看到這個標題大家一定會想到這篇神文《How Browsers Work》,這篇文章把瀏覽器的很多細節講得很細,而且也被翻譯成了中文。

看到這個標題大家一定會想到這篇神文《How Browsers Work》,這篇文章把瀏覽器的很多細節講得很細,而且也被翻譯成了中文。為什么我還想寫一篇呢?因為兩個原因,

  1. 這篇文章太長了,閱讀成本太大,不能一口氣讀完。
  2. 花了大力氣讀了這篇文章后可以了解很多,但似乎對工作沒什么幫助。

所以,我準備寫下這篇文章來解決上述兩個問題。希望你能在上班途中,或是坐馬桶時就能讀完,并能從中學會一些能用在工作上的東西。

瀏覽器工作大流程

廢話少說,先來看個圖:

從上面這個圖中,我們可以看到那么幾個事:

1)瀏覽器會解析三個東西:

  • 一個是HTML/SVG/XHTML,事實上,Webkit有三個C++的類對應這三類文檔。解析這三種文件會產生一個DOM Tree。
  • CSS,解析CSS會產生CSS規則樹。
  • Javascript,腳本,主要是通過DOM API和CSSOM API來操作DOM Tree和CSS Rule Tree.

2)解析完成后,瀏覽器引擎會通過DOM Tree 和 CSS Rule Tree 來構造 Rendering Tree。注意:

  • Rendering Tree 渲染樹并不等同于DOM樹,因為一些像Header或display:none的東西就沒必要放在渲染樹中了。
  • CSS 的 Rule Tree主要是為了完成匹配并把CSS Rule附加上Rendering Tree上的每個Element。也就是DOM結點。也就是所謂的Frame。
  • 然后,計算每個Frame(也就是每個Element)的位置,這又叫layout和reflow過程。

3)最后通過調用操作系統Native GUI的API繪制。

DOM解析

HTML的DOM Tree解析如下:

  1. <html> 
  2. <html> 
  3. <head> 
  4.     <title>Web page parsing</title> 
  5. </head> 
  6. <body> 
  7.     <div> 
  8.         <h1>Web page parsing</h1> 
  9.         <p>This is an example Web page.</p> 
  10.     </div> 
  11. </body> 
  12. </html> 

上面這段HTML會解析成這樣:

下面是另一個有SVG標簽的情況。

CSS解析

CSS的解析大概是下面這個樣子(下面主要說的是Gecko也就是Firefox的玩法),假設我們有下面的HTML文檔:

  1. <doc> 
  2. <title>A few quotes</title> 
  3. <para> 
  4.   Franklin said that <quote>"A penny saved is a penny earned."</quote> 
  5. </para> 
  6. <para> 
  7.   FDR said <quote>"We have nothing to fear but <span>fear itself.</span>"</quote> 
  8. </para> 
  9. </doc> 

于是DOM Tree是這個樣子:

然后我們的CSS文檔是這樣的:

  1. /* rule 1 */ doc { displayblocktext-indent1em; } 
  2. /* rule 2 */ title { displayblockfont-size3em; } 
  3. /* rule 3 */ para { displayblock; } 
  4. /* rule 4 */ [class="emph"] { font-styleitalic; } 

于是我們的CSS Rule Tree會是這個樣子:

注意,圖中的第4條規則出現了兩次,一次是獨立的,一次是在規則3的子結點。所以,我們可以知道,建立CSS Rule Tree是需要比照著DOM Tree來的。CSS匹配DOM Tree主要是從右到左解析CSS的Selector,好多人以為這個事會比較快,其實并不一定。關鍵還看我們的CSS的Selector怎么寫了。

注意:CSS匹配HTML元素是一個相當復雜和有性能問題的事情。所以,你就會在N多地方看到很多人都告訴你,DOM樹要小,CSS盡量用id和class,千萬不要過渡層疊下去,……

#p#

通過這兩個樹,我們可以得到一個叫Style Context Tree,也就是下面這樣(把CSS Rule結點Attach到DOM Tree上):

所以,Firefox基本上來說是通過CSS 解析 生成 CSS Rule Tree,然后,通過比對DOM生成Style Context Tree,然后Firefox通過把Style Context Tree和其Render Tree(Frame Tree)關聯上,就完成了。注意:Render Tree會把一些不可見的結點去除掉。而Firefox中所謂的Frame就是一個DOM結點,不要被其名字所迷惑了

注:Webkit不像Firefox要用兩個樹來干這個,Webkit也有Style對象,它直接把這個Style對象存在了相應的DOM結點上了。

渲染

渲染的流程基本上如下(黃色的四個步驟):

計算CSS樣式

構建Render Tree

Layout – 定位坐標和大小,是否換行,各種position, overflow, z-index屬性 ……

正式開畫

注意:上圖流程中有很多連接線,這表示了Javascript動態修改了DOM屬性或是CSS屬會導致重新Layout,有些改變不會,就是那些指到天上的箭頭,比如,修改后的CSS rule沒有被匹配到,等。

這里重要要說兩個概念,一個是Reflow,另一個是Repaint。這兩個不是一回事。

  • Repaint——屏幕的一部分要重畫,比如某個CSS的背景色變了。但是元素的幾何尺寸沒有變。
  • Reflow——意味著元件的幾何尺寸變了,我們需要重新驗證并計算Render Tree。是Render Tree的一部分或全部發生了變化。這就是Reflow,或是Layout。(HTML使用的是flow based layout,也就是流式布局,所以,如果某元件的幾何尺寸發生了變化,需要重新布局,也就叫reflow)reflow 會從<html>這個root frame開始遞歸往下,依次計算所有的結點幾何尺寸和位置,在reflow過程中,可能會增加一些frame,比如一個文本字符串必需被包裝起來。

下面是一個打開Wikipedia時的Layout/reflow的視頻(注:HTML在初始化的時候也會做一次reflow,叫 intial reflow),你可以感受一下:

 

Reflow的成本比Repaint的成本高得多的多。DOM Tree里的每個結點都會有reflow方法,一個結點的reflow很有可能導致子結點,甚至父點以及同級結點的reflow。在一些高性能的電腦上也許還沒什么,但是如果reflow發生在手機上,那么這個過程是非常痛苦和耗電的

 

所以,下面這些動作有很大可能會是成本比較高的。

  • 當你增加、刪除、修改DOM結點時,會導致Reflow或Repaint
  • 當你移動DOM的位置,或是搞個動畫的時候。
  • 當你修改CSS樣式的時候。
  • 當你Resize窗口的時候(移動端沒有這個問題),或是滾動的時候。
  • 當你修改網頁的默認字體時。

注:display:none會觸發reflow,而visibility:hidden只會觸發repaint,因為沒有發現位置變化。

多說兩句關于滾屏的事,通常來說,如果在滾屏的時候,我們的頁面上的所有的像素都會跟著滾 動,那么性能上沒什么問題,因為我們的顯卡對于這種把全屏像素往上往下移的算法是很快。但是如果你有一個fixed的背景圖,或是有些Element不跟 著滾動,有些Elment是動畫,那么這個滾動的動作對于瀏覽器來說會是相當相當痛苦的一個過程。你可以看到很多這樣的網頁在滾動的時候性能有多差。因為 滾屏也有可能會造成reflow。

基本上來說,reflow有如下的幾個原因:

  • Initial。網頁初始化的時候。
  • Incremental。一些Javascript在操作DOM Tree時。
  • Resize。其些元件的尺寸變了。
  • StyleChange。如果CSS的屬性發生變化了。
  • Dirty。幾個Incremental的reflow發生在同一個frame的子樹上。

好了,我們來看一個示例吧:

  1. var bstyle = document.body.style; // cache 
  2.   
  3. bstyle.padding = "20px"// reflow, repaint 
  4. bstyle.border = "10px solid red"//  再一次的 reflow 和 repaint 
  5.   
  6. bstyle.color = "blue"// repaint 
  7. bstyle.backgroundColor = "#fad"// repaint 
  8.   
  9. bstyle.fontSize = "2em"// reflow, repaint 
  10.   
  11. // new DOM element - reflow, repaint 
  12. document.body.appendChild(document.createTextNode('dude!')); 

當然,我們的瀏覽器是聰明的,它不會像上面那樣,你每改一次樣式,它就reflow或repaint一次。一般來說,瀏覽器會把這樣的操作積攢一批,然后做一次reflow,這又叫異步reflow或增量異步reflow。但是有些情況瀏覽器是不會這么做的,比如:resize窗口,改變了頁面默認的字體,等。對于這些操作,瀏覽器會馬上進行reflow。

#p#

但是有些時候,我們的腳本會阻止瀏覽器這么干,比如:如果我們請求下面的一些DOM值:

  1. offsetTop, offsetLeft, offsetWidth, offsetHeight
  2. scrollTop/Left/Width/Height
  3. clientTop/Left/Width/Height
  4. IE中的 getComputedStyle(), 或 currentStyle

因為,如果我們的程序需要這些值,那么瀏覽器需要返回最新的值,而這樣一樣會flush出去一些樣式的改變,從而造成頻繁的reflow/repaint。

減少reflow/repaint

下面是一些Best Practices:

1)不要一條一條地修改DOM的樣式。與其這樣,還不如預先定義好css的class,然后修改DOM的className。

  1. // bad 
  2. var left = 10
  3. top = 10
  4. el.style.left = left + "px"
  5. el.style.top  = top  + "px"
  6.   
  7. // Good 
  8. el.className += " theclassname"
  9.   
  10. // Good 
  11. el.style.cssText += "; left: " + left + "px; top: " + top + "px;"

2)把DOM離線后修改。如:

  • 使用documentFragment 對象在內存里操作DOM
  • 先把DOM給display:none(有一次reflow),然后你想怎么改就怎么改。比如修改100次,然后再把他顯示出來。
  • clone一個DOM結點到內存里,然后想怎么改就怎么改,改完后,和在線的那個的交換一下。

3)不要把DOM結點的屬性值放在一個循環里當成循環里的變量。不然這會導致大量地讀寫這個結點的屬性。

4)盡可能的修改層級比較低的DOM。當然,改變層級比較底的DOM有可能會造成大面積的reflow,但是也可能影響范圍很小。

5)為動畫的HTML元件使用fixed或absoult的position,那么修改他們的CSS是不會reflow的。

6)千萬不要使用table布局。因為可能很小的一個小改動會造成整個table的重新布局。

幾個工具和幾篇文章

有時候,你會也許會發現在IE下,你不知道你修改了什么東西,結果CPU一下子就上去了到100%,然后過了好幾秒鐘repaint/reflow才完成,這種事情以IE的年代時經常發生。所以,我們需要一些工具幫我們看看我們的代碼里有沒有什么不合適的東西。

  • Chrome下,Google的SpeedTracer是個非常強悍的工作讓你看看你的瀏覽渲染的成本有多大。其實Safari和Chrome都可以使用開發者工具里的一個Timeline的東東。
  • Firefox下這個基于Firebug的叫Firebug Paint Events的插件也不錯。
  • IE下你可以用一個叫dynaTrace的IE擴展。

最后,別忘了下面這幾篇提高瀏覽器性能的文章:

原文鏈接:http://coolshell.cn/articles/9666.html

 

 

 

責任編輯:陳四芳 來源: 酷殼網
相關推薦

2013-05-23 16:01:56

瀏覽器

2020-11-06 15:20:45

瀏覽器前端架構

2022-08-30 09:01:11

瀏覽器渲染前端

2013-11-18 14:42:53

瀏覽器渲染

2012-03-20 11:35:32

傲游手機瀏覽器

2017-03-08 08:31:48

瀏覽器渲染路徑

2013-11-20 10:47:57

瀏覽器渲染html

2017-03-12 10:15:18

瀏覽器DOM樹CSSOM樹

2013-11-20 13:47:43

瀏覽器渲染引擎

2013-11-20 13:04:41

css瀏覽器渲染

2017-10-09 13:39:26

瀏覽器渲染服務器

2018-01-19 14:39:53

瀏覽器頁面優化

2019-01-03 13:09:58

瀏覽器緩存原理

2013-11-18 15:09:34

瀏覽器渲染速度

2022-02-07 21:49:06

瀏覽器渲染chromium

2021-04-19 11:40:15

瀏覽器路徑

2020-03-12 11:29:51

JavaScript瀏覽器語言

2021-04-01 06:23:24

CSS33D3D Web 動畫

2015-02-28 09:39:24

Windows 10Spartan

2019-04-08 10:27:00

渲染瀏覽器DOM
點贊
收藏

51CTO技術棧公眾號

av在线亚洲色图| 黄色免费网站在线| 国产一级一区二区| 亚洲人成亚洲人成在线观看| 欧美国产日韩在线播放| 毛片在线视频| 99免费精品视频| 国产精品嫩草影院久久久| 欧美日韩午夜视频| 久久夜色电影| 欧美日本国产视频| 精品少妇人妻av免费久久洗澡| 国产免费a∨片在线观看不卡| 狠狠色丁香婷婷综合| 91av在线看| 日韩三级久久久| 国产精品毛片久久久| 欧美亚洲图片小说| 僵尸世界大战2 在线播放| 成人动漫在线免费观看| 国产成人免费视频网站| 日本一区二区三区在线播放| 午夜免费激情视频| 国产精品一国产精品| 精品国产人成亚洲区| 国产野外作爱视频播放| av中文字幕在线观看第一页| 国产精品久久久久aaaa| 欧美 日韩 国产在线| www.热久久| 麻豆中文一区二区| 欧洲成人午夜免费大片| 久久99久久久| 午夜精品视频一区二区三区在线看| 亚洲精品黄网在线观看| 欧美一级免费在线| 99久久99九九99九九九| 欧洲亚洲精品在线| 男人和女人啪啪网站| 欧美大片黄色| 亚洲精品成人天堂一二三| 亚洲欧美精品| 成人影院免费观看| 国产亚洲一区二区三区在线观看| 国内精品视频在线播放| 亚洲国产精彩视频| 国产盗摄女厕一区二区三区| 91影院在线免费观看视频| 中国老头性行为xxxx| 媚黑女一区二区| 欧美成人在线免费视频| 男人的午夜天堂| 欧美黄色大片在线观看| 最近更新的2019中文字幕| 亚洲图片另类小说| 国产成人一区| 国产小视频国产精品| 无码h肉动漫在线观看| 国产www免费观看| 蜜桃视频在线观看一区二区| 国产精品www| 波多野结衣二区三区| 日本欧美在线看| 国产人妖伪娘一区91| 国产精品久久久久久免费免熟| 精品一区二区在线视频| 91在线观看免费高清完整版在线观看| 在线视频免费观看一区| 久久激情综合网| 91情侣偷在线精品国产| 午夜精品在线播放| 波多野结衣中文一区| 狠狠色综合色区| 飘雪影视在线观看免费观看| 国产日韩三级在线| 国产精品波多野结衣| av在线免费观看网址| 亚洲成人自拍偷拍| 成人在线观看a| 国外成人福利视频| 日韩欧美视频一区| 最新在线黄色网址| 国产精品羞羞答答在线观看| 久久精品国产v日韩v亚洲| 国产97免费视频| 亚洲麻豆视频| 国产精自产拍久久久久久蜜| a级片免费观看| 成人av电影免费观看| 久久婷婷开心| 丝袜美腿美女被狂躁在线观看| 亚洲欧美一区二区三区国产精品| r级无码视频在线观看| 第四色男人最爱上成人网| 91精品国产综合久久久久久| 182在线视频| 欧美xxxx中国| 97色伦亚洲国产| 在线免费一级片| 99精品视频在线观看免费| 亚洲欧美日韩国产yyy| 国产在线拍揄自揄拍视频| 色又黄又爽网站www久久| 国产一区二区在线观看免费视频| 激情亚洲另类图片区小说区| 一区二区三区久久精品| 国产无精乱码一区二区三区| 免费一级欧美片在线观看| 成人av免费电影| h视频网站在线观看| 香蕉加勒比综合久久| gai在线观看免费高清| 欧洲在线一区| 欧美成在线视频| 成人小视频在线播放| 成人精品电影在线观看| 在线国产精品网| 成人午夜视屏| 精品国精品国产| 成人一级黄色大片| 亚洲少妇诱惑| 国产精品久久久久av福利动漫| 秋霞午夜在线观看| 91国偷自产一区二区开放时间 | 高清精品在线| 欧美精品v国产精品v日韩精品| 人妻熟女aⅴ一区二区三区汇编| 中文字幕免费精品| 国产精品一区二区女厕厕| 三级av在线| 欧美视频专区一二在线观看| 东京热av一区| 午夜精品偷拍| 91天堂在线视频| 日本www在线观看视频| 91国产视频在线观看| 午夜一区二区三区免费| 亚洲乱码视频| 久久波多野结衣| 182在线视频观看| 精品国产乱码久久久久久免费| 国产精品视频一区二区三| 另类的小说在线视频另类成人小视频在线 | 国产www在线| 99视频精品在线| 国产精品专区在线| 精品网站aaa| 性视频1819p久久| 欧美综合视频在线| 亚洲h动漫在线| 欧美一级片黄色| 国产欧美日本| 欧美日韩精品免费观看视一区二区| 久久青草伊人| 亚洲美女福利视频网站| 国产中文字幕视频| 日本一区二区三区在线不卡| 亚洲高清在线免费观看| 日韩成人免费| 91精品免费视频| 日本在线视频www鲁啊鲁| 精品久久久久久无| 亚洲国产精品成人无久久精品| 本田岬高潮一区二区三区| 99在线精品免费视频| 色综合久久中文| 国产精品r级在线| 日本在线观看视频| 欧美一个色资源| 日本熟妇乱子伦xxxx| 99精品视频在线免费观看| 91av在线免费播放| 久久久久av| 国产三级精品在线不卡| 美女视频在线免费| 亚洲午夜精品视频| 国产日韩欧美一区二区东京热| 亚洲一区二三区| 欧美一区二区三区成人精品| 蜜臀精品久久久久久蜜臀| 中文字幕一区二区三区四区五区人| 国产一区二区三区视频在线| 久久久久久伊人| 免费成人av电影| 这里只有精品免费| 99视频在线看| 国产精品午夜免费| 美国黄色一级视频| 日韩电影在线一区| 日韩精品福利片午夜免费观看| 久久久久观看| 国产免费一区二区三区在线观看| 亚洲精品天堂| 国产午夜精品免费一区二区三区| av天堂一区二区三区| 午夜成人免费电影| 一级性生活免费视频| 97久久久精品综合88久久| 久久久久久蜜桃一区二区| 韩国亚洲精品| 亚洲精品电影在线一区| 亚洲成av在线| 久久久亚洲精选| 欧美性猛交xxx乱大交3蜜桃| 亚洲精品在线电影| 亚洲v日韩v综合v精品v| 天堂网免费视频| 国产精品视频看| 性囗交免费视频观看| 激情综合色播激情啊| 69堂免费视频| 欧美午夜在线视频| 一区二区三区四区视频在线观看 | 尤物在线免费视频| 久久网这里都是精品| 国产男女无遮挡猛进猛出| 日本中文在线一区| 欧美 国产 日本| 一区精品久久| 警花观音坐莲激情销魂小说| 精品国产一区探花在线观看| 国产一区二区中文字幕免费看| **国产精品| 国产精品入口免费视| 竹内纱里奈兽皇系列在线观看| 欧美激情三级免费| 成人欧美在线| 精品国产一区二区三区久久狼黑人| 四虎影院在线播放| 欧美精品一区二区三区蜜桃| 国产女18毛片多18精品| 欧美日韩国产片| 日韩乱码一区二区三区| 欧美视频裸体精品| 欧美三级一区二区三区| 亚洲va中文字幕| 精品无码久久久久久久| 亚洲激情第一区| www欧美com| 亚洲男人电影天堂| 91日韩中文字幕| 亚洲精品综合在线| 青春草免费视频| 亚洲综合久久av| 欧美激情国产精品免费| 亚洲资源在线观看| 久久久.www| 亚洲一区二区三区小说| 一区二区三区免费高清视频| 一区二区三区精品视频在线| 久久艹精品视频| 亚洲风情在线资源站| 99免费在线观看| 天天av天天翘天天综合网色鬼国产| 在线免费观看毛片| 午夜精品影院在线观看| 性无码专区无码| 色香色香欲天天天影视综合网| 91在线视频免费播放| 欧美四级电影网| 国产一区二区三区在线观看| 日韩一区二区三区免费观看| 国产夫妻性生活视频| 亚洲成色999久久网站| 日韩一二三四| 中文字幕亚洲综合| av理论在线观看| 高清欧美性猛交| 最新欧美色图| 国产欧美日韩高清| 视频一区中文字幕精品| 精品视频一区二区三区四区| 国产精品欧美三级在线观看| 在线精品日韩| 国产一区二区三区四区老人| 奇米精品一区二区三区| 日韩电影免费一区| 在线a免费观看| 成人av免费网站| 东京热无码av男人的天堂| 一区二区在线观看av| 欧美精品二区三区| 欧美日产在线观看| 手机av免费在线观看| 这里只有精品在线播放| 性欧美video高清bbw| 国产91色在线免费| 久久伊人精品| 老牛影视免费一区二区| 91久久久精品国产| 内射国产内射夫妻免费频道| 久久99精品网久久| 黄色污在线观看| 亚洲欧美日韩小说| 三级视频在线观看| 日韩一区二区中文字幕| 免费理论片在线观看播放老| 久久中文久久字幕| 色8久久影院午夜场| http;//www.99re视频| 国产尤物久久久| 亚洲美免无码中文字幕在线 | 无码任你躁久久久久久老妇| 国产欧美精品一区二区色综合 | 欧美日韩国产精选| 日本激情一区二区| 久久久精品影院| 户外露出一区二区三区| 动漫一区二区在线| 91影院成人| 日韩中文字幕组| 99久久精品国产精品久久| 中国毛片直接看| 在线免费av一区| 午夜影院免费视频| 欧美巨乳美女视频| 免费日韩成人| 日韩精品一区二区三区色偷偷| 极品尤物久久久av免费看| 亚洲黄色片免费看| 国产精品污www在线观看| 六月丁香激情综合| 精品三级av在线| 精品自拍一区| 国产日韩精品综合网站| av亚洲在线观看| 夜夜添无码一区二区三区| 国产一区91精品张津瑜| 呻吟揉丰满对白91乃国产区| 一本到高清视频免费精品| 五月婷婷六月丁香| 久久久久久久国产精品视频| 国产精品一站二站| 一本久道久久综合| 日本人妖一区二区| 日本一卡二卡在线播放| 色呦呦一区二区三区| 欧洲免费在线视频| 日本一区二区三区在线播放| 免费国产自久久久久三四区久久| 久久亚洲中文字幕无码| 成人黄色在线网站| 日韩精品成人在线| 亚洲高清福利视频| 草草在线视频| 久久久久网址| 久久激情婷婷| 久久丫精品忘忧草西安产品| 欧美午夜不卡在线观看免费| gogogo高清在线观看免费完整版| 国产精品视频xxxx| 国产精品麻豆久久| 一级日本黄色片| 亚洲在线观看免费视频| 天堂在线视频观看| 欧洲成人午夜免费大片| 欧美一二区在线观看| 在线观看免费视频高清游戏推荐| 中文字幕一区视频| 国产ts变态重口人妖hd| 韩国v欧美v日本v亚洲| 窝窝社区一区二区| 久久久国产欧美| 中文字幕一区av| 亚洲av无码一区二区乱子伦| 国产做受69高潮| 国产精品欧美三级在线观看| 依人在线免费视频| 亚洲精品欧美综合四区| 姝姝窝人体www聚色窝| 国产成人在线一区| 国产精品久久久久久久久妇女| 丰满少妇中文字幕| 午夜国产精品一区| 午夜免费福利在线观看| 亚洲一区二区中文字幕| 99精品福利视频| 亚洲第一视频区| 精品久久久久99| 裤袜国产欧美精品一区| 国产精品99久久久久久大便| 不卡一区二区在线| 最好看的日本字幕mv视频大全| 精品国产欧美一区二区三区成人| 亚洲日本va午夜在线电影| 777久久久精品一区二区三区| 中文字幕av免费专区久久| 亚洲a视频在线| 国产激情综合五月久久| 欧美xxx在线观看| 国产真实乱人偷精品人妻| 91精品久久久久久久91蜜桃| 成年人黄色大片在线| 综合色婷婷一区二区亚洲欧美国产| 99精品一区二区三区| 99久久99久久久精品棕色圆| 国产999在线观看| 激情亚洲网站| 天堂网av2018| 精品视频久久久|