重绘或回流

`回流(reflow)`:当render tree中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建。

`重绘(repaint)`:当render tree中的一些元素需要更新属性,而这些属性只是影响元素的外观,风格,而不会影响布局的,比如background-color。
 
 
 
浏览器会维护1个队列,把所有会引起回流、重绘的操作放入这个队列,等队列中的操作到了一定的数量或者到了一定的时间间隔,浏览器就会flush队列,进行一个批处理。这样就会让多次的回流、重绘变成一次回流重绘。

虽然有了浏览器的优化,但有时候我们写的一些代码可能会强制浏览器提前flush队列,这样浏览器的优化可能就起不到作用了。当你请求向浏览器请求一些 style信息的时候,就会让浏览器flush队列,比如:

1.offsetTop, offsetLeft, offsetWidth, offsetHeight

2.scrollTop/Left/Width/Height

3.clientTop/Left/Width/Height

4.请求了getComputedStyle(), 或者 IE的 currentStyle
 
如何性能优化

> 减少回流与重绘的次数,就需要简单对渲染树的操作。

1. 直接使用className修改样式,少用style设置样式
 
2. 让要操作的元素进行”离线处理”,处理完后一起更新 ,
 
   使用display:none技术,减少回流和重绘的次数
 
3. 将需要多次重排的元素,position属性设为absolute或fixed。
 
4. 尽量不要在for循环中进行获取性操作
 
5.使用translate代替left/top
 
6.可以通过opacity替换visibility

猜你喜欢

转载自www.cnblogs.com/zhaodz/p/11582061.html