性能优化之reflow和repaint

本文主要介绍一下什么是reflow,repaint, 怎样避免它们造成的不良影响, 怎么通过工具查看分析它们.  

一.首先对浏览器渲染引擎下网页呈现过程简要说一下:

  1. 浏览器的渲染引擎开始解析html构建成DOM树,DOM树是以document对象为根节点,包含所有的html标签, 包括display: none隐藏的,也包括js动态添加的元素。
  2. 解析html的同时, 将css文件或者样式元素中的样式解析成CSS Rule Tree,解析时会去掉浏览器不能识别的样式。
  3. 根据DOM树和CSSOM来构造Rendering Trre。Rendering Trre和DOM Tree相比较,Rendering Trre中每个节点都包含样式信息,而且Render Tree不会包含隐藏的节点,只有影响到呈现的节点才会包含在Render Tree中(例如: display:none的节点,head节点不会包含在Render Tree中,visibility:hidden会被包含,因为它会影响layout)。
  4. 生成布局(layout),计算各节点元素在屏幕上所在位置和几何结构。
  5. 绘制(paint),将布局绘制到屏幕上。

  以上5步中,主要耗时的是后2步,后两步合称为渲染(render)。

二: 什么是reflow 和 repaint:

  网页在生成的过程中,至少要渲染一次。之后在访问过程中,还会不断的进行渲染。重新渲染就行重新生成布局和绘制(也就是重复进行上面的第4,5步)重新生成布局的过程就是reflow(回流,重排),重新绘制就叫做reflow(重绘)。

三: 什么时候触发reflow和repaint

注: repaint不一定需要reflow,例如:改变某元素的颜色,只会触发repaint,不会触发reflow。但是reflow一定会导致repaint,因为布局改变了,就一定需要重新绘制。
Reflow 的成本比 Repaint 的成本高很多。DOM Tree里的每个节点都会有reflow方法,一个结点的reflow可能导致其子结点,甚至父点以及同级结点的 reflow。在PC端或许还没什么,但是在手机上,还是比较耗性能和耗电的。
以下情况会导致reflow:

  1. 增加货移除css样式
  2. 改变字体大小
  3. 改变窗口大小
  4. 操作class属性
  5. 激活css伪类
  6. 内容变化,如在input内输入文字
  7. js操作DOM
  8. 获取offsetTop, offsetLeft等layout属性
  9. 设置css属性等值

   ... ...

四.如何减小reflow的影响:

  1. 减少不必要的DOM层级.
  2. 避免使用table进行布局,因为可能很小的一个小改动会造成整个 table 的重新布局。
  3. 尽量通过position属性为absolute或fixed实现动画效果
  4. 不要一条一条地修改 DOM 的样式。而是预先定义好对应的 class,然后修改对应节点的 className
  5. 不要逐条操作DOM节点:  
  6. a> 使用 documentFragment 对象在内存里操作 DOM。  b> 先把 DOM 给 display:none (有一次 repaint),做完所有的修改后,再把他显示出来。  c> clone 一个 DOM 节点到内存里,做完所有的修改后,再交换一下。
  7. 请求如下值offsetTop, offsetLeft, offsetWidth, offsetHeight,scrollTop/Left/Width/Height,clientTop/Left/Width/Height,浏览器会发生reflow,建议将他们合并到一起操作,可以减少回流的次数。多次要用到值,可以先用变量缓存起来.

  ... ...

五.开发者工具查看

  Chrome浏览器开发者工具的Performance面板,可以查看页面回流和重绘所花费的时间.
  打开f12下的开发者工具, 切换到Performance面板.如下图:

  

  点击开始录制按钮,会开始录制,这时在网页上进行一些操作, 然后点击停止按钮,如下:

  

  从图中可以判断出性能问题到底出现在哪个环节,是js的执行,还是渲染

  图中不同颜色代表不同的事件, 哪个色块越大, 说明耗时越长,问题越大.可以根据此去进行优化.

  • 黄色: javaScript执行时间
  • 紫色: 样式重新计算和布局, 即reflow时间
  • 绿色: repaint时间 

原文地址:https://www.cnblogs.com/yuqing6/p/8605870.html

时间: 2024-08-29 09:49:07

性能优化之reflow和repaint的相关文章

性能优化之-reflow,repaint.

前端性能控制是衡量一个前端工程师的重要参考点,一个作品的成功离不开不断追求性能的优化,为什么三星手机出现了爆炸事件之后销量急剧下降,为什么德国的工艺产品收到世界的推举.这些一定离不开不断的优化产品,提高产品的性能指标.作为一个工程师,你一定要在能做到的基础上去追求如何去做的更好.提升性能也是提升自己. 1.什么是reflow,repaint. 我们知道页面渲染是这样进行的首先确定页面的位置即position,然后进行render,即dom的颜色,text-align等等.那么由此我们可以推断出什

前端性能优化--回流(reflow)和重绘(repaint)

HTML加载时发生了什么 在页面加载时,浏览器把获取到的HTML代码解析成1个DOM树,DOM树里包含了所有HTML标签,包括display:none隐藏,还有用JS动态添加的元素等. 浏览器把所有样式(用户定义的CSS和用户代理)解析成样式结构体 DOM Tree 和样式结构体组合后构建render tree, render tree类似于DOM tree,但区别很大,因为render tree能识别样式,render tree中每个NODE都有自己的style,而且render tree不包

Reflow、Repaint 性能优化

涉及到操作大量Dom节点及其样式时,有时感觉画面不顺畅,殊不知浏览器亚历山大了.所以我们心里面一定得清楚 Reflow(回流).Repaint(重绘). 浏览器根据每个Dom节点的样式,包括(大小,颜色,位置等等),计算出各个节点应该在页面上展示的位置,占据的空间,这个过程可以称之为Reflow(回流):当节点的位置,空间确定好以后,浏览器便把这些节点按照各自的样子绘制在页面上,这个过程称之为Repaint(重绘): 触发Reflow Dom节点的添加.修改(内容).删除( Reflow + R

javascript性能优化-repaint和reflow

repaint(重绘) ,repaint发生更改时,元素的外观被改变,且在没有改变布局的情况下发生,如改变outline,visibility,background color,不会影响到dom结构渲染. reflow(渲染),与repaint区别就是他会影响到dom的结构渲染,同时他会触发repaint,他会改变他本身与所有父辈元素(祖先),这种开销是非常昂贵的,导致性能下降是必然的,页面元素越多效果越明显. 何时发生: 1. DOM元素的添加.修改(内容).删除( Reflow + Repa

前端性能优化-减少http请求,dns预解析,减少repaint和reflow

前端性能优化方法: 一 . 减少http请求 (1)通过合并图片,减少请求,俗称css sprites(css精灵)css sprites (2)lazyload懒加载,在需要的时候再加载 1.定义:懒加载也称为延迟加载,图片需要用到的时候再去价值 2.用法:就是重写对象的get方法,当系统调用get方法再去加载对象 3.优点:(1)对象的实例化在getter方法中,各司其职,降低耦合性:(2)真正需要资源时,再去加载,系统的内存占用率会减小 (3)压缩/合并css和js 二 .减少repain

(转)web性能优化

前端是庞大的,包括 HTML. CSS. Javascript.Image .Flash等等各种各样的资源.前端优化是复杂的,针对方方面面的资源都有不同的方式.那么,前端优化的目的是什么 ? 1. 从用户角度而言,优化能够让页面加载得更快.对用户的操作响应得更及时,能够给用户提供更为友好的体验. 2. 从服务商角度而言,优化能够减少页面请求数.或者减小请求所占带宽,能够节省可观的资源. 总之,恰当的优化不仅能够改善站点的用户体验并且能够节省相当的资源利用. 前端优化的途径有很多,按粒度大致可以分

Web前端性能优化进阶——完结篇

前言 在之前的文章 如何优化网站性能,提高页面加载速度 中,我们简单介绍了网站性能优化的重要性以及几种网站性能优化的方法(没有看过的可以狂戳 链接 移步过去看一下),那么今天我们深入讨论如何进一步优化网站性能. 一.拆分初始化负载 拆分初始化负载——听名字觉得高大上,其实不然,土一点将讲就是将页面加载时需要的一堆JavaScript文件,分成两部分:渲染页面所必需的(页面出来,没他不行)和剩下的.页面初始化时,只加载必须的,其余的等会加载. 其实在现实生产环境中,对于大部分网站:页面加载完毕(w

web前端性能优化总结

网站的划分一般为二:前端和后台.我们可以理解成后台是用来实现网站的功能的,比如:实现用户注册,用户能够为文章发表评论等等.而前端呢?其实应该是属于功能的表现.并且影响用户访问体验的绝大部分来自前端页面. 而我们建设网站的目的是什么呢?不就是为了让目标人群来访问吗?所以我们可以理解成前端才是真正和用户接触的.除了后台需要在性能上做优化外,其实前端的页面更需要在性能优化上下功夫,只有这样才能给我们的用户带来更好的用户体验.就好像,好多人问,男人在找女朋友的时候是不是只看外表,一些智慧的男人给出了这样

前端性能优化(转)

前端是庞大的,包括 HTML. CSS. Javascript.Image .Flash等等各种各样的资源.前端优化是复杂的,针对方方面面的资源都有不同的方式.那么,前端优化的目的是什么 ? 1. 从用户角度而言,优化能够让页面加载得更快.对用户的操作响应得更及时,能够给用户提供更为友好的体验. 2. 从服务商角度而言,优化能够减少页面请求数.或者减小请求所占带宽,能够节省可观的资源. 总之,恰当的优化不仅能够改善站点的用户体验并且能够节省相当的资源利用. 前端优化的途径有很多,按粒度大致可以分