重排和重绘

浏览器的运行机制:

  1. 构建DOM树:渲染引擎解析HTML文档,首先将标签转换为DOM树中的DOM节点(包括js生成的标签),生成DOM树
  2. 构建渲染树:解析对应的CSS样式文件信息(包括js生成的样式和外部CSS文件),构建渲染树。
  3. 布局渲染树:计算每一个元素的大小,位置等,给出每一个元素应该在屏幕上出现的精确坐标。
  4. 绘制渲染树:遍历渲染树,使用UI后端来绘制每一个节点。

重绘:

当盒子的位置,大小以及其他属性例如颜色,字体等大小等都确定下来之后,浏览器便把这些元素都按照各自的特性绘制一遍,将内容呈现在页面上。重绘是指一个元素的外观的改变所触发的浏览器行为,浏览器会根据元素的新属性重新绘制,使得元素呈现出新的外观。

触发条件:改变元素的外观属性,如:color,background-color等。

重排:

当渲染树中的一部分因为元素的规模尺寸,布局,隐藏等改变而需要重新构建,这就称为重排,每个页面最少需要一次重排,就是在页面第一次加载的时候。

触发条件:任何页面布局和几何属性的改变都会触发重排,例如:

  1. 页面初始化渲染
  2. 添加或者删除可见的DOM元素
  3. 元素的位置的改变
  4. 元素的尺寸发生改变,如大小,外边距,边框等
  5. 浏览器窗口尺寸发生改变
  6. 填充内容的改变,如文本的改变或者图片大小的改变而引起的计算高度和宽度的变化
  7. 读取某些元素属性:(offsetLeft/Top/Height/Width,clientTop/Height/Width/Left,scrollTop/Left/Width/Height,width/height, getComputedStyle(), currentStyle(IE))

重排和重绘的关系:

在重排的时候,浏览器会使得渲染树中受到影响的部分失效,并重新构建这部分渲染树,完成重排之后,浏览器会重新绘制受影响的部分到页面上。所以重排必定引起重绘,但是重绘不一定会导致重排

优化

  1. 浏览器自己的优化:浏览器会维护一个队列,把所有会引起重排重绘的操作放到这个队列里面,等队列中的操作到了一定数量或者一定时间间隔的时候,浏览器就会flush队列,进行一个批处理,将多次的重排重绘变为执行一次重排重绘。
  2. 样式集中改变,可以通过添加类名来进行样式修改
  3. 等等…..

  转载请注明: TomoFur 重排和重绘

 上一篇
手动实现call,apply和bind 手动实现call,apply和bind
还是有点东西的呦! 手动实现call预备知识:如果一个函数作为一个对象的属性,那么通过对象的.运算符调用此函数,this就是此对象 Function.prototype.myCall = function(context){ i
2019-07-02
下一篇 
Vue生命周期 Vue生命周期
Vue实例有一个完整的生命周期,也就是从开始创建,初始化数据,编译模板,挂载DOM,渲染–>更新–>渲染,销毁等一系列过程,也就是Vue实例从创建到销毁的过程,就是生命周期。 创建阶段1.beforeCreate(){}//这
2019-06-25
  目录