三、優(yōu)化(減少回流、重繪)
瀏覽器本身的優(yōu)化策略:瀏覽器會(huì)維護(hù)1個(gè)隊(duì)列杂曲,把所有會(huì)引起回流庶艾、重繪的操作放入這個(gè)隊(duì)列,等隊(duì)列中的操作到了一定的數(shù)量或者到了一定的時(shí)間間隔擎勘,瀏覽器就會(huì)flush隊(duì)列咱揍,進(jìn)行一個(gè)批處理。這樣就會(huì)讓多次的回流棚饵、重繪變成一次回流重繪煤裙。但有時(shí)候我們寫的一些代碼可能會(huì)強(qiáng)制瀏覽器提前flush隊(duì)列,這樣瀏覽器的優(yōu)化可能就起不到作用了噪漾。當(dāng)你請(qǐng)求向?yàn)g覽器請(qǐng)求一些 style信息的時(shí)候硼砰,就會(huì)讓瀏覽器flush隊(duì)列。
減少對(duì)render tree的操作(合并多次多DOM和樣式的修改)怪与,并減少對(duì)一些style信息的請(qǐng)求夺刑,盡量利用好瀏覽器的優(yōu)化策略
方法:
- 將多次改變樣式屬性的操作合并成一次操作。
2.將需要多次重排的元素分别,position屬性設(shè)為absolute或fixed遍愿,這樣此元素就脫離了文檔流,它的變化不會(huì)影響到其他元素耘斩。例如有動(dòng)畫效果的元素就最好設(shè)置為絕對(duì)定位沼填。 - 在內(nèi)存中多次操作節(jié)點(diǎn),完成后再添加到文檔中去括授。例如要異步獲取表格數(shù)據(jù)坞笙,渲染到頁面〖孕椋可以先取得數(shù)據(jù)后在內(nèi)存中構(gòu)建整個(gè)表格的html片段薛夜,再一次性添加到文檔中去,而不是循環(huán)添加每一行版述。
- 由于display屬性為none的元素不在渲染樹中梯澜,對(duì)隱藏的元素操作不會(huì)引發(fā)其他元素的重排。如果要對(duì)一個(gè)元素進(jìn)行復(fù)雜的操作時(shí)渴析,可以先隱藏它晚伙,操作完成后再顯示。這樣只在隱藏和顯示時(shí)觸發(fā)2次重排俭茧。
- 在需要經(jīng)常取那些引起瀏覽器重排的屬性值時(shí)咆疗,要緩存到變量。