重繪(repaint)與重排(reflow)

當Render Tree中部分或全部元素的尺寸诵冒、結(jié)構(gòu)沦童、或某些屬性發(fā)生改變時撑碴,瀏覽器重新渲染部分或全部文檔的過程稱為reflow撑教。

什么時候引起重排?

1.頁面渲染初始化

2.DOM樹的結(jié)構(gòu)改變

包括了:

  • 添加或者刪除DOM結(jié)點
  • 元素內(nèi)容變化(文字的數(shù)量醉拓、文字的大小伟姐、圖片的大小收苏、圖片的更換)

3.render樹變化

  • 元素尺寸或位置發(fā)生改變(如padding的修改)
  • display屬性改為可見。
  • 激活CSS偽類(例如::hover)

4. 瀏覽器窗口大小發(fā)生改變(resize事件觸發(fā))

5. 最復(fù)雜的一種:獲取某些屬性愤兵,引發(fā)回流很多瀏覽器會對回流做優(yōu)化鹿霸,他會等到足夠數(shù)量的變化發(fā)生,在做一次批處理回流秆乳。offsetHeight屬性需要返回最新的布局信息懦鼠,因此瀏覽器不得不執(zhí)行渲染隊列中的“待處理變化”并觸發(fā)重排以返回正確的值。

  • offsetTop, offsetLeft, offsetWidth, offsetHeight
  • scrollTop/Left/Width/Height
  • clientTop/Left/Width/Height
  • width,height
  • 調(diào)用了getComputedStyle(), 或者 IE的 currentStyle

回流一定伴隨著重繪矫夷,而重繪卻可以單獨出現(xiàn)

減少回流葛闷?

  • 避免逐項更改樣式憋槐。最好一次性更改style屬性双藕,或者將樣式列表定義為class并一次性更改class屬性。
// 不推薦的寫法:

var ele = document.getElementById('myDiv');
ele.style.borderLeft = '1px';
ele.style.borderRight = '2px';
ele.style.padding = '5px';

// 推薦的寫法:

var ele = document.getElementById('myDiv');
// 1. 重寫style
ele.style.cssText = 'border-left: 1px; border-right: 2px; padding: 5px;';
// 2. add style
ele.style.cssText += 'border-left: 1px;'
// 3. use class
ele.className = 'active';
  • 避免循環(huán)操作DOM阳仔。創(chuàng)建一個documentFragment或div忧陪,在它上面應(yīng)用所有DOM操作,最后再把它添加到window.document近范。
//創(chuàng)建輕量級文檔片段
var fragment = document.createDocumentFragment();
 
//將要加的子節(jié)點寫在fragment上
var li = document.createElement('li');
li.innerHTML = 'apple';
fragment.appendChild(li);
 
var li = document.createElement('li');
li.innerHTML = 'watermelon';
fragment.appendChild(li);
 
//當附加一個fragment到父節(jié)點時嘶摊,實際上被添加的是該fragment的子節(jié)點,而不是片斷本身
document.getElementById('fruit').appendChild(fragment);
  • 避免多次讀取offsetLeft等屬性评矩。無法避免則將它們緩存到變量叶堆。
  • 將復(fù)雜的元素(如動畫)絕對定位或固定定位,使它脫離文檔流斥杜。否則回流代價十分高

display:none和visibility:hidden會產(chǎn)生回流與重繪嗎虱颗?

display:none指的是元素完全不陳列出來,不占據(jù)空間蔗喂,涉及到了DOM結(jié)構(gòu)忘渔,故產(chǎn)生reflow與repaint

visibility:hidden指的是元素不可見但存在,保留空間缰儿,不影響結(jié)構(gòu)畦粮,故只產(chǎn)生repaint

參考:
深入理解瀏覽器的重繪與重排

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市乖阵,隨后出現(xiàn)的幾起案子宣赔,更是在濱河造成了極大的恐慌,老刑警劉巖瞪浸,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件儒将,死亡現(xiàn)場離奇詭異,居然都是意外死亡默终,警方通過查閱死者的電腦和手機椅棺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門犁罩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人两疚,你說我怎么就攤上這事床估。” “怎么了诱渤?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵丐巫,是天一觀的道長。 經(jīng)常有香客問我勺美,道長递胧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任赡茸,我火速辦了婚禮缎脾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘占卧。我一直安慰自己遗菠,他們只是感情好,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布华蜒。 她就那樣靜靜地躺著辙纬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叭喜。 梳的紋絲不亂的頭發(fā)上贺拣,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機與錄音捂蕴,去河邊找鬼譬涡。 笑死,一個胖子當著我的面吹牛启绰,可吹牛的內(nèi)容都是我干的昂儒。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼委可,長吁一口氣:“原來是場噩夢啊……” “哼渊跋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起着倾,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤拾酝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后卡者,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒿囤,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年崇决,在試婚紗的時候發(fā)現(xiàn)自己被綠了材诽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片底挫。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖脸侥,靈堂內(nèi)的尸體忽然破棺而出建邓,到底是詐尸還是另有隱情,我是刑警寧澤睁枕,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布官边,位于F島的核電站,受9級特大地震影響外遇,放射性物質(zhì)發(fā)生泄漏注簿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一跳仿、第九天 我趴在偏房一處隱蔽的房頂上張望诡渴。 院中可真熱鬧,春花似錦塔嬉、人聲如沸玩徊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至泣棋,卻和暖如春胶哲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背潭辈。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工鸯屿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人把敢。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓寄摆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親修赞。 傳聞我的和親對象是個殘疾皇子婶恼,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350