@duanyubin
2016-03-15T01:43:16.000000Z
字数 1875
阅读 499
移动开发
导致页面重新渲染的三种情况:
repaint不一定需要reflow 如: 改变某个元素的背景颜色
reflow必然导致repaint 如: 改变元素的大小
导致reflow的操作:
导致repaint的操作
一般的网页动画,需要达到每秒30帧到60帧的频率,才能比较流畅。
demo
要做到每秒60帧,意味着一秒之内60次重新渲染,每次渲染的时间不超过16.66ms
提高网页性能,就是要降低"重排"和"重绘"的频率和成本,尽量少触发重新渲染
// Bad
var els = document.querySelectorAll('section>div>div');
function animjs(){
for(var i=0; i<len; i++){
els[i].style.left = els[i].offsetLeft+1+'px';
}
}
// Good
function animjs(){
var lefts = [];
for(var i=0; i<len; i++){
lefts.push(els[i].offsetLeft);
}
for(var i=0; i<len; i++){
els[i].style.cssText = 'left:'+lefts[i]+1+'px';
}
}
// bad
var left = 10;
var top = 10;
el.style.left = left + "px";
el.style.top = top + "px";
// good
el.className += " theclassname";
// good
el.style.cssText += "; left: " + left + "px; top: " + top + "px;";
比如,使用 cloneNode() 方法,在克隆的节点上进行操作,然后再用克隆的节点替换原始节点。
display: none
的元素不会导致reflow和repaint, visibility: hidden
会对repaint有影响transform: translate3d(0)
或者will-change
// Bad 读操作跟着一个写操作,短时间内触发大量的重新渲染
function doubleHeight(element) {
var currentHeight = element.clientHeight;
element.style.height = (currentHeight * 2) + 'px';
}
elements.forEach(doubleHeight);
// Good 读写分离,把所有的写操作放到下一次渲染
function doubleHeight(element) {
var currentHeight = element.clientHeight;
window.requestAnimationFrame(function () {
element.style.height = (currentHeight * 2) + 'px';
});
}
elements.forEach(doubleHeight);