摘要:重繪元素做了一些不影響排版的改變,比如背景色下劃線等等,只需要重新繪制的過程,叫做重繪。顯然回流帶來的代價大于重繪,因為重繪僅僅是重新畫一遍元素而已,但是重繪是重新計算重新畫。不然這會導(dǎo)致大量地讀寫這個結(jié)點的屬性。
瀏覽器的大概工作流程
以普通的HTML頁面為例:
解析HTML文檔,生成dom樹
解析css產(chǎn)生css規(guī)則樹
解析JavaScript,通過DOM-API來操作dom樹和css規(guī)則樹
通過dom樹和css規(guī)則樹來構(gòu)造渲染樹(rendering tree)
調(diào)用操作系統(tǒng)的GUI接口畫頁面
回流(reflow)和重繪(repaint)回流:
元素的大小尺寸、位置發(fā)生變化時,會重新計算渲染樹,頁面要進行重新排版工作,這個過程即是回流。
重繪:
元素做了一些不影響排版的改變,比如背景色、下劃線等等,只需要重新繪制的過程,叫做重繪。
顯然回流帶來的代價大于重繪,因為重繪僅僅是重新畫一遍元素而已,但是重繪是重新計算+重新畫。
回流的原因:Initial。網(wǎng)頁初始化的時候。
Incremental。一些Javascript在操作DOM Tree時。
Resize。其些元件的尺寸變了
StyleChange。如果CSS的屬性發(fā)生變化了。
Dirty。幾個Incremental的reflow發(fā)生在同一個元素的子樹上。
更具體的說,就是這些常見的操作會引起回流:
調(diào)整窗口大小
字體大小
樣式表變動
元素內(nèi)容變化,尤其是輸入控件
CSS偽類激活,在用戶交互過程中發(fā)生
DOM操作,DOM元素增刪、修改
width, clientWidth, scrollTop等布局寬高的計算
ps:但是瀏覽器并不會在我們一進行上面的操作就進行回流,瀏覽器會積攢一批reflow然后一起進行回流,不過有的操作會讓瀏覽器立馬進行回流,比如resize窗口,改變了頁面默認(rèn)的字體,或者說獲取以下這些值:
offsetTop, offsetLeft, offsetWidth, offsetHeight
scrollTop/Left/Width/Height
clientTop/Left/Width/Height
IE中的 getComputedStyle(), 或 currentStyle
如何減少reflow和repaint避免頻繁的修改樣式,可以將要修改的多個樣式定義為一個class類,然后將類名一次賦值即可
把dom離線操作:
使用documentFragment 對象在內(nèi)存里操作DOM
先把DOM給display:none(有一次reflow),然后你想怎么改就怎么改。比如修改100次,然后再把他顯示出來。
clone一個DOM結(jié)點到內(nèi)存里,然后想怎么改就怎么改,改完后,和在線的那個的交換一下
不要把DOM結(jié)點的屬性值放在一個循環(huán)里當(dāng)成循環(huán)里的變量。不然這會導(dǎo)致大量地讀寫這個結(jié)點的屬性。
為動畫的HTML元件使用fixed或absoult的position,那么修改他們的CSS是不會reflow的,因為脫離了文檔流
參考減少重排與重繪
瀏覽器的渲染原理簡介
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/96499.html
摘要:重繪元素做了一些不影響排版的改變,比如背景色下劃線等等,只需要重新繪制的過程,叫做重繪。顯然回流帶來的代價大于重繪,因為重繪僅僅是重新畫一遍元素而已,但是重繪是重新計算重新畫。不然這會導(dǎo)致大量地讀寫這個結(jié)點的屬性。 瀏覽器的大概工作流程 以普通的HTML頁面為例: 解析HTML文檔,生成dom樹 解析css產(chǎn)生css規(guī)則樹 解析JavaScript,通過DOM-API來操作dom樹和...
摘要:之后,如果渲染樹發(fā)生了變動,那么可能會觸發(fā)回流或重繪中的一個或二者。在書寫時要避免不必要的層級,書寫時避免嵌套過深規(guī)則過于復(fù)雜,尤其是后代選擇器,匹配選擇器也會耗費更多的。 剛?cè)胄星岸说臅r候是不是經(jīng)常看到有文章說盡量不要用CSS通配符*,CSS選擇器層疊最好不要超過三層,HTML少使用table,結(jié)構(gòu)也要盡量簡單一些...這一切說的不無道理,過多的使用確實會造成瀏覽器渲染的性能降低,當(dāng)...
摘要:刨根問底,這里說的成本,到底高在哪兒呢什么是文檔對象模型什么是可能很多人第一反應(yīng)就是等標(biāo)簽至少我是,但要知道,是,是,對象模型,是為提供的。操作具體的成本,說到底是造成瀏覽器回流和重繪,從而消耗資源。 從我接觸前端到現(xiàn)在,一直聽到的一句話:操作DOM的成本很高,不要輕易去操作DOM。尤其是React、vue等MV*框架的出現(xiàn),數(shù)據(jù)驅(qū)動視圖的模式越發(fā)深入人心,jQuery時代提供的強大便...
摘要:刨根問底,這里說的成本,到底高在哪兒呢什么是文檔對象模型什么是可能很多人第一反應(yīng)就是等標(biāo)簽至少我是,但要知道,是,是,對象模型,是為提供的。操作具體的成本,說到底是造成瀏覽器回流和重繪,從而消耗資源。 從我接觸前端到現(xiàn)在,一直聽到的一句話:操作DOM的成本很高,不要輕易去操作DOM。尤其是React、vue等MV*框架的出現(xiàn),數(shù)據(jù)驅(qū)動視圖的模式越發(fā)深入人心,jQuery時代提供的強大便...
摘要:回流重繪及其優(yōu)化渲染過程渲染引擎通過通過網(wǎng)絡(luò)請求接收渲染內(nèi)容解析抽象抽象出布局繪畫抽象渲染引擎的第一步是解析文檔并將解析的元素轉(zhuǎn)換為樹中的實際節(jié)點。 回流、重繪及其優(yōu)化 渲染過程 渲染引擎通過通過網(wǎng)絡(luò)請求接收渲染內(nèi)容 解析HTML抽象DOM tree 抽象出Render tree 布局(layout)render tree 繪畫render tree 抽象DOM tree 渲染引擎...
閱讀 2024·2021-09-30 09:47
閱讀 703·2021-09-22 15:43
閱讀 1981·2019-08-30 15:52
閱讀 2431·2019-08-30 15:52
閱讀 2540·2019-08-30 15:44
閱讀 903·2019-08-30 11:10
閱讀 3372·2019-08-29 16:21
閱讀 3296·2019-08-29 12:19