日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > web前端 > jscript > 什么是 Repaint 和 Reflow, 相關介紹

什么是 Repaint 和 Reflow, 相關介紹

來源:程序員人生   發布時間:2014-06-07 03:07:45 閱讀次數:2913次

1. 什么是 repaint 和 reflow

一個頁面由兩部分組成:

DOM : 描述該頁面的結構

render : 描述 DOM 節點 (nodes) 在頁面上如何呈現

當 DOM 元素的屬性發生變化 (如 color) 時, 瀏覽器會通知 render 重新描繪相應的元素, 此過程稱為 repaint.

如果該次變化涉及元素布局 (如 width), 瀏覽器則拋棄原有屬性, 重新計算并把結果傳遞給 render 以重新描繪頁面元素, 此過程稱為 reflow.

這兩個過程是很耗費瀏覽器性能的, 從 IE 系列和 Chrome 渲染頁面速度上的差距即可看出渲染引擎計算對應值和呈現并不一定高效, 而每次對元素的操作都會發生 repaints 或 reflow, 因此編寫 DOM 交互時如果不注意就會導致頁面性能低下.

2. Reflow

當發生以下情況的時候, 會引發 reflow:

可見元素的增刪

元素的位置, 大小, 內容的改變

頁面第一次渲染

改變瀏覽器窗口的大小

幸運地, 瀏覽器對 reflow 的處理是和 PHP 的 Output Control 相似的 — 把 reflow 放進一個隊列, 達到一定程度或時限就進行 flush. 但不幸的是, 這個過程可能會被我們強制提前執行 — 只要使用下面所列的任一個都會迫使瀏覽器 flush, 因此產生 reflow:

offsetTop, offsetXXX…

scrollTop, scrollXXX…

clientTop, clientXXX…

getComputedStyle / currentStyle

3. 怎么優化

首先是減少對 DOM 中有關布局的操作, 假設我們要動態改變一個元素的大小為 100*100px:

var el = document.getElementById("id");
el.style.width = 100px;
el.style.height = 100px;
// suppose there are two els : el2, el3
el2.style.width = el.style.width * 1.5;
el3.style.width = el.style.width * 2;

寫成這樣會有更好的性能:

el.style.cssText = "width: 100px; height: 100px;";
// or el.className = "square";
var width = el.style.width;
el2.style.width = width * 1.5;
el3.style.width = width * 2;

操作 DOM 時盡量使用 DocumentFragment 和 cloneNode:

// DocumentFragment
var fm = document.createDocumentFragment();
var a;
for(var i = 0; i < 20; i++){
a = document.createElement("a");
a.href = i + ".html";
a.innerHTML = "page " + i;
fm.appendChild(a);
}
document.getElementById("tar").appendChild(fm);

// cloneNode
var ul = document.getElementById("ul");
var clone = ul.cloneNode(true); // true = deep copy
var li;
for(var i = 0; i < 20; i++){
li = document.createElement("li");
li.appendChild(document.createTextNode(i));
clone.appendChild(li);
}
ul.parentNode.replaceChild(clone, ul);

大致優化思路如下:

把元素從 DOM 流中剝離 (clone, fragment, position: absolute, 絕對定位對動畫或拖曳對象尤為有用)

在被剝離的的元素上進行各種操作

把被剝離的元素恢復到 DOM 流

注意:

IE lte 8 有一個 bug — :hover, 大量出現使用該選擇器的元素的話會降低頁面響應速度

在不鳥 older browsers 的情況下, 可以大量使用 firstElementChild(),querySelectorAll() 等 API, 可實現的功能和 jQuery 等庫的 CSS 選擇器和遍歷函數相差不大

此外對事件的綁定上盡可能使用 delegation, 也就是合理利用 event 的冒泡特性, 我認為這對 repaint & reflow 的影響是比較小的, 不過對于代碼優化, 復用性和靈活性都有很大的幫助, 有空再繼續

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 久久精品中文 | 久久久亚洲 | 嫩草视频国产精品 | 久久久久免费视频 | 91精品一区二区三区久久久久 | jiuse九色| 视频一区在线观看 | 亚洲一二三区视频 | 欧美日韩精品一区二区三区 | 成人免费一区二区三区视频网站 | 好叼视频 | 国产精品久久久久久久久久三级 | 台湾av在线播放 | 国产亚洲精品久久久久动 | 麻豆专区一区二区三区四区五区 | 国产一区二区三区四区 | 久久久高清 | 在线视频一二区 | 国产精品国产三级国产aⅴ浪潮 | 日韩中文一区 | 国产a免费 | 国产在线播放91 | 欧美二区三区 | 老女人一级片 | www.成人.com | 久久精品视频播放 | 精品在线一区二区 | 日本免费啪啪 | 国产高清免费 | 国产日韩欧美一区二区三区乱码 | 亚洲伊人网站 | 久久久精品亚洲 | 91精品国产乱码久久久 | 日韩欧美精品在线观看 | 9久久精品 | 日韩不卡在线 | 欧美二区在线观看 | 国产三区视频 | 亚洲欧美日韩在线不卡 | 九九九在线 | 色一区二区三区四区 |