瀏覽器的重繪與重流-back

什么是reflow?  
當(dāng) DOM 元素的屬性發(fā)生變化 (如 color) 時(shí), 瀏覽器會(huì)通知 render 重新描繪相應(yīng)的元素, 此過程稱為 repaint。

如果該次變化涉及元素布局 (如 width), 瀏覽器則拋棄原有屬性, 重新計(jì)算并把結(jié)果傳遞給 render 以重新描繪頁面元素, 此過程稱為 reflow。
下面情況會(huì)導(dǎo)致reflow發(fā)生
1:改變窗口大小
2:改變文字大小
3:內(nèi)容的改變,如用戶在輸入框中敲字
4:激活偽類,如:hover
5:操作class屬性
6:腳本操作DOM
7:計(jì)算offsetWidth和offsetHeight
8:設(shè)置style屬性

如何減少回流
1:不要通過父級來改變子元素樣式,最好直接改變子元素樣式,改變子元素樣式盡可能不要影響父元素和兄弟元素的大小和尺寸
2:盡量通過class來設(shè)計(jì)元素樣式,切忌用style, 修改多個(gè)樣式屬性時(shí)定義class類代替多次修改style屬性
3:實(shí)現(xiàn)元素的動(dòng)畫,對于經(jīng)常要進(jìn)行回流的組件,要抽離出來,它的position屬性應(yīng)當(dāng)設(shè)為fixed或absolute
4:權(quán)衡速度的平滑。比如實(shí)現(xiàn)一個(gè)動(dòng)畫,以1個(gè)像素為單位移動(dòng)這樣最平滑,但reflow就會(huì)過于頻繁,CPU很快就會(huì)被完全占用。如果以3個(gè)像素為單位移動(dòng)就會(huì)好很多。
5:不要用tables布局的另一個(gè)原因就是tables中某個(gè)元素一旦觸發(fā)reflow就會(huì)導(dǎo)致table里所有的其它元素reflow。在適合用table的場合,可以設(shè)置table-layout為auto或fixed,
6:這樣可以讓table一行一行的渲染,這種做法也是為了限制reflow的影響范圍。
7:css里不要有表達(dá)式expression
8:減少不必要的 DOM 層級(DOM depth)。改變 DOM 樹中的一級會(huì)導(dǎo)致所有層級的改變,上至根部,下至被改變節(jié)點(diǎn)的子節(jié)點(diǎn)。這導(dǎo)致大量時(shí)間耗費(fèi)在執(zhí)行 reflow 上面。
9:避免不必要的復(fù)雜的 CSS 選擇器,尤其是后代選擇器(descendant selectors),因?yàn)闉榱似ヅ溥x擇器將耗費(fèi)更多的 CPU。
10: 盡量不要過多的頻繁的去增加,修改,刪除元素,因?yàn)檫@可能會(huì)頻繁的導(dǎo)致頁面reflow,可以先把該dom節(jié)點(diǎn)抽離到內(nèi)存中進(jìn)行復(fù)雜的操作然后再display到頁面上。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容