有關(guān)javascript的性能優(yōu)化 (repaint和reflow)
repaint(重繪) ,repaint發(fā)生更改時,元素的外觀被改變,且在沒有改變布局的情況下發(fā)生,如改變outline,visibility,background color,不會影響到dom結(jié)構(gòu)渲染。
reflow(渲染),與repaint區(qū)別就是他會影響到dom的結(jié)構(gòu)渲染,同時他會觸發(fā)repaint,他會改變他本身與所有父輩元素(祖先),這種開銷是非常昂貴的,導(dǎo)致性能下降是必然的,頁面元素越多效果越明顯。
何時發(fā)生:
. DOM元素的添加、修改(內(nèi)容)、刪除( Reflow + Repaint)
. 僅修改DOM元素的字體顏色(只有Repaint,因為不需要調(diào)整布局)
. 應(yīng)用新的樣式或者修改任何影響元素外觀的屬性
. Resize瀏覽器窗口、滾動頁面
. 讀取元素的某些屬性(offsetLeft、offsetTop、offsetHeight、offsetWidth、 scrollTop/Left/Width/Height、clientTop/Left/Width/Height、 getComputedStyle()、currentStyle(in IE))
如何避免:
. 先將元素從document中刪除,完成修改后再把元素放回原來的位置
. 將元素的display設(shè)置為”none”,完成修改后再把display修改為原來的值
. 如果需要創(chuàng)建多個DOM節(jié)點,可以使用DocumentFragment創(chuàng)建完后一次性的加入document
var fragment = document.createDocumentFragment();
fragment.appendChild(document.createTextNode('keenboy test 111'));
fragment.appendChild(document.createElement('br'));
fragment.appendChild(document.createTextNode('keenboy test 222'));
document.body.appendChild(fragment);
. 集中修改樣式
4.1盡可能少的修改元素style上的屬性
4.2盡量通過修改className來修改樣式
4.3通過cssText屬性來設(shè)置樣式值
element.style.width=”80px”; //reflow
element.style.height=”90px”; //reflow
element.style.border=”solid 1px red”; //reflow
以上就產(chǎn)生多次reflow,調(diào)用的越多產(chǎn)生就越多
element.style.cssText=”width:80px;height:80px;border:solid 1px red;”; //reflow
4.4緩存Layout屬性值
var left=elem.offsetLeft; 多次使用left也就產(chǎn)生一次reflow
4.5設(shè)置元素的position為absolute或fixed
元素脫離標(biāo)準(zhǔn)流,也從DOM樹結(jié)構(gòu)中脫離出來,在需要reflow時只需要reflow自身與下級元素
4.6盡量不要用table布局
table元素一旦觸發(fā)reflow就會導(dǎo)致table里所有的其它元素 reflow。在適合用table的場合,可以設(shè)置table-layout為auto或fixed,這樣可以讓table一行一行的渲染,這種做法也是為了限制reflow的影響范圍
4.7避免使用expression,他會每次調(diào)用都會重新計算一遍(包括加載頁面)
參考:
Yahoo! 性能工程師 Nicole Sullivan 在最新的文章 《Reflows & Repaints: CSS Performance making your JavaScript slow?》
相關(guān)文章
JavaScript中把數(shù)字轉(zhuǎn)換為字符串的程序代碼
本篇文章是對JavaScript中把數(shù)字轉(zhuǎn)換為字符串的實現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
Javascript基礎(chǔ)教程之?dāng)?shù)據(jù)類型 (布爾型 Boolean)
本文簡單講解了javascript數(shù)據(jù)類型中的布爾型(boolean),十分的簡單,小伙伴們看下就明白了2015-01-01
深入理解JavaScript系列(33):設(shè)計模式之策略模式詳解
這篇文章主要介紹了深入理解JavaScript系列(33):設(shè)計模式之策略模式詳解,策略模式定義了算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化不會影響到使用算法的客戶,需要的朋友可以參考下2015-03-03
JavaScript CSS 修改學(xué)習(xí)第四章 透明度設(shè)置
今天我打算使用一些元素的透明度設(shè)置來實現(xiàn)淡出淡入效果。但是有些瀏覽器對于某些元素的透明度設(shè)置支持不夠。而且要設(shè)置表格的透明度,幾乎在所有的瀏覽器里面都不可能。2010-02-02
javascript學(xué)習(xí)筆記(十五) js間歇調(diào)用和超時調(diào)用
javascript學(xué)習(xí)筆記之js間歇調(diào)用和超時調(diào)用介紹,學(xué)習(xí)js的朋友可以參考下2012-06-06
深入理解JavaScript系列(39):設(shè)計模式之適配器模式詳解
這篇文章主要介紹了深入理解JavaScript系列(39):設(shè)計模式之適配器模式詳解,適配器模式(Adapter)是將一個類(對象)的接口(方法或?qū)傩裕┺D(zhuǎn)化成客戶希望的另外一個接口(方法或?qū)傩裕?需要的朋友可以參考下2015-03-03
Javascript學(xué)習(xí)筆記4 Eval函數(shù)
在初學(xué)JS的時候就知道這個函數(shù),卻一直沒有了解過他的用途,也一直都是睜一只眼閉一只眼,這次來深入地了解一下這個函數(shù)的作用。2010-01-01

