????????当浏览器的网络线程收到html文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。在事件循环机制的作用下,渲染线程取出消息队列中的渲染任务,开启渲染流程Renderer(线程是Theread)。
? ? ? ? 将HTML解析为DOM树和CSSOM树。
为了提?解析效率,浏览器会启动?个预解析器率先下载和解析 CSS?
渲染主线程遇到 JS 时必须暂停?切?为,等待下载执?完后才能继续 预解析线程可以分担?点下载 JS 的任务?
? ? ? ? 根据构建的DOM树和CSSOM树计算样式,构建渲染树
? ? ? ? 在渲染树上运行布局以计算每个节点的几何体,确定呈现树中所有节点的宽度、高度和位置,以及确定页面上每个对象的大小和位置,构建Layout树。
? ? ? ?DOM树和Layout树不一定是一 一对应的。原因:
? ? ? ? 1.可能会包含display:none
? ? ? ? 2.可能会存在::before和::after伪元素。
? ? ? ? 3.存在匿名盒
?
?
????????这?的绘制,是为每?层?成如何绘制的指令
????????渲染主线程的?作到此为?,剩余步骤交给其他线程完成?
????????分块会将每?层分为多个?的区域?
????????分块的?作是交给多个线程同时进?的?
????????光栅化是将每个块变成位图,优先处理靠近视?的
????????此过程会?到 GPU 加速?
?????????合成线程计算出每个位图在屏幕上的位置,交给 GPU 进?最终呈现
?
????????当我们对 DOM 的修改引发了 DOM 几何尺寸的变化(比如修改元素的宽、高或隐藏元素等)时,浏览器需要重新计算元素的几何属性(其他元素的几何属性和位置也会因此受到影响),然后再将计算的结果绘制出来。这个过程就是回流(也叫重排)。【重新排列布局,即打碎重组】
????????reflow 的本质就是重新计算 layout 树。当进行了会影响布局树的操作后,需要重新计算布局树,会引发 layout。为了避免连续的多次操作导致布局树反复计算,浏览器会合并这些操作,当 JS 代码全部完成后再进行统一计算。所以,改动属性造成的 reflow 是异步完成的。也同样因为如此,当 JS 获取布局属性时,就可能造成无法获取到最新的布局信息。浏览器在反复权衡下,最终决定获取属性立即 reflow。
????????当我们对 DOM 的修改导致了样式的变化、却并未影响其几何属性(比如修改了颜色或背景色)时,浏览器不需重新计算元素的几何属性、直接为该元素绘制新的样式。这个过程叫做重绘。
????????repaint 的本质就是重新根据分层信息计算了绘制指令。当改动了可见样式后,就需要重新计算,会引发 repaint。由于元素的布局信息也属于可见样式,
????????所以 reflow 一定会引起 repaint。
????????
????????因为 transform 既不会影响布局也不会影响绘制指令,它影响的只是渲染流程的最后一个「draw」阶段。由于 draw 阶段在合成线程中,所以 transform 的变化几乎不会影响渲染主线程。反之,渲染主线程无论如何忙碌,也不会影响 transform 的变化。
?
?
?
?