【前端工程师手册】学习回流和重绘(reflow和repaint)

简介: 【前端工程师手册】学习回流和重绘(reflow和repaint)

浏览器的大概工作流程


以普通的HTML页面为例:

  1. 解析HTML文档,生成dom树
  2. 解析css产生css规则树
  3. 解析JavaScript,通过DOM-API来操作dom树和css规则树
  4. 通过dom树和css规则树来构造渲染树(rendering tree)
  5. 调用操作系统的GUI接口画页面


回流(reflow)和重绘(repaint)


回流:

元素的大小尺寸、位置发生变化时,会重新计算渲染树,页面要进行重新排版工作,这个过程即是回流。<br>
复制代码

重绘:

元素做了一些不影响排版的改变,比如背景色、下划线等等,只需要重新绘制的过程,叫做重绘。
复制代码

显然回流带来的代价大于重绘,因为重绘仅仅是重新画一遍元素而已,但是重绘是重新计算+重新画。


回流的原因:


  • Initial。网页初始化的时候。
  • Incremental。一些Javascript在操作DOM Tree时。
  • Resize。其些元件的尺寸变了
  • StyleChange。如果CSS的属性发生变化了。
  • Dirty。几个Incremental的reflow发生在同一个元素的子树上。 更具体的说,就是这些常见的操作会引起回流:
  1. 调整窗口大小
  2. 字体大小
  3. 样式表变动
  4. 元素内容变化,尤其是输入控件
  5. CSS伪类激活,在用户交互过程中发生
  6. DOM操作,DOM元素增删、修改
  7. width, clientWidth, scrollTop等布局宽高的计算 **ps:**但是浏览器并不会在我们一进行上面的操作就进行回流,浏览器会积攒一批reflow然后一起进行回流,不过有的操作会让浏览器立马进行回流,比如resize窗口,改变了页面默认的字体,或者说获取以下这些值:
  • offsetTop, offsetLeft, offsetWidth, offsetHeight
  • scrollTop/Left/Width/Height
  • clientTop/Left/Width/Height
  • IE中的 getComputedStyle(), 或 currentStyle


如何减少reflow和repaint


  1. 避免频繁的修改样式,可以将要修改的多个样式定义为一个class类,然后将类名一次赋值即可
  2. 把dom离线操作:
  • 使用documentFragment 对象在内存里操作DOM
  • 先把DOM给display:none(有一次reflow),然后你想怎么改就怎么改。比如修改100次,然后再把他显示出来。
  • clone一个DOM结点到内存里,然后想怎么改就怎么改,改完后,和在线的那个的交换一下
  1. 不要把DOM结点的属性值放在一个循环里当成循环里的变量。不然这会导致大量地读写这个结点的属性。
  2. 为动画的HTML元件使用fixed或absoult的position,那么修改他们的CSS是不会reflow的,因为脱离了文档流


参考

减少重排与重绘

浏览器的渲染原理简介



相关文章
|
7月前
|
前端开发
重绘 ( Repaint) 和回流 ( Reflow)
首先了解 重绘 ( Repaint) 和回流 ( Reflow)其实是关乎到浏览器性能的问题 重绘和回流是渲染步骤中的⼀⼩节,但是这两个步骤对于性能影响很大 重绘和回流的过程都需要浏览器耗费大量的计算资源,过多的使用会导致网页性能下降
40 1
|
9月前
|
缓存 JavaScript 前端开发
浏览器:重绘(repaint)与回流/重排(reflow)
浏览器:重绘(repaint)与回流/重排(reflow)
55 0
|
4月前
|
前端开发 JavaScript
前端性能优化—回流与重绘
前端性能优化—回流与重绘
|
JavaScript 开发者
页面 reflow 和 layout 过程|学习笔记
快速学习页面 reflow 和 layou t过程
118 0
页面 reflow 和 layout 过程|学习笔记
|
缓存 移动开发 JavaScript
浏览器重绘(repaint)重排(reflow)与优化[浏览器机制]
网页生成过程: HTML被HTML解析器解析成DOM 树 css则被css解析器解析成CSSOM 树 结合DOM树和CSSOM树,生成一棵渲染树(Render Tree) 生成布局(flow),即将所有渲染树的所有节点进行平面合成 将布局绘制(paint)在屏幕上 第四步和第五步是最耗时的部分,这两步合起来,就是我们通常所说的渲染。 网上找了一张图片,我加了注释会更直观一些: 渲染: 网页生成的时候,至少会渲染一次。 在用户访问的过程中,还会不断重新渲染 重新渲染需要重复之前的第四步(重新生成布局)+第五步(重新绘制)或者只有第五个步(重新绘制)。 重排比重绘大: 大,在这个语境里的意思
246 0
浏览器重绘(repaint)重排(reflow)与优化[浏览器机制]
|
Web App开发 前端开发 JavaScript
CSS新特性contain,控制页面的重绘与重排
CSS新特性contain,控制页面的重绘与重排
281 0
CSS新特性contain,控制页面的重绘与重排
|
缓存 JavaScript 前端开发
前端百题斩【031】——从渲染流程认识重绘和回流
前端百题斩【031】——从渲染流程认识重绘和回流
前端百题斩【031】——从渲染流程认识重绘和回流
|
Web App开发 JavaScript 前端开发
一文教会你何为重绘、回流?
一文教会你何为重绘、回流?
一文教会你何为重绘、回流?
|
前端开发 JavaScript
浏览器的回流与重绘 (Reflow & Repaint)
浏览器的回流与重绘 (Reflow & Repaint)
166 0