发布网友 发布时间:2022-09-07 06:26
共1个回答
热心网友 时间:2024-09-29 11:09
HTML 、 CSS 、 JavaScript 数据,经过浏览器中间渲染模块的处理,再加上 重排 、 重绘 、 合成 的一个个环节,才最终输出为屏幕上的 像素 视图画面。本文就逐一介绍 重排 、 重绘 、 合成 的基本概念、触发时机、影响范围以及其优化策略。
一个完整的渲染流程一般都经历如下过程:
定义: 当通过JS或css改变了元素的宽度、高度等,修改了元素的几何位置属性,那么浏览器会触发重新布局,解析之后的一系列子阶段,这个过程就叫 重排 。无疑, 重排需要更新完整的渲染流水线,所以开销也是最大的。
触发时机和影响范围: DOM节点信息更改,触发重排时,这个DOM更改程度会决定周边DOM更改范围。
全局范围: 就是从根节点html开始对整个渲染树进行重新布局,例如当我们改变了窗口尺寸或方向或者是修改了根元素的尺寸或者字体大小等。
局部范围: 对渲染树的某部分或某一个渲染对象进行重新布局。
定义: 如果修改了元素的背景颜色,并没有引起几何位置的变换,所以就直接进入了绘制阶段,然后执行之后的一系列子阶段,这个过程就叫 重绘 。 相较于重排操作,重绘省去了布局和分层阶段,所以执行效率会比重排操作要高一些。
触发时机和影响范围: 每一次的dom更改或者css几何属性更改,都会引起一次浏览器的重排/重绘过程,而如果是css的非几何属性更改,则只会引起重绘过程。
定义: 合成是一种将页面的各个部分分离成层(Layer Tree),分别将它们栅格化,然后在称为“合成线程”的中组合为页面的技术。
触发时机和影响范围: 在GUI渲染线程后执行,将GUI渲染线程生成的绘制列表转换为位图,然后发送绘制图块命令 DrawQuad 给浏览器进程,浏览器进程根据 DrawQuad 消息生成页面,将页面显示到显示器上
优点: 我们使用了 CSS 的 transform 来实现动画效果,避开了 重排 和 重绘 阶段,直接在非主线程上执行合成动画操作。这样的效率是最高的,因为是在非主线程上合成,并没有占用主线程的资源,另外也避开了布局和绘制两个子阶段,所以相对于重绘和重排,合成能大大提升绘制效率。
重排 一定会引起 重绘 ,而 重绘 不一定会引起 重排 , 重绘 的开销较小, 重排 的代价较高。在日常开发过程中应该尽量减少 重排 和 重绘 操作。
欢迎访问: 天问博客