重繪(repaint)與回流(重排 reflow)

頁(yè)面呈現(xiàn)流程

  1. 瀏覽器會(huì)將獲取到的HTML代碼解析成一個(gè)DOM樹(shù)(包括display: none的元素)
  2. 在DOM樹(shù)的基礎(chǔ)上根據(jù)節(jié)點(diǎn)的幾何屬性(margin/padding/width/height等)生成render樹(shù)(不包括display: none、head節(jié)點(diǎn)但是會(huì)包含visibility:hidden節(jié)點(diǎn))
  3. 在render樹(shù)的基礎(chǔ)上進(jìn)一步渲染樣式


    微信圖片_20190227175527.png

repaint、reflow概念

回流(reflow):當(dāng)render樹(shù)種的元素因?yàn)榇笮≡彻妫季殖挠悖[藏买喧、增減等原因而引起的重建叫做回流
重繪(repaint):當(dāng)元素的一部分屬性發(fā)生變化的時(shí)候,會(huì)影響外觀但是不會(huì)引起布局變化(比如background-color)而重新渲染的過(guò)程叫重繪

引起回流的原因

  1. 頁(yè)面初始化渲染
  2. DOM節(jié)點(diǎn)的增加和刪除
  3. 元素位置發(fā)生改變
  4. 元素幾何屬性發(fā)生變化 - border匆赃、width淤毛、height、padding算柳、margin
  5. 瀏覽器窗口發(fā)生變化(resize)
  6. 獲取某些屬性 - offsetTop低淡、offsetLeft、offsetWidth瞬项、offsetHeight蔗蹋、scrollTop、scrollLeft囱淋、scrollWidth猪杭、scrollHeight、clientTop妥衣、clientLeft皂吮、clientWidth、clientHeight税手、getComputedStyle() (currentStyle in IE)
var s = document.body.style;
s.padding = "2px"; // 回流 + 重繪
s.border = "1px solid red"; // 再一次 回流+重繪
s.color = "blue"; // 再一次重繪
s.backgroundColor = "#ccc"; // 再一次 重繪
s.fontSize = "14px"; // 再一次 回流+重繪
// 添加node蜂筹,再一次 回流+重繪
document.body.appendChild(document.createTextNode('abc!'));

上面代碼一共引起了4次回流和6次重繪,但是瀏覽器并不會(huì)每一條js語(yǔ)句就執(zhí)行一次芦倒,而是等隊(duì)列中的操作到了一定的數(shù)量或者到了一定的時(shí)間間隔艺挪,瀏覽器就會(huì)flush對(duì)象,進(jìn)行批量處理兵扬,這樣就會(huì)讓多次回流麻裳、重繪變成一次回流重繪。
當(dāng)我們?nèi)カ@取第六點(diǎn)那些屬性的時(shí)候周霉,瀏覽器為了能給你返回一個(gè)比較精確的答案掂器,他會(huì)提前flush隊(duì)列,因?yàn)殛?duì)列中可能會(huì)有影響這些值的操作俱箱,所以獲取這些屬性也會(huì)引起回流

優(yōu)化

  1. 使用class將多次改變樣式屬性的操作合并成一次操作
var changeDiv = document.getElementById('changeDiv'); 
changeDiv.style.color = '#093'; 
changeDiv.style.background = '#eee'; 
changeDiv.style.height = '200px';
// 可以添加一個(gè)class
div.changeDiv {
background: #eee;
color: #093;
height: 200px;
}
為這個(gè)節(jié)點(diǎn)添加這個(gè)className
document.getElementById('changeDiv').className = 'changeDiv';
  1. 讓要操作的元素進(jìn)行"離線處理"国瓮,處理完后一起更新
    a)使用DocumentFragment進(jìn)行緩存操作,引發(fā)一次回流和重繪
    b)使用display:none狞谱,如果要對(duì)一個(gè)元素進(jìn)行復(fù)雜操作乃摹,可以先隱藏他,操作完成之后在顯示跟衅,這樣只引發(fā)兩次回流和重繪
    c)使用cloneNode(true/false)和replaceChild孵睬,引發(fā)一次回流和重繪
  2. 將需要多次重排的元素,position屬性設(shè)置為absolute或者fixed伶跷,這樣此元素會(huì)脫離文檔流掰读,他的變化不會(huì)影響到其他元素秘狞。例如有動(dòng)畫效果的元素最好設(shè)置為絕對(duì)定位。
  3. 在內(nèi)存中多次操作節(jié)點(diǎn)蹈集,可以一起操作完成之后再添加到文檔中去烁试。
  4. 在需要經(jīng)常獲取那些引起瀏覽器回流的屬性值是,可以緩存到變量中拢肆,而不是每次去重新獲取减响。

參考文檔:

  1. https://www.html.cn/archives/4991
  2. https://www.cnblogs.com/dujingjie/p/5784890.html
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市郭怪,隨后出現(xiàn)的幾起案子支示,更是在濱河造成了極大的恐慌,老刑警劉巖鄙才,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颂鸿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡咒循,警方通過(guò)查閱死者的電腦和手機(jī)据途,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)叙甸,“玉大人颖医,你說(shuō)我怎么就攤上這事●烧簦” “怎么了熔萧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)僚祷。 經(jīng)常有香客問(wèn)我佛致,道長(zhǎng),這世上最難降的妖魔是什么辙谜? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任俺榆,我火速辦了婚禮,結(jié)果婚禮上装哆,老公的妹妹穿的比我還像新娘罐脊。我一直安慰自己,他們只是感情好蜕琴,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布萍桌。 她就那樣靜靜地躺著,像睡著了一般凌简。 火紅的嫁衣襯著肌膚如雪上炎。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天雏搂,我揣著相機(jī)與錄音藕施,去河邊找鬼寇损。 笑死,一個(gè)胖子當(dāng)著我的面吹牛铅碍,可吹牛的內(nèi)容都是我干的润绵。 我是一名探鬼主播线椰,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼胞谈,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了憨愉?” 一聲冷哼從身側(cè)響起烦绳,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎配紫,沒(méi)想到半個(gè)月后径密,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡躺孝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年享扔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片植袍。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惧眠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出于个,到底是詐尸還是另有隱情氛魁,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布厅篓,位于F島的核電站秀存,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏羽氮。R本人自食惡果不足惜或链,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望档押。 院中可真熱鬧澳盐,春花似錦、人聲如沸汇荐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)掀淘。三九已至旬蟋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間革娄,已是汗流浹背倾贰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工冕碟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人匆浙。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓安寺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親首尼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挑庶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 在討論頁(yè)面重繪、回流之前软能。需要對(duì)頁(yè)面的呈現(xiàn)流程有些了解迎捺,頁(yè)面是怎么把html結(jié)合css等顯示到瀏覽器上的,下面的流...
    抓住時(shí)間的尾巴吧閱讀 941評(píng)論 0 3
  • 在討論頁(yè)面重繪查排、回流之前凳枝。需要對(duì)頁(yè)面的呈現(xiàn)流程有些了解,頁(yè)面是怎么把html結(jié)合css等顯示到瀏覽器上的跋核,下面的流...
    DavieKong閱讀 669評(píng)論 2 4
  • 近日有一朋友去面試,遇到如下一道題目,要給一個(gè)dom元素循環(huán)添加一組dom元素,要放在循環(huán)內(nèi)還是循環(huán)外:偽代碼如下...
    宇cccc閱讀 2,421評(píng)論 0 6
  • 原文鏈接:http://www.css88.com/archives/4996參考鏈接:https://kb.cn...
    小豆soybean閱讀 1,242評(píng)論 0 1
  • 在討論頁(yè)面重繪岖瑰、回流之前。需要對(duì)頁(yè)面的呈現(xiàn)流程有些了解砂代,頁(yè)面是怎么把html結(jié)合css等顯示到瀏覽器上的蹋订,下面的流...
    BULL_DEBUG閱讀 169評(píng)論 0 0