摘要:和渲染過程一個簡單的頁面如上所示。的主要是為了完成匹配并把附加上上的每個。然后,計算每個也就是每個的位置,這又叫和過程。將與合并成一個渲染樹。優(yōu)化關鍵渲染路徑就是指最大限度縮短執(zhí)行上述第步至第步耗費的總時間
DOM和CSS渲染過程 DOM
Document
一個簡單的html頁面如上所示。
DOM有兩個概念:
解析
渲染
DOM解析DOM解析:就是把你所寫的各種html標簽,生成一個DOM TREE,可以認為就是生成了一個最原始的頁面,一點樣式都沒有,毫無CSS修飾。
DOM渲染:瀏覽器會把本身默認的樣式+用戶自己寫得樣式整合到一起,形成一個CSS TREE,而DOM渲染就是指DOM TREE 和 CSS TREE 結(jié)合到一起,生成一個Render TREE,呈現(xiàn)出一個帶有樣式的頁面。
1)瀏覽器會解析三個東西:
一個是HTML/SVG/XHTML,事實上,Webkit有三個C++的類對應這三類文檔。解析這三種文件會產(chǎn)生一個DOM Tree。
CSS,解析CSS會產(chǎn)生CSS規(guī)則樹。
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結(jié)點。也就是所謂的Frame。
然后,計算每個Frame(也就是每個Element)的位置,這又叫l(wèi)ayout和reflow過程。
3)最后通過調(diào)用操作系統(tǒng)Native GUI的API繪制。
js 是單線程,但是瀏覽器是多線程的。
瀏覽器會有不同的線程,比如說
GUI 渲染線程
JS 線程
定時器觸發(fā)線程 (setTimeout)
瀏覽器事件線程 (onclick)
http 異步線程
.....
上面的幾個線程,在同一個瞬間,只有一個線程起作用,也就是互斥的。比如說瀏覽器在執(zhí)行GUI 渲染線程呢,那么其他的4個進程,都處于掛起的狀態(tài),在隊列里面呆著。
DOM的渲染對應的就是GUI渲染進程;JS的執(zhí)行對應的就是JS線程;所以,DOM的渲染與JS代碼的運行,在同一瞬間只能有一個執(zhí)行!
阻塞XXX是指讓XXX暫停了。比如JS的執(zhí)行阻塞DOM解析,就是
DOM解析 --> JS執(zhí)行(此時DOM解析暫停) --> JS執(zhí)行完畢 --> DOM繼續(xù)解析
DOM與CSS先看它倆之間的關系,也就是分析CSS的加載對DOM的解析和渲染的影響。
很明顯,DOM自己在那解析DOM TREE 和 css樣式有啥關系啊,所以css不影響DOM解析。
也很明顯,DOM渲染就是要生成樣式呢,肯定和css有關系啊,所以css影響DOM渲染。
結(jié)論:
css的加載不會阻塞DOM的解析
css的加載會阻塞DOM的渲染
DOM與JSJS(加載和執(zhí)行) 都會阻塞 DOM 的解析,因為JS中可能會對DOM進行操作,可能改變DOM的結(jié)構,所以JS的加載和執(zhí)行是會阻塞DOM解析的。
JS(加載和執(zhí)行) 都會阻塞 DOM 的渲染,同上面一樣,因為JS中可能對樣式進行操作。
注: html中每遇到< script >標簽,頁面就會重新渲染一次,因為要保證標簽中的JS代碼拿到的都是最新的樣式。
結(jié)論:
JS的加載和執(zhí)行會阻塞DOM的解析
JS的加載和執(zhí)行會阻塞DOM的渲染
CSS與JS
在線程那里說了,CSS的加載會阻塞JS的執(zhí)行,因為CSS的渲染GUI線程和JS運行線程互斥。
但是CSS不會阻塞JS的加載(瀏覽器可以預先掃描并下載)
注1:
CSS、JS之間的加載是否阻塞,這里不考慮,因為現(xiàn)代的瀏覽器都會預先偷看文檔,并且下載。
注2:
這里的JS引入方式不包括async和defer
結(jié)論:
CSS的加載阻塞JS的運行,不阻塞JS的加載
Note: 簡單提一句,請注意 visibility: hidden 與 display: none 是不一樣的。前者隱藏元素,但元素仍占據(jù)著布局空間(即將其渲染成一個空框),而后者 (display: none) 將元素從渲染樹中完全移除,元素既不可見,也不是布局的組成部分。
下面簡要概述了瀏覽器完成的步驟:
處理 HTML 標記并構建 DOM 樹。
處理 CSS 標記并構建 CSSOM 樹。
將 DOM 與 CSSOM 合并成一個渲染樹。
根據(jù)渲染樹來布局,以計算每個節(jié)點的幾何信息。
將各個節(jié)點繪制到屏幕上。
優(yōu)化關鍵渲染路徑_就是指最大限度縮短執(zhí)行上述第 1 步至第 5 步耗費的總時間
https://developers.google.com...https://developers.google.com...
https://developers.google.com...
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/54101.html
摘要:和渲染過程一個簡單的頁面如上所示。的主要是為了完成匹配并把附加上上的每個。然后,計算每個也就是每個的位置,這又叫和過程。將與合并成一個渲染樹。優(yōu)化關鍵渲染路徑就是指最大限度縮短執(zhí)行上述第步至第步耗費的總時間 DOM和CSS渲染過程 DOM Document 一個簡單的html頁面如上所示。 DOM有兩個概念: 解析 渲染...
摘要:分享嘉賓簡介新時代布局的分享者是新加坡的國際知名專家陳慧晶。陳慧晶老師的分享主題介紹如下布局經(jīng)常是令前端開發(fā)者頭痛的一塊工作。布局系統(tǒng)在這一小節(jié)中,慧晶老師主要分享了跟這新時代布局的三大棟梁。的首個公開工作草案是在發(fā)布的,而的則是發(fā)布。 作者:陳大魚頭 github: KRISACHAN 記錄原因:2019年3月30日在深圳舉行了第五屆的CSS Conf,魚頭作為一枚CSS新手以及愛好者也...
摘要:分享嘉賓簡介新時代布局的分享者是新加坡的國際知名專家陳慧晶。陳慧晶老師的分享主題介紹如下布局經(jīng)常是令前端開發(fā)者頭痛的一塊工作。布局系統(tǒng)在這一小節(jié)中,慧晶老師主要分享了跟這新時代布局的三大棟梁。的首個公開工作草案是在發(fā)布的,而的則是發(fā)布。 作者:陳大魚頭 github: KRISACHAN 記錄原因:2019年3月30日在深圳舉行了第五屆的CSS Conf,魚頭作為一枚CSS新手以及愛好者也...
摘要:的全稱是統(tǒng)一資源定位符英文,可以這么說,是一種標準,而網(wǎng)址則是符合標準的一種實現(xiàn)而已。渲染器,將組件渲染到頁面上。 0x000 概述 從這一章開始就進入路由章節(jié)了,并不直接從如何使用react-route來講,而是從路由的概念和實現(xiàn)來講,達到知道路由的本質(zhì),而不是只知道如何使用react-route庫的目的,畢竟react-route只是一個庫,是路由的一個實現(xiàn)而已,而不是路由本身。 ...
閱讀 2224·2019-08-30 15:54
閱讀 1960·2019-08-30 13:49
閱讀 679·2019-08-29 18:44
閱讀 834·2019-08-29 18:39
閱讀 1117·2019-08-29 15:40
閱讀 1538·2019-08-29 12:56
閱讀 3151·2019-08-26 11:39
閱讀 3104·2019-08-26 11:37