公開課二、瀏覽器渲染原理之DOM的重繪和回流 ------ 2020-03-07

1、定義:

/**
(1)重繪(Repaint):元素樣式的改變(但寬高、大小、位置等不變);
    例如:outline/visbility/color/background-color等;

(2)回流(Reflow):元素的大小或者位置發(fā)生了變化(當(dāng)前頁面布局和幾何
信息發(fā)生變化的時候,觸發(fā)了重新布局,導(dǎo)致渲染樹重新計算布局
和渲染);
   例如:添加或者刪除可見的DOM元素;元素的位置發(fā)生變化;元素的
尺寸發(fā)生變化;內(nèi)容發(fā)生變化(比如文本變化或圖片被另一個不同尺寸的
圖片所代替);頁面一開始渲染的時候(這個無法避免);因為回流是根
據(jù)視口大小來計算元素的位置和大小的,所以瀏覽器的窗口尺寸變化也會
引發(fā)回流......

注意:回流一定會觸發(fā)重,但是重繪不一定回流;
*/

2、基于DOM的重繪和回流之前端性能優(yōu)化:

/**
(1)放棄傳統(tǒng)操作DOM的時代,基于vue/react開始數(shù)據(jù)影響視圖模式;
mvvm / mvc / virtual dom / dom diff

(2)分離讀寫操作(現(xiàn)代瀏覽器都有渲染隊列的機(jī)制)
offsetTop、offsetLeft、offsetWidth、offsetHeight、clientTop、
clientLeft、clientWidth、clientHeight、scrollTop、scrollLeft、
scrollWidth、scrollHeight、getComputedStyle、currentStyle...
都會刷新渲染隊列;
el.style.width = ‘10px’;
el.style.height= ‘10px’;
el.style.margin= ‘10px’;
console.log(‘el.clientWidth’);
分離讀寫就是指不要講讀取元素的上述的樣式等和修改樣式摻雜,因為讀取
樣式操作會立馬刷新瀏覽器的渲染隊列,可能會導(dǎo)致多次重繪和回流;

(3)樣式集中改變(批量處理):
修改樣式時,盡可能做到將樣式集中在一起修改:
el.style.cssText = ‘width:10px;height:20px’;(這種方式基本不用);
box.className = ‘changeClass’;

(4)緩存布局信息:
el.style.width = el.clientWidth + 10 + ‘px’;
el.style.height= el.clientHeight + 10 + ‘px’;
這種方式會引發(fā)兩次重繪和回流,因為讀寫操作未分離;

這就是緩存布局信息
var a = el.clientWidth;
var b = el.clientHeight;
el.style.width = a + 10 + ‘px’;
el.style.height= b + 10 + ‘px’;

(5)元素批量修改:
var str = ``;
for (let i = 0; i < 5; i++) {
   str += `<li></li>`
}
el.innerHtml = str;

(6)動畫效果應(yīng)用到position屬性為absolute或fixed的元素上(脫離文檔流
可以盡可能的減少重繪和回流的影響);

(7)CSS3硬件加速(GPU加速):
比起考慮如果減少回流重繪,我們更期望的是,根本不會產(chǎn)生回流重繪;
transform / opacity / filters ....
這些屬性會觸發(fā)硬件加速,硬件加速規(guī)避回流和重繪;

(8)犧牲平滑度換取速度:

(9)避免table布局和使用css的JavaScript表達(dá)式:
*/
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)送 & 接收信息 數(shù)據(jù)是以“數(shù)據(jù)包”的形式通過互聯(lián)網(wǎng)發(fā)送,而數(shù)據(jù)包以字節(jié)為單位。當(dāng)你編寫一些 HTML、CSS ...
    IT界中小PQ閱讀 437評論 0 0
  • 一、認(rèn)識瀏覽器內(nèi)核Trident(IE)Gecko(火狐)Blink(Chrome、Opera)Webkit(Sa...
    chan7788閱讀 359評論 0 0
  • 發(fā)送 & 接收信息 數(shù)據(jù)是以“數(shù)據(jù)包”的形式通過互聯(lián)網(wǎng)發(fā)送,而數(shù)據(jù)包以字節(jié)為單位。當(dāng)你編寫一些 HTML、CSS ...
    mongofeng閱讀 1,130評論 0 0
  • 頁面重繪和回流以及優(yōu)化 在討論頁面重繪、回流之前。需要對頁面的呈現(xiàn)流程有些了解,頁面是怎么把html結(jié)合css等顯...
    sponing閱讀 2,136評論 1 11
  • 背景(做前端永遠(yuǎn)也跨不過去了就是性能優(yōu)化) 公司目前有大量前后端耦合項目,瀏覽器的首屏加載速度非常的慢,在不段優(yōu)化...
    天一呀閱讀 1,212評論 0 4

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