摘要:瀏覽器會使用它來判斷文檔類型,決定使用何種協議來解析,以及切換瀏覽器模式。如果文件代碼不合法,那么瀏覽器解析時便會出一些差錯。瀏覽器的工作流程解析,生成樹,解析生產根據生成的和構建渲染樹根據渲染樹,計算每個節點在屏幕上的位置,尺寸等信息。
什么是DOCTYPE及作用
DTD是一系列的語法規則,用來定義XML或(X)HTML的文件類型。瀏覽器會使用它來判斷文檔類型,決定使用何種協議來解析,以及切換瀏覽器模式。
DOCTYPE是用來聲明文檔類型和DTD規范的,一個主要的作用是文件的合法性驗證。如果文件代碼不合法,那么瀏覽器解析時便會出一些差錯。
瀏覽器的工作流程
解析HTML,生成DOM樹,解析CSS生產CSSOM
根據生成的DOM和CSSOM構建渲染樹Render tree
根據渲染樹,計算每個節點在屏幕上的位置,尺寸等信息。
將渲染樹繪制到屏幕上
注意:渲染對象和Dom元素相對應,但這種對應關系不是一對一的,不可見的Dom元素不會被插入渲染樹,例如head元素。另外,display屬性為none的元素也不會在渲染樹中出現(visibility屬性為hidden的元素將出現在渲染樹中)。
重排(reflow)和重繪(repaint)
當頁面元素的幾何屬性發生改變時會發生重排,當元素的屬性的該變沒有影響到幾何屬性時發生重繪。重排一定會發生重繪,但重繪不一定會引起重排。
什么時候發生重排
添加或刪除可見的DOM元素
元素位置發生該變
元素的尺寸發生該變(包括:外邊距,內邊距,邊框厚度,寬度,高度等屬性)
內容改變,例如文本內容該變,或圖片被另外一張不同尺寸的圖片代替
頁面渲染器初始化
由于每次重排都會產生計算消耗,大多數瀏覽器通過隊列化修改并批量執行來優化重排過程,獲取布局信息的操作會導致隊列刷新,如下面的這些屬性和方法需要返回最新的布局信息,所以瀏覽器會刷新渲染隊列并引發重排,應盡量避免使用。
clientWidth、clientHeight、clientTop、clientLeft
offsetWidth、offsetHeight、offsetTop、offsetLeft
scrollWidth、scrollHeight、scrollTop、scrollLeft
scrollIntoView()、scrollIntoViewIfNeeded()
getComputedStyle()
getBoundingClientRect()
scrollTo()
什么時候發生重繪
當頁面中元素樣式的該變不影響布局時,發生重繪。比如:該變color,background,visibility等
思考下面兩段代碼:
代碼一:
var foo = document.getElementById("fooBar"); foo.style.color = "blue"; foo.style.marginTop = "30px";
代碼二:
var foo = document.getElementById("fooBar"); foo.style.color = "blue"; var margin = parseInt(foo.style.marginTop); foo.style.marginTop = (margin + 10) + "px";
上面兩端代碼分別發生多少次重排和重繪?
代碼一:一次重排和重繪;代碼二:一次重排和一次重排和重繪
為什么會這樣呢?
當修改一個DOM節點時,修改的操作會先緩存到隊列,隊列中的修改會在下次UI線程執行時批量更新。修改過的節點會被標記為‘臟’(Dirty),獲取臟節點的屬性會導致隊列中的更新操作立刻執行。所以第二段代碼的不同之處在于var margin = parseInt(foo.style.marginTop);引發了一次重排。
如何減少重排和重繪的次數
避免對同一個DOM節點進行讀和寫操作的交叉進行。
使用display:none臨時從文檔中移除,添加完元素后在顯示它
使用document fragment
為需要修改的節點創建一個備份,然后對副本進行操作,修改完后用其代替舊節點(cloneNode)
使用position為absolute或fixed的元素創建動畫
window.requestAnimation()
虛擬DOM庫
參考資料:
How browsers work
《高性能JavaScript》
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97950.html
摘要:有人會說,會用就行了,知道渲染原理有必要么其實渲染原理決定著性能優化的方法,只有在了解原理之后,才能完全理解為什么這樣做可以優化性能。性能優化結合渲染原理,通過實際例子,看看如何優化組件。 前言 以下,是我在2018 React Conf 的分享內容,希望對大家有所幫助??梢韵仍诠倬W下載我的ppt對照看,效果更佳哦~。 很多人都使用過React,但是很少人能說出它內部的渲染原理。有人會...
摘要:在中渲染樹中的每個節點即是一個渲染器或者渲染器對象。計算的樣式每個渲染器對象代表一個矩形區域通常是和一個節點的盒模型相對應。坐標系統是相對于根渲染器的。根渲染器的定位為和大小即為瀏覽器窗口的可視化部分比如。渲染器作廢其在屏幕上的矩形區域。 原文請查閱這里,略有刪減,本文采用知識共享署名 4.0 國際許可協議共享,BY Troland。 本系列持續更新中,Github 地址請查閱這里。 ...
摘要:在中渲染樹中的每個節點即是一個渲染器或者渲染器對象。計算的樣式每個渲染器對象代表一個矩形區域通常是和一個節點的盒模型相對應。坐標系統是相對于根渲染器的。根渲染器的定位為和大小即為瀏覽器窗口的可視化部分比如。渲染器作廢其在屏幕上的矩形區域。 原文請查閱這里,略有刪減,本文采用知識共享署名 4.0 國際許可協議共享,BY Troland。 本系列持續更新中,Github 地址請查閱這里。 ...
摘要:在中渲染樹中的每個節點即是一個渲染器或者渲染器對象。計算的樣式每個渲染器對象代表一個矩形區域通常是和一個節點的盒模型相對應。坐標系統是相對于根渲染器的。根渲染器的定位為和大小即為瀏覽器窗口的可視化部分比如。渲染器作廢其在屏幕上的矩形區域。 原文請查閱這里,略有刪減,本文采用知識共享署名 4.0 國際許可協議共享,BY Troland。 本系列持續更新中,Github 地址請查閱這里。 ...
摘要:依舊采取傳統的開發技術棧進行開發,同時在終端的運行體驗不輸。首先來看下前端開發框架目前與構成了三大最流行的前端開發框架,具有組件化以及三大特性,還學習的,引入了狀態管理模塊。 摘要: WEEX依舊采取傳統的web開發技術棧進行開發,同時app在終端的運行體驗不輸native app。其同時解決了開發效率、發版速度以及用戶體驗三個核心問題。那么WEEX是如何實現的?目前WEEX已經完全開...
摘要:道阻且長啊前端面試總結前端面試筆試面試騰訊一面瀏覽器工作原理瀏覽器的主要組件包括用戶界面包括地址欄后退前進按鈕書簽目錄瀏覽器引擎用來查詢及操作渲染引擎的接口渲染引擎渲染界面和是基于兩種渲染引擎構建的,使用自主研發的渲染引擎,和都使用網絡用來 道阻且長啊TAT(前端面試總結) 前端 面試 筆試 面試 騰訊一面 1.瀏覽器工作原理 瀏覽器的主要組件包括: 用戶界面- 包括地址欄、后退/前...
閱讀 2847·2021-09-28 09:36
閱讀 3937·2021-09-22 15:52
閱讀 3630·2021-09-06 15:00
閱讀 1947·2021-09-02 15:40
閱讀 2798·2021-09-02 15:15
閱讀 3454·2021-08-17 10:15
閱讀 2781·2019-08-30 15:53
閱讀 2073·2019-08-29 18:39