欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

了解重排與重繪

 更新時間:2019年05月29日 16:45:55   作者:jhhfft  
重繪和重排操作都是代價昂貴的操作,它們會導(dǎo)致web應(yīng)用程序的UI反應(yīng)遲鈍,所以應(yīng)該盡可能減少這類過程的發(fā)生。下面我們來簡單了解一下

前言

瀏覽器下載完頁面中的所有內(nèi)容:HTML、JavaScript、CSS、圖片——之后會解析并生成兩個內(nèi)部數(shù)據(jù)結(jié)構(gòu):

  • DOM樹:表示頁面結(jié)構(gòu)
  • 渲染樹:表示DOM節(jié)點如何顯示

DOM樹中的每一個需要顯示的節(jié)點在渲染樹中至少存在一個對應(yīng)的節(jié)點(隱藏的DOM元素在渲染樹中沒有對應(yīng)的節(jié)點)。渲染樹中的節(jié)點被稱為“幀”或者“盒子”,理解頁面元素為一個具有填充(padding)、邊距(margin)、邊框(border)和位置(position)的盒子。一旦DOM樹和渲染樹構(gòu)建完成,瀏覽器就開始顯示(繪制 paint)頁面元素

當(dāng)DOM的改變影響了元素幾何屬性(例如寬和高)——瀏覽器就需要重新計算元素的幾何特性,同樣其他元素的幾何屬性和位置也會因此受到影響。瀏覽器會使渲染樹中受到影響的部分失效,并重新構(gòu)造渲染樹。這個過程稱為重排(reflow)。完成重排后,瀏覽器會重新繪制受到影響的部分到屏幕中,該過程稱為重繪(repaint)

重繪和重排操作都是代價昂貴的操作,它們會導(dǎo)致web應(yīng)用程序的UI反應(yīng)遲鈍,所以應(yīng)該盡可能減少這類過程的發(fā)生。

引起重排的原因

  • 添加或刪除可見的DOM元素
  • 元素位置改變
  • 元素尺寸改變
  • 內(nèi)容改變(例如:文本改變或圖片被另一個不同尺寸的圖片替代)
  • 頁面渲染初始化
  • 瀏覽器窗口尺寸改變

渲染樹變化的排隊與刷新

由于每次重排都會產(chǎn)生計算消耗,大多數(shù)瀏覽器通過隊列化修改和批量執(zhí)行來優(yōu)化重排過程(將多個重排過程合并成一次)。然而,某些操作會強制刷新隊列并要求隊列中的重排立即執(zhí)行(這樣會使瀏覽器的優(yōu)化策略失效)。

  • 獲取布局信息的操作會導(dǎo)致強制刷新隊列,使得瀏覽器不得不執(zhí)行渲染隊列中的“待處理變化”并觸發(fā)重排以返回正確的值
    • offsetTop,offsetLeft,offsetWidth,offsetHeight
    • scrollTop,scrollLeft,scrollWidth,scrollHeight
    • clientTop,clientLeft,clientWidth,clientHeight
    • getComputedStyle()
  • 優(yōu)化方法:盡量不要在布局信息改變時查詢它,可以在布局信息改變完畢之后再去查詢

最小化重繪和重排

重繪和重排的代價非常昂貴,因此一個好的提高程序響應(yīng)速度的策略就是減少此類操作的發(fā)生。為了減少發(fā)生次數(shù),應(yīng)該合并多次對DOM和樣式的修改,然后一次處理掉。

合并多次對樣式的修改

var el = document.getElementById('myDiv')
el.style.borderLeft = '1px'
el.style.borderRight = '2px'
el.style.padding = '5px'

上面的例子中,存在兩個問題:

  • 每個樣式屬性的改變都會影響元素的集合結(jié)構(gòu),最糟糕的情況下,會導(dǎo)致瀏覽器觸發(fā)三次重排(大部分現(xiàn)代瀏覽器都為此做了優(yōu)化,只會觸發(fā)一次重排)
  • 上面的代碼訪問了4次DOM

優(yōu)化方法:使用cssText屬性,合并所有的改變?nèi)缓笠淮翁幚?/p>

var el = document.getElementById('myDiv')
el.style.cssText +='border-left: 1px; border-right: 2px; padding: 5px;';

批量修改DOM

當(dāng)需要對DOM元素進行一系列操作時,可以通過以下步驟來減少重繪和重排的次數(shù)

1.使元素脫離文檔流

2.對其進行一些列操作

3.把元素帶回文檔中

  • 使元素脫離文檔流的方法:
    • 隱藏元素,施加修改,重新顯示
    • 使用document fragment在當(dāng)前DOM之外構(gòu)建一個子樹,再把它拷貝會文檔
    • 將元素元素拷貝到另一個脫離文檔的節(jié)點中,修改副本,完成后再替換原始元素。

緩存布局信息

在上面的介紹中講到了,瀏覽器通過隊列化修改和批量執(zhí)行的方式減少重排次數(shù)。但是當(dāng)查詢布局信息時(如獲取偏移量、滾動位置、計算出的樣式值),瀏覽器為了返回最新值,會刷新隊列并應(yīng)用所有的變更。因此最好的做法應(yīng)該是盡量減少布局信息的獲取次數(shù),獲取后把它復(fù)制給局部變量,然后再操作局部變量。

IE和:hover

避免在大量元素上使用:hover這種效果。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 關(guān)于JavaScript對象類型之Array及Object

    關(guān)于JavaScript對象類型之Array及Object

    這篇文章主要介紹了關(guān)于JavaScript對象類型之Array及Object,Array 類型是 ECMAScript 中最常用的類型了。而且,ECMAScript 中的數(shù)組與其他多數(shù)語言中的數(shù)組有著相當(dāng)大的區(qū)別,需要的朋友可以參考下
    2023-05-05
  • JavaScript開發(fā)過程中規(guī)范commit?msg意義詳解

    JavaScript開發(fā)過程中規(guī)范commit?msg意義詳解

    這篇文章主要為大家介紹了JavaScript開發(fā)過程中規(guī)范commit?msg意義的內(nèi)容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • 關(guān)于JSON的定義以及如何使用

    關(guān)于JSON的定義以及如何使用

    這篇文章主要介紹了關(guān)于JSON的定義以及如何使用,JSON 的名稱中雖然帶有JavaScript,但這是指其語法規(guī)則是參考JavaScript對象的,而不是指只能用于JavaScript語言,需要的朋友可以參考下
    2023-07-07
  • javascript學(xué)習(xí)筆記(四)function函數(shù)部分

    javascript學(xué)習(xí)筆記(四)function函數(shù)部分

    本文主要介紹了函數(shù)的調(diào)用方式、返回函數(shù)的函數(shù)、創(chuàng)建匿名函數(shù)、javascript創(chuàng)建動態(tài)函數(shù)、回調(diào)函數(shù)、方法和函數(shù)的區(qū)別、js全局函數(shù)、函數(shù)的幾個作用、prototype屬性、高階函數(shù),非常實用,有需要的參考下
    2014-09-09
  • 淺析javascript的間隔調(diào)用和延時調(diào)用

    淺析javascript的間隔調(diào)用和延時調(diào)用

    文章主要通過小實例談?wù)刯avascript的間隔調(diào)用和延時調(diào)用,非常的簡單實用,有需要的小伙伴可以參考下
    2014-11-11
  • 講解JavaScript中for...in語句的使用方法

    講解JavaScript中for...in語句的使用方法

    這篇文章主要介紹了講解JavaScript中for...in語句的使用方法,是JS入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-06-06
  • 簡述JavaScript的正則表達式中test()方法的使用

    簡述JavaScript的正則表達式中test()方法的使用

    這篇文章主要介紹了簡述JavaScript的正則表達式中test()方法的使用,是JS入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-06-06
  • 編寫Js代碼要注意的幾條規(guī)則

    編寫Js代碼要注意的幾條規(guī)則

    大家在編寫js代碼的時候需要注意的一些地方,按照下面的方法,大家就可以盡量的讓你的代碼,更優(yōu)化。
    2010-09-09
  • JavaScript 變量命名規(guī)則

    JavaScript 變量命名規(guī)則

    學(xué)習(xí)js的朋友一定要知道和注意,其實每種語言都有它的命名規(guī)則。
    2009-09-09
  • nodejs中exports與module.exports的區(qū)別詳細(xì)介紹

    nodejs中exports與module.exports的區(qū)別詳細(xì)介紹

    你肯定非常熟悉nodejs模塊中的exports對象,你可以用它創(chuàng)建你的模塊接下來介紹創(chuàng)建過程,感興趣的朋友可以參考下
    2013-01-01

最新評論