vuex中的值變化 頁面重新渲染_淺談瀏覽器的渲染過程,重繪與回流

ce0f647e35d85b2c201da3ee19fdc872.png

瀏覽器的渲染過程
首先,我們先來了解一下瀏覽器的渲染過程是什么樣的,也就是說瀏覽器把一堆代碼呈現到頁面上的過程是什么樣子的,瀏覽器采用流式布局模型(Flow Bsaed Layout),根據下圖,我們可以總結出瀏覽器的渲染步驟為:

65010a6da5288d61686f042db1dcb7b0.png

步驟:
1.解析HTML代碼,生成DOM樹(DOM Tree);解析CSS代碼,生成CSSOM樹(CSS Tree);
2.將DOM樹和CSSOM樹進行結合從而構建起渲染樹(Render Tree);
Render Tree類似于DOM Tree,但存在很大的區別:Render Tree能夠識別樣式,Render Tree中的每個節點都有自己的樣式,而且Render Tree不包含隱藏的節點,比如display:none的節點,因為這些節點不會用于頁面呈現。
3.回流(Layout),根據生成的Render Tree,進行Layout,得到節點的位置、大小;
4.重繪(Painting),根據Render Tree以及回流得到的位置信息,確定各節點的絕對位置,得到各節點的絕對像素;
5.呈現(Display),將像素發送給GPU,展示到頁面上。
由于瀏覽器采用流式布局,對Render Tree的計算通常只需要遍歷一次就可以完成,但是table以及其內部元素除外,他們可能需要多次計算,通常要花三倍同等元素的時間,這也是為什么要避免使用table布局的原因。
————分割線————
步驟2中,渲染樹(Render Tree)是如果構建的呢?

d5d5c6d08607ac96d4ea7ae4ef65a121.png

如上圖所示,總結出的構建步驟為:
1.從DOM樹的根節點開始遍歷每個可見節點;
遍歷的是每個可見節點,那么不可見的節點包括:
(a) 一些不會渲染輸出的節點,比如script、meta、link等;
(b) 一些通過css進行隱藏的節點。比如display:none。注意,利用visibility和opacity隱藏的節點,還是會顯示在渲染樹上的。只有display:none的節點才不會顯示在渲染樹上。
2.對于每個可見的節點,找到CSSOM樹中對應的規則,并應用它們;
3.根據每個可見節點以及其對應的樣式,組合生成渲染樹。
又是怎么組合的呢?
簡單是就是一個匹配的過程,要將每個HTML元素節點與之正確的樣式相匹配。因為節點位置屬性將通過CSS選擇器鏈的優先級來決定,渲染樹中的某個結點可能會同時滿足多個選擇器鏈,這時候就要通過選擇器的優先級來完成屬性的賦值。
這時候,將渲染結點同時滿足的幾個選擇器鏈通過其優先級加權算值,從小到大依次覆蓋渲染結點;而如何確定此渲染結點是否滿足某個選擇器鏈呢?這也是一個逐層判斷的過程:從此渲染結點開始,判斷此結點是否與選擇器鏈表的當前選擇器相匹配。如果匹配,判斷此選擇器與下一個選擇器的關系:如果為NONE,表示本選擇器是選擇器鏈的最后一個,返回成功;如果關系為AND (比如:#id.class),選擇下一個選擇器與本渲染結點繼續比較;如果關系為CHILD,表示本選擇器是下一個選擇器的子結點,返回下一個選擇器與下一個渲染結點的匹配結果;否則,關系為DESCENDANT,選擇器和渲染結點各指向下一個結點,然后將渲染結點繼續回溯,直到第一個滿足回溯后的選擇器的結點,此時將繼續判斷回溯后的選擇器和回溯后的渲染結點是否匹配。
————分割線————
重繪
什么是重繪呢?當Render Tree中的一些元素需要更新屬性,而這些屬性只是影響元素的外觀、風格,而不會影響布局的,比如改變背景顏色等,這就會引起瀏覽器重繪(Painting)。重繪有一定的代價,因為瀏覽器會驗證DOM樹上其他元素的可見性。例如:
某網站首頁頁面中,將藍色框內導航欄的背景顏色變為粉色,其他的不變,并沒有改變整體布局和各個部分的位置,所以此時會引起重繪,不會引起回流。

d706d7a451a0f94f40ad094997320f7b.png

回流
當Render Tree中的部分節點因為元素的尺寸、布局、隱藏等改變而需要重新構建,這就會引起瀏覽器回流(reflow)。每個頁面至少需要一次回流,就是在頁面第一次加載的時候(瀏覽器渲染過程步驟3),因為要第一次構建Render Tree。在回流的時候,瀏覽器會使渲染樹中受到影響的部分失效,并重新構造這部分渲染樹,完成回流后,瀏覽器會重新繪制受影響的部分到屏幕中,即重繪。例如:
某網站首頁頁面中,將藍色框內導航欄直接刪掉,則下面的所有部分會進行上移,整體的布局發生了變化,所以此時會引起回流,接著進行重繪。
在這里引出了回流與重繪的一個最大的區別:
回流一定會引起重繪,重繪不一定會引起回流回流是影響瀏覽器性能的關鍵因素,因為其變化會涉及到部分頁面甚至整個頁面的布局更新。
那么,何時會觸發回流重繪呢?
(a) 添加或刪除可見的DOM元素;
(b) 元素的位置發生變化;
(c) 元素的尺寸發生變化(包括外邊距、內邊框、邊框大小、高度和寬度等);
(d) 內容發生變化,比如文本變化或圖片被另一個不同尺寸的圖片所替代;
(e) 頁面一開始渲染的時候(這肯定避免不了);
(f) 瀏覽器的窗口尺寸變化(因為回流是根據視口的大小來計算元素的位置和大小的)......
————分割線————
優化
上面提到,回流重繪給瀏覽器性能帶來了很大的影響,為了提高性能,可以采取下面的一些措施進行性能優化。
1、瀏覽器優化
現代瀏覽器大多是通過隊列機制來批量更新布局,瀏覽器把修改操作放在一個隊列里面,然后再批量執行,如果是60HZ刷新率的話,至少要16.6ms才會清空隊列。但是當你獲取布局信息的操作的時候,會導致隊列被強制清空,觸發回流重繪以確保返回正確的值,主要包括以下屬性和方法:

  • offsetTop、offsetLeft、offsetWidth、offsetHeight
  • scrollTop、scrollLeft、scrollWidth、scrollHeight
  • clientTop、clientLeft、clientWidth、clientHeight
  • width height
  • getComputedStyle()
  • getBoundingClientRect()
    所以,上述的屬性和方法要避免頻繁使用,最好不用,如果要用,可以想辦法把值緩存下來。

2、減少回流與重繪
CSS

  • 使用 transform 代替 top ;
  • 使用 visibility 代替 dispaly。因為visibility只會引起重繪,而dispaly會引起回流;
  • 避免 table 布局。可能一個小小的改動會導致整個table的重新布局;
  • 盡可能的在DOM樹的最末端改變class;
  • 避免設置多層的內聯樣式,CSS選擇器從右向左匹配查找,避免節點層級太多;
  • 將動畫效果應用到position屬性為absolute或者fixed的元素上,避免影響其他元素布局,這樣只有重繪,同時,控制動畫速度可以用requestAnimationFrame;
  • 避免使用CSS表達式;
  • CSS3硬件加速(GPU加速)
    ......

JS

  • 避免頻繁的操作樣式,最好一次性重寫style屬性,或者將樣式列表定義為class并一次性更改class屬性;
  • 避免頻繁的操作DOM;
  • 避免頻繁讀取會引發回流重繪的屬性;
  • 對有復雜動畫的元素使用絕對定位

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534077.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534077.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534077.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vc 將已有項目打包成dll 并應用于其他項目_.NET混淆器 Dotfuscator使用教程:保護你的應用之存檔報告文件...

Dotfuscator是一款.NET混淆器和壓縮器,防止你的應用程序被反編譯。本篇文章將繼續上一篇文章與大家分享保護應用程序的后續三個部分:存檔報告文件、加強保護和替代方法。存檔報告文件作為構建的一部分,Dotfuscator會生成報告文件(在Dotfuscat…

html文件內容搜索,html讀出文本文件內容

html讀出文本文件內容更新時間:2007年01月22日 00:00:00 作者:Function bytes2BSTR(vIn)strReturn ""For i 1 To LenB(vIn)ThisCharCode AscB(MidB(vIn,i,1))If ThisCharCode strReturn strReturn & Chr(ThisCharCode)ElseNextCharC…

python 定義變量_python-003-變量

1.變量的定義python中,在程序運行時,可以隨著程序的運行更改的量成為變量.簡單理解: 變量就是用來臨時存儲數據的容器.可以認為好比是 逛超市 買面條 使用購物車 裝面條變量 -> 購物車數據 -> 面條2.變量的使用# 第一次輸入一個10 num1 10 # 第二次輸入一個20 num2 20 …

蘋果11是高通基帶嗎_最強對抗!小米11對抗三星、蘋果華為等最高旗艦|喜歡小米嗎?...

哈嘍,您好!我是原呵呵,點點關注吧,更多精彩內容等著您小米很快就會展示了2021年的手機,該公司通常會在2月份推出該季節的首個旗艦,但新的小米米11已向前推進了幾個月,并成為了首個采用驍龍888處…

html 圖片墻效果,基于html5實現的圖片墻效果

溫馨提示:本信息由【金聰采編】搜集整理發布,版權歸原作者及發布者所有,您如有異議請 舉報 或者 版權申訴。本文實例講述了基于html5實現的圖片墻效果,分享給大家供大家參考。具體實現方法如下:這里有一組數據需要用圖…

python split函數 空格_python上手--10行代碼讀懂紅樓夢

取名10行代碼看懂紅樓夢,是將介紹使用python代碼來讀紅樓夢獲取其主要人物。這里的思想就是詞頻統計,通過分析紅樓夢小說文字中出現最多的詞語,來概括說明紅樓夢的核心人物和事情。實際上如果你能跟著往下看,就開始進入了自然語言…

計算機主機溫度,計算機的理想工作溫度和濕度分別是多少

電腦理想的工作溫度在10~35度,相對濕度為30%~80%。說明一點:這個溫濕度是沒有嚴格界定的。日常可以這樣理解:只要人待在那里感覺舒服,電腦也會覺得合適的。電腦對電源也有要求&#…

k8s 安裝nfs_K8s--06 K8s數據持久化

K8s數據持久化數據持久化 Volume介紹Volume介紹:Volume是Pad中能夠被多個容器訪問的共享目錄Kubernetes中的Volume不Pad生命周期相同,但不容器的生命周期丌相關Kubernetes支持多種類型的Volume,并且一個Pod可以同時使用任意多個VolumeVolume類…

matlab為自定義后綴文件設置圖標_【V3.0更新】| 這可能是全網最好用的文件管理神器了......

?點擊關注Excel表哥公眾號使用Excel制作自帶超鏈接的文件目錄索引確實可以很好地幫忙大家管理電腦里的文件。在此分享幾個各行各業朋友們的使用截圖:▲一個硬件工程師朋友的使用截圖▲一個醫院工作人員的數據統計文件管理▲學生朋友用來管理論文文獻▲VBA編程愛好者…

html dom透明度,HTML DOM Style overflow 屬性

Style overflow 屬性Style 對象定義和用法overflow 屬性設置或返回如何處理呈現在元素框外面的內容。語法設置 overflow 屬性:Object.style.overflow"visible|hidden|scroll|auto|inherit"返回 overflow 屬性:Object.style.overflow值描述visi…

#中隊列的數據結構_數據結構與算法拓展(一)

棧與隊列申明:由于篇幅限制,文章可能有些簡略,如果大家想要詳細了解,請一定要百度一下,并閱讀例題,完成習題緒言:計算機科學在過去的數十年內發展飛速,各種新穎的技術紛至沓來&#…

display屬性_Numpy知識點(1)講解實操安裝/屬性/數組創建/運算

# 1、安裝包# pip install numpy #原生python安裝# conda install numpy #Anaconda的安裝# 使用Numpyimport numpy as np a np.arange(15) #生成0-14的一維數組display(a)display( )和print( )都是打印,在大多數編程軟件上都使用print,jupyter notebook中我們可以使用d…

計算機英語短文互譯,中英文互譯的英語短文

在英語學習中,閱讀能力是學習者發展其它語言能力(聽、說、寫、譯)的基礎。閱讀能力的高低,不僅決定了學習者獲取知識和信息的水平,而且在一定程度上也反映出學習者綜合運用英語的能力。小編精心收集了中英文互譯的英語短文,供大家欣賞學習!中英文互譯的英語短文&…

springboot怎么設置多個路徑全部跳轉首頁_SpringBoot(四)—Web開發(二)

這篇文章準備來記錄一下一個restful風格小項目的流程,上篇文章為它做了一個基礎,如果有什么錯誤希望大家能夠指出。目錄首頁國際化登錄攔截器CRUD一、首頁在訪問localhost:8080/的時候,默認訪問首頁在自己配置的SpringMVC的配置類中Configura…

計算機英語六級,英語六級作文范文:計算機

英語六級考試時間越來越近了,所以在備考的時候就更要掌握技巧,勤加練習。在備考英語六級寫作時,學習一篇好的范文,會給復習帶來事半功倍的效果。Using a computer every day can have more negative than positive effects on you…

python軟件_Python自制照片美顏軟件~

下午被一個騙子惡心到了,本來聽公開課聽得好好的,搞得心情極差,于是就中斷了網課,聽聽音樂,寫一下文章吧!前期準備①Python編譯環境以及Python代碼編輯器Pycharm的安裝:請在【微信公眾后臺】找到…

數據集怎么導出_PCA算法 | 數據集特征數量太多怎么辦?用這個算法對它降維打擊...

今天是機器學習專題的第27文章,我們一起來聊聊數據處理領域的降維(dimensionality reduction)算法。我們都知道,圖片格式當中有一種叫做svg,這種格式的圖片無論我們將它放大多少倍,也不會失真更不會出現邊緣模糊的情況。原因也很簡…

html form callback,Promise異步編程模式總結初始化Promise對象統一錯誤處理PromisifyfromCallbackMongoose Promisify...

Promise是JavaScript中的一種異步編程范式, 一個Promise對象表示一個即將完成但還未完成的操作。 鑒于JavaScript中異步和回調的編程風格, Promise模式可以有效地避免『Callback Hell』。Promise 最初有q和bluebird等實現,在ES2015(ES6)提出后…

常用命令_GIT常用命令大全

Git 是一個很強大的分布式版本控制系統。它不但適用于管理大型開源軟件的源代碼,管理私人的文檔和源代碼也有很多優勢。克隆遠程文件:git clone https://gitee.com/abcd/codefile.git projectgit checkout -b dev(本地分支名稱) origin/dev(遠程分支名稱…

nvidia顯示設置不可用_Nvidia顯示設置不可用,您當前未使用連接到NVIDIA GPU的顯示器的解決方法...

相信不少用戶遇到這樣一個問題,就是新購買的臺式機電腦,配置達標的情況下,玩游戲出現卡頓不流暢的現象,準備在NVIDIA控制面板查看是否設置的問題,在打開NVIDIA控制面板的時候,提示了“Nvidia顯示設置不可用…