浏览器渲染过程、回流重绘

渲染引擎

渲染引擎,中文名字非常清晰,就是负责页面渲染的引擎(感觉并没有解释),另一个名词渲染引擎通常也就是浏览器内核,从js拥有了自己的引擎(比如V8)之后,解析JS的工作就从浏览器中独立出来。
简单介绍一下浏览器内核的分类,现如今的主流浏览器以及内核;

浏览器内核关系
ChromeChromium早期为webkit
FireFoxGecko开源内核
safariWebkitChrome内核原型
IETrident
EdgeEdgeHTML全新引擎
OperaBlinkChromium计划一部分

引擎对HTML的支持不尽相同,所以了解各个浏览器的引擎是什么还是有一定必要的;

渲染过程

浏览器如何组织我们的HTML与CSS并最终形成页面:
1. 加载解析HTML代码,形成DOM TREE;
2. 加载解析CSS代码,形成CSS TREE;
3. 由CSS TREE 与DOM TREE共同构成Rendering Tree,不过Rendering Tree中并不包含在CSS TREE中display:none的标签、<head>标签;
4. 对Rendering Tree 中的元素,开始进行布局计算,通过具有的相应的宽高属性确定每个元素的坐标
5. 最后便是,将我们布局好的元素Paint出来;
下面是一张关于三个树的图,很明显可以看到与展示无关的head标签、title、script等标签与display:none的元素最终不进入Render Tree;

DOM树、CSS树与Rendering树
浏览器渲染简单过程:
这里写图片描述

不可绕过的两个问题—Reflow与Repaint

当第一次布局与渲染之后,页面肯定需要与用户产生交互,产生交互就意味着页面需要重新绘制(变红、变蓝)甚至重新布局(缩小了一块区域),这就涉及到两个概念Reflow与Repaint;
Repaint:重绘,重新绘制。repaint 执行过程就是将元素的颜色、背景等属性重新绘制出来,为什么会发生重绘,因为相应区块(div、span……)的边框颜色、背景颜色、字体颜色等发生了改变;
Reflow:回流,重新排版。当页面的元素产生宽高变化,可能占据了其他元素的位置,这时浏览器就需要对页面的布局进行重新的计算,确定元素的坐标,回流发生必定伴随这重绘;

那么什么操作会触发重绘或者回流?

触发重绘:改变元素样式信息,诸如background-color、border-color、 visibility等
触发回流:改变元素的位置信息,宽高信息甚至删除或者添加DOM元素
1. DOM操作(增、删、改,改变DOM排序)
2. 浏览器窗口的操作
3. 内容变化,包括表单域内的文本改变(font-size的改变)
4. 增删样式表内容()
5. 修改class属性
6. 伪类激活(:hover、:active)
7. offsetWidth, width, clientWidth, scrollTop/scrollHeight的计算, 会使浏览器将渐进回流队列Flush,立即执行回流。

回流与重绘的影响

最简单的来说,当然是会导致性能不佳了。如果长期操作DOM,产生浏览器的回流(回流必定导致重绘),内核一定是相当忙的要不停地去计算位置、宽高,完了还要去填充像素(重绘)。

优化方向

那么优化方向就是,减少页面的重绘与回流。怎么做?看看谁导致他们回流与重回就知道了。
1. 避免多层样式,已经有class的情况下去添加style属性只会让浏览器多计算一次,多来一次回流,我们应该通过改变class的方法去设置样式(这样也便于管理整体样式不是吗?);
2. 牺牲平滑度换取速度,在操纵移动时,如果每秒移动1px与3px的差距可以忍受,那么用3px,我们的回流与重绘也将大大减少;
3. 避免使用古老的table布局,因为table是个和罕见的可以影响在它们之前已经进入的DOM元素的显示的元素,并且即使一些小的变化将导致table中的所有其他节点回流
4. 在具有fixed、absolute属性的元素上使用动画(OR在动画元素上添加fixed、absolute),他们独自成了自己的文档流,不会影响到主文档流的布局;
5. offsetWidth, width, clientWidth, scrollTop/scrollHeight等值缓存,避免过多访问(DOM元素访问也要缓存);

资料:
  1. So how does the browser actually render a website | JSConf EU 2015 https://www.youtube.com/watch?v=SmE4OwHztCc
浏览器渲染过程是一个复杂但高效的机制,主要涉及多个关键步骤,包括构建DOM树、CSS规则树、渲染树、布局、制和合成等阶段。以下是详细说明: ### 构建DOM树 当浏览器接收到HTML文档后,会解析HTML并生成DOM(Document Object Model)树。DOM树是一个由HTML标签转换而来的层次结构,每个节点代表一个HTML元素。解析过程中,浏览器会处理HTML标签并生成相应的节点对象,形成树状结构 [^3]。 ### 构建CSS规则树 与此同时,浏览器会解析CSS样式表,将CSS规则转化为CSS对象模型(CSSOM),即CSS规则树。CSSOM与DOM树是分开构建的,但它决定了每个DOM节点的样式属性。CSSOM的构建需要解析CSS文件、内联样式以及浏览器默认样式 [^3]。 ### 构建渲染树 在DOM树和CSSOM构建完成后,浏览器会将两者结合,生成渲染树(Render Tree)。渲染树包含所有可见元素及其样式信息,不包括隐藏元素(如`<head>`标签中的内容或`display: none`的元素)。渲染树的构建是为后续的布局和制做准备 。 ### 布局(Layout) 布局阶段也称为“回流”(Reflow),是计算每个元素在页面中的确切位置和大小的过程浏览器会根据渲染树遍历所有节点,并将它们以盒模型的形式写入文档流。这个阶段决定了每个元素的几何属性,如宽度、高度、位置等 [^1]。 ### 制(Painting) 在布局完成后,浏览器会进入制阶段。此阶段会将每个元素的视觉信息(如颜色、边框、文本、阴影等)制到屏幕上。过程是逐层进行的,通常分为多个图层进行管理,以提高渲染效率 [^3]。 ### 合成(Compositing) 最后,浏览器会将多个图层按照正确的顺序进行合成,最终呈现给用户。现代浏览器通常使用GPU进行合成操作,以提升性能。复合图层可以避免不必要的排,提高页面渲染效率 [^3]。 ### 回流 当DOM元素的几何属性发生变化时(如修改宽度、高度或位置),浏览器触发回流(Reflow),新计算元素的位置和大小。回流之后通常会触发(Repaint),将新的几何属性制到屏幕上。频繁的回流会影响性能,因此在开发中应尽量减少此类操作 [^4]。 ### 浏览器渲染引擎的组件 浏览器渲染引擎负责解析HTML和CSS,并将结果显示到窗口中。其核心组件包括: - **DOM解析器**:负责解析HTML文档并构建DOM树。 - **CSS解析器**:负责解析CSS样式并生成CSSOM。 - **布局引擎**:负责计算元素的几何属性。 - **制引擎**:负责将元素制到屏幕上。 - **JavaScript引擎**:负责解析和执行JavaScript代码,可能会影响DOM和CSSOM的更新 [^2]。 ### 优化渲染性能 为了提升浏览器渲染性能,开发者可以采取以下措施: - **减少DOM操作**:频繁的DOM修改会触发多次回流,应尽量合并DOM操作。 - **使用CSS动画优化**:使用`transform`和`opacity`属性进行动画操作,可以避免触发回流。 - **避免强制同步布局**:某些JavaScript操作会强制浏览器立即执行布局,影响性能。 - **使用复合图层**:将频繁变化的元素提升为复合图层,可以减少对其他元素的影响 。 ```css /* 使用 transform 进行动画优化 */ .element { transition: transform 0.3s ease; } .element:hover { transform: scale(1.1); } ``` ### 相关问题 1. 什么是回流(Reflow)和(Repaint)?它们对性能有什么影响? 2. 如何通过CSS和JavaScript优化浏览器渲染性能? 3. 浏览器是如何处理复合图层的?复合图层有哪些优缺点? 4. DOM树、CSSOM和渲染树之间有什么关系? 5. JavaScript是如何影响浏览器渲染过程的?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值