blog icon indicating copy to clipboard operation
blog copied to clipboard

什么是重绘和回流,有哪些措施可以避免

Open wuweijia opened this issue 5 years ago • 3 comments

wuweijia avatar Apr 17 '19 13:04 wuweijia

回流: 当页面重新布局(定位、浮动)或者几何属性(盒模型相关属性)发生改变时, 就会引起回流. 比如: position、width、height、padding等, 注意与字体相关的一些属性也会引起回流, 比如font-size、font-weight、text-align等等

重绘: 只引起页面元素样式发生改变,而不引起布局改变的, 就叫重绘. 比如background-color、color、border-style、border-radius等等

回流一定会引起重绘, 但重绘不一定会引起回流

在项目过程中, 应该尽量避免回流操作, 因为回流会让元素重新渲染. 代价比重绘大, 所以如果能用重绘替代的可以使用重绘. 比如, 频繁的显示隐藏一个组件, 可以使用visible属性

其他的请各位大佬补充

xie991283109 avatar Apr 18 '19 02:04 xie991283109

回流: 当页面重新布局(定位、浮动)或者几何属性(盒模型相关属性)发生改变时, 就会引起回流. 比如: position、width、height、padding等, 注意与字体相关的一些属性也会引起回流, 比如font-size、font-weight、text-align等等

重绘: 只引起页面元素样式发生改变,而不引起布局改变的, 就叫重绘. 比如background-color、color、border-style、border-radius等等

回流一定会引起重绘, 但重绘不一定会引起回流

在项目过程中, 应该尽量避免回流操作, 因为回流会让元素重新渲染. 代价比重绘大, 所以如果能用重绘替代的可以使用重绘. 比如, 频繁的显示隐藏一个组件, 可以使用visible属性

其他的请各位大佬补充

  1. 不要使用 table 布局
  2. 多使用 transform
  3. 动画实现的速度的选择,动画速度越快,回流次数越多,可以选择使用 requestAnimationFrame

wuweijia avatar Apr 18 '19 02:04 wuweijia

回流:render tree 中的元素因为尺寸/布局等发生改变,需要重新构建render tree,称为回流.回流分为局部回流和全局回流. eg:盒模型相关属性(width,padding,margin等)改变,js访问offsetTop、offsetLeft、 offsetWidth、offsetHeight、clientTop、clientWidth、clientHeight、scrollTop、scrollWidth、getComputedStyle(ele,[pseudoEle])等, resize事件发生时,append/remove可见dom node等.

重绘:render tree 中的元素需要更新一些属性,这些属性只影响元素的外观、风格,并不会影响元素的布局的,称为重绘. eg:visibility ,background-color,color,transform,opacity,filter等

避免措施: 1.尽量使用transform代替. 2.经常需要进行复杂操作的元素,脱离文档流(absolute/fixed/display:none)后进行操作,操作完后回到文档流. 3.virtual dom操作(也可以把需要操作的dom元素拷贝后放到dom tree外部进行操作,最后替换). 4.合并多次样式的修改: 改变className,或者使用cssText.

GenkiChiang avatar Apr 18 '19 03:04 GenkiChiang