重绘和重排是什么

重绘和重排是什么:

重绘(repaint)和重排(reflow)是浏览器进行页面渲染时的两个关键概念。

重绘(Repaint):指的是当页面中的某个元素的外观发生改变,但不影响其布局(位置和大小)时,浏览器会将该元素的新外观绘制到屏幕上,这个过程称为重绘。例如,修改元素的颜色、背景等样式属性,不会引起重排,只会触发重绘。

重排(Reflow):指的是当页面中的某个元素的布局发生改变,浏览器需要重新计算元素的几何属性(如位置、大小等),并重新构建渲染树和绘制页面的过程,这个过程称为重排。例如,修改元素的宽度、高度、位置等属性,会引起重排。

重绘和重排是相互关联的,当发生重排时,必然会引起重绘。因为重排会改变元素的几何属性,从而影响到其他元素的位置和大小,所以浏览器需要重新计算和绘制这些受影响的元素。

重绘和重排的频繁发生会导致性能问题,因为它们都需要消耗一定的计算资源。为了提高性能,可以采取一些优化措施,例如:

  • 使用 CSS3 的 transform 属性替代修改元素的位置和大小,因为 transform 属性不会引起重排和重绘。

  • 批量修改样式属性,避免多次触发重排和重绘。

  • 使用文档片段(Document Fragment)来操作 DOM,减少重排和重绘的次数。

  • 使用 CSS3 的动画和过渡效果,它们在浏览器中会进行优化,减少重排和重绘的开销。

通过减少重排和重绘的次数,可以提高页面的性能和响应速度。

重绘和重排时浏览器内部发生了什么:

在浏览器内部,重绘和重排会触发一系列的操作和过程来完成页面的重新渲染。

发生重绘时,浏览器会执行以下步骤:

  1. 样式计算(Style Calculation):浏览器会根据元素的样式规则计算出元素的最终样式值,包括继承样式和层叠样式。

  2. 绘制(Painting):浏览器会将元素的最终样式值应用到绘制表面(绘制缓冲区),生成元素的位图。

  3. 栅格化(Rasterization):浏览器会将位图转换成屏幕上的像素。

  4. 显示(Display):浏览器会将栅格化后的像素发送给显示设备,显示在屏幕上。

发生重排时,浏览器会执行以下步骤:

  1. DOM 重排(DOM Recalculation):浏览器会重新计算受影响的元素的几何属性(位置、大小等),并更新 DOM 树。

  2. 样式计算:浏览器会重新计算受影响元素及其子元素的样式。

  3. 布局(Layout):浏览器会根据新的几何属性重新计算布局,确定元素的位置和大小。

  4. 绘制:浏览器会将重新布局的元素绘制到绘制表面。

  5. 栅格化:浏览器会将绘制表面转换成像素。

  6. 显示:浏览器会将栅格化后的像素发送给显示设备,显示在屏幕上。

重排和重绘的过程涉及到多个阶段和计算步骤,这些步骤会消耗一定的计算资源和时间。因此,频繁的重排和重绘会影响页面的性能和响应速度。优化页面的布局和样式操作,可以减少重排和重绘的次数,提高页面的性能。

浏览器是如何渲染页面的:
浏览器的网络线程接到HTML之后,会产生一个渲染任务,并将其传递给主线程的消息队列。
在事件循环机制的作用下,渲染主线程取出消息队列的渲染任务,开启渲染流程