摘要:完成重排后,瀏覽器會(huì)重新繪制受影響的部分到屏幕,該過(guò)程稱為重繪。重排必然導(dǎo)致重繪,所以重排更加惡心。使用絕對(duì)位置定位頁(yè)面上的動(dòng)畫元素,將其脫離文檔流,可以有效的防止重排。
render樹的構(gòu)建
瀏覽器取回代碼后,首先會(huì)構(gòu)造DOM樹,根據(jù)HTML標(biāo)簽,構(gòu)造DOM樹。
之后會(huì)解析CSS樣式,解析的順序是瀏覽器的樣式 -> 用戶自定義的樣式 -> 頁(yè)面的link標(biāo)簽等引進(jìn)來(lái)的樣式 -> 寫在style標(biāo)簽里面的內(nèi)聯(lián)樣式
最后根據(jù)DOM樹以及解析的CSS樣式,構(gòu)造RENDER樹,在RENDER樹中,會(huì)把DOM樹中沒有的元素給去除,比如head標(biāo)簽以及里面的內(nèi)容,以及display:none的元素也會(huì)被去除。
一旦RENDER樹構(gòu)建完成,瀏覽器會(huì)把樹里面的內(nèi)容繪制在屏幕上。
Beautiful page Once upon a time there was a looong paragraph...
...
構(gòu)造的DOM樹如下
documentElement (html) head title body p [text node] div [text node] div img ...
RENDER樹如下
root (RenderView) body p line 1 line 2 line 3 ... div img ...重繪(repaint)和重排(reflow)
當(dāng)DOM的變化影響了元素的幾何屬性(寬或高),瀏覽器需要重新計(jì)算元素的幾何屬性,同樣其他元素的幾何屬性和位置也會(huì)因此受到影響。瀏覽器會(huì)使渲染樹中受到影響的部分失效,并重新構(gòu)造渲染樹。這個(gè)過(guò)程稱為重排。完成重排后,瀏覽器會(huì)重新繪制受影響的部分到屏幕,該過(guò)程稱為重繪。并不是所有的DOM變化都會(huì)影響幾何屬性,比如改變一個(gè)元素的背景色并不會(huì)影響元素的寬和高,這種情況下只會(huì)發(fā)生重繪。
重排必然導(dǎo)致重繪,所以重排更加惡心。其實(shí)我們一直研究的應(yīng)該是怎么避免觸發(fā)多次重排。
重排何時(shí)發(fā)生添加或者刪除可見的DOM元素 元素位置改變 元素尺寸改變 元素內(nèi)容改變(例如:一個(gè)文本被另一個(gè)不同尺寸的圖片替代) 頁(yè)面渲染初始化(這個(gè)無(wú)法避免) 瀏覽器窗口尺寸改變瀏覽器的自動(dòng)優(yōu)化
var ele = document.getElementById("myDiv"); ele.style.borderLeft = "1px"; ele.style.borderRight = "2px"; ele.style.padding = "5px";
乍一想,元素的樣式改變了三次,每次改變都會(huì)引起重排和重繪,所以總共有三次重排重繪過(guò)程,但是瀏覽器并不會(huì)這么笨,它會(huì)把三次修改“保存”起來(lái)(大多數(shù)瀏覽器通過(guò)隊(duì)列化修改并批量執(zhí)行來(lái)優(yōu)化重排過(guò)程),一次完成!但是,有些時(shí)候你可能會(huì)(經(jīng)常是不知不覺)強(qiáng)制刷新隊(duì)列并要求計(jì)劃任務(wù)立即執(zhí)行。獲取布局信息的操作會(huì)導(dǎo)致隊(duì)列刷新,比如:
offsetTop, offsetLeft, offsetWidth, offsetHeight scrollTop, scrollLeft, scrollWidth, scrollHeight clientTop, clientLeft, clientWidth, clientHeight getComputedStyle() (currentStyle in IE)
因此,盡量不要在修改樣式或者布局信息時(shí)查詢樣式,因?yàn)椴樵兊臅r(shí)候會(huì)強(qiáng)制重排,導(dǎo)致瀏覽器無(wú)法優(yōu)化多次重排。
使用絕對(duì)位置定位頁(yè)面上的動(dòng)畫元素,將其脫離文檔流,可以有效的防止重排。比如有時(shí)候做動(dòng)畫特效時(shí),我們通過(guò)設(shè)置position:absolute可以有效的減少重排。這讓我想到,以前做動(dòng)畫的時(shí)候通過(guò)修改margin-left屬性而不是left屬性絕對(duì)是一個(gè)很不好的做法。
transform是否可以避免重排重繪問(wèn)題那么使用CSS3的transform來(lái)實(shí)現(xiàn)動(dòng)畫是否可以避免重排問(wèn)題?或者說(shuō)瀏覽器針對(duì)這一部分做了其他優(yōu)化?
經(jīng)過(guò)一番查找,答案如下:
CSS的最終表現(xiàn)分為以下四步:Recalculate Style -> Layout -> Paint Setup and Paint -> Composite Layers
按照中文的意思大致是 查找并計(jì)算樣式 -> 排布 -> 繪制 -> 組合層
這上面的幾個(gè)步驟有點(diǎn)類似于上文說(shuō)到的重排必定導(dǎo)致重繪,而查詢屬性會(huì)強(qiáng)制發(fā)生重排。所以上文提到的重排重繪內(nèi)容可以結(jié)合這里進(jìn)行理解。
由于transform是位于Composite Layers層,而width、left、margin等則是位于Layout層,在Layout層發(fā)生的改變必定導(dǎo)致Paint Setup and Paint -> Composite Layers,所以相對(duì)而言使用transform實(shí)現(xiàn)的動(dòng)畫效果肯定比left這些更加流暢。
而且就算拋開這一角度,在另一方面瀏覽器也會(huì)針對(duì)transform等開啟GPU加速。
參考文章
https://www.html5rocks.com/en...
http://www.phpied.com/renderi...
http://www.cnblogs.com/zichi/...
寫完文章后又重新查了一下關(guān)于CSS3動(dòng)畫性能方面的文章,發(fā)現(xiàn)大漠老師寫的這篇很不錯(cuò),而且跟自己理解的觀點(diǎn)有部分相似,先放上來(lái),之后再認(rèn)真看。
https://www.w3cplus.com/anima...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/86898.html
摘要:完成重排后,瀏覽器會(huì)重新繪制受影響的部分到屏幕,該過(guò)程稱為重繪。重排必然導(dǎo)致重繪,所以重排更加惡心。使用絕對(duì)位置定位頁(yè)面上的動(dòng)畫元素,將其脫離文檔流,可以有效的防止重排。 render樹的構(gòu)建 showImg(https://segmentfault.com/img/remote/1460000006908155?w=630&h=292); 瀏覽器取回代碼后,首先會(huì)構(gòu)造DOM樹,根據(jù)H...
摘要:完成重排后,瀏覽器會(huì)重新繪制受影響的部分到屏幕,該過(guò)程稱為重繪。重排必然導(dǎo)致重繪,所以重排更加惡心。使用絕對(duì)位置定位頁(yè)面上的動(dòng)畫元素,將其脫離文檔流,可以有效的防止重排。 render樹的構(gòu)建 showImg(https://segmentfault.com/img/remote/1460000006908155?w=630&h=292); 瀏覽器取回代碼后,首先會(huì)構(gòu)造DOM樹,根據(jù)H...
摘要:就如上面的概念一樣,單單改變?cè)氐耐庥^,肯定不會(huì)引起網(wǎng)頁(yè)重新生成布局,但當(dāng)瀏覽器完成重排之后,將會(huì)重新繪制受到此次重排影響的部分。因?yàn)殛?duì)列中,可能會(huì)有影響到這些值的操作,為了給我們最精確的值,瀏覽器會(huì)立即重排重繪。 showImg(http://ww1.sinaimg.cn/large/005Y4rCogy1fya3fh2jm3j30ku0dwtb2.jpg); 很多人都知道要減少瀏覽...
摘要:對(duì)于復(fù)雜動(dòng)畫效果使用絕對(duì)定位讓其脫離文檔流對(duì)于復(fù)雜動(dòng)畫效果,由于會(huì)經(jīng)常的引起回流重繪,因此,我們可以使用絕對(duì)定位,讓它脫離文檔流。硬件加速加速比起考慮如何減少回流重繪,我們更期望的是,根本不要回流重繪。 回流和重繪可以說(shuō)是每一個(gè)web開發(fā)者都經(jīng)常聽到的兩個(gè)詞語(yǔ),我也不例外,可是我之前一直不是很清楚這兩步具體做了什么事情。最近由于部門內(nèi)部要做分享,所以對(duì)其進(jìn)行了一些研究,看了一些博客和書...
閱讀 1123·2021-11-24 09:39
閱讀 3623·2021-09-02 15:21
閱讀 2161·2021-08-24 10:01
閱讀 722·2021-08-19 10:55
閱讀 2447·2019-08-30 15:55
閱讀 1212·2019-08-30 14:16
閱讀 2992·2019-08-29 15:17
閱讀 3235·2019-08-29 13:53