面试官:浏览器页面的回流与重绘

142 阅读2分钟

浏览器页面的回流与重绘

定义

  • 回流:浏览器根据各种样式属性,计算盒子的大小与位置。
  • 重绘:当计算好一个盒子的大小、位置及其他属性后,浏览器会在页面中绘制这个盒子。

2b56a950-9cdc-11eb-ab90-d9ae814b240d.png

  • 解析HTML,生成DOM树,解析CSS,生成CSSOM树
  • 将DOM树和CSSOM树结合,生成渲染树(Render Tree)
  • Layout(回流):根据生成的渲染树,进行回流(Layout),得到节点的几何信息(位置,大小)
  • Painting(重绘):根据渲染树以及回流得到的几何信息,得到节点的绝对像素
  • Display:将像素发送给GPU,展示在页面上

触发回流

当一个盒子需要重新计算大小及位置的时候,就需要触发回流机制,常见的情形如下:

  • 添加或删除可见的DOM元素
  • 元素的位置发生变化
  • 元素的尺寸发生变化(包括外边距、内边框、边框大小、高度和宽度等)
  • 内容发生变化,比如文本变化或图片被另一个不同尺寸的图片所替代
  • 页面一开始渲染的时候(这避免不了)
  • 浏览器的窗口尺寸变化(因为回流是根据视口的大小来计算元素的位置和大小的)

触发重绘

当一个盒子触发回流机制之后,就一定会触发重绘,那么除此之外,还有哪些情形会触发重绘?

  • 颜色的修改
  • 文本方向的修改
  • 阴影的修改

浏览器的优化机制

由于每次重排都会造成额外的计算消耗,因此大多数浏览器都会通过队列化修改并批量执行来优化重排过程。浏览器会将修改操作放入到队列里,直到过了一段时间或者操作达到了一个阈值,才清空队列

当你获取布局信息的操作的时候,会强制队列刷新。