重排和回流

回流一定引起重绘,重绘不一定引起回流。

 

回流:回流也被称为重排,重排更让人形象易懂(即重排整个页面)。当render tree中的一部分或全部因为元素的尺寸规模、布局、隐藏等改变时,浏览器会重新渲染部分DOM或全部DOM的过程。

 

重绘:当页面元素样式改变不影响元素在文档流中的位置时(如background-color,border-color,visibility)浏览器只会将新样式赋予元素并进行重新绘制操作。

 

优化(减少回流,重排):

  • 浏览器本身放入优化策略 :浏览器会维护一个队列,把所有的引起回流,重绘的操作放入这个队列,等队列中的操作到了一定数量或是到了一定时间,浏览器就会flush队列,进行一个批处理。
  • 减少对render tree的操作,减少一些style信息的请求:
    • 将多次改变样式的操作合并成一次;
    • 将需要多次重排的元素,position属性设为absolute或者fixed,这样元素就脱离文档流,变化不会影响其他元素;
    • 在内存中都次操作节点,完成后再添加到文档中。例如要异步获取表格数据,渲染到页面,可以先取得数据后在内存中构建整个表格的html片段,再一次性添加到文档中去,而不是循环添加每一行;
    • 由于display属性为none的元素不在渲染树中,对隐藏的元素操作不会引发其他元素的重排。如果要对一个元素进行复杂的操作时,可以先隐藏它,操作完后再显示。这样只在隐藏和显示时触发二次重排;
    • 在需要经常获取那些引起浏览器重排的属性值时,要缓存到变量。
posted on 2019-12-07 11:35  胖可  阅读(906)  评论(0编辑  收藏  举报