repaint(重绘) ,repaint发生更改时,元素的外观被改变,且在没有改变布局的状况下发生,如改变outline,visibility,background color,不会影响到dom结构渲染。 css
reflow(渲染),与repaint区别就是他会影响到dom的结构渲染,同时他会触发repaint,他会改变他自己与全部父辈元素(祖先),这种开销是很是昂贵的,致使性能降低是必然的,页面元素越多效果越明显。 express
什么时候发生: 浏览器
1. DOM元素的添加、修改(内容)、删除( Reflow + Repaint)
2. 仅修改DOM元素的字体颜色(只有Repaint,由于不须要调整布局)
3. 应用新的样式或者修改任何影响元素外观的属性
4. Resize浏览器窗口、滚动页面
5. 读取元素的某些属性(offsetLeft、offsetTop、offsetHeight、offsetWidth、 scrollTop/Left/Width/Height、clientTop/Left/Width/Height、 getComputedStyle()、currentStyle(in IE)) 缓存
如何避免: app
1. 先将元素从document中删除,完成修改后再把元素放回原来的位置
2. 将元素的display设置为”none”,完成修改后再把display修改成原来的值
3. 若是须要建立多个DOM节点,可使用DocumentFragment建立完后一次性的加入document dom
var fragment = document.createDocumentFragment();
fragment.appendChild(document.createTextNode('keenboy test 111'));
fragment.appendChild(document.createElement('br'));
fragment.appendChild(document.createTextNode('keenboy test 222'));
document.body.appendChild(fragment); 布局