@duanyubin
2016-03-15T01:43:16.000000Z
字数 1875
阅读 564
移动开发

导致页面重新渲染的三种情况:
repaint不一定需要reflow 如: 改变某个元素的背景颜色
reflow必然导致repaint 如: 改变元素的大小
导致reflow的操作:
导致repaint的操作
一般的网页动画,需要达到每秒30帧到60帧的频率,才能比较流畅。
demo
要做到每秒60帧,意味着一秒之内60次重新渲染,每次渲染的时间不超过16.66ms

提高网页性能,就是要降低"重排"和"重绘"的频率和成本,尽量少触发重新渲染
// Badvar els = document.querySelectorAll('section>div>div');function animjs(){for(var i=0; i<len; i++){els[i].style.left = els[i].offsetLeft+1+'px';}}// Goodfunction 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';}}
// badvar left = 10;var top = 10;el.style.left = left + "px";el.style.top = top + "px";// goodel.className += " theclassname";// goodel.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);