2023-07-05 18:56:44
JS中浏览器渲染原理是通过解析HTML、CSS和JS代码,构建渲染树并完成布局、绘制与合成,最终将页面内容显示在屏幕上。具体过程如下:
1. 解析HTML生成DOM树
浏览器接收到HTML文档后,会将其解析为DOM(文档对象模型)树。DOM树以树状结构表示文档的层级关系,每个节点对应一个HTML标签,包含标签的属性和内容。例如,<div>标签会成为DOM树中的一个节点,其子标签会成为子节点。DOM树是后续渲染的基础,它完整描述了文档的结构和语义。
2. 解析CSS生成CSSOM
浏览器同时解析HTML中内联的、外部引入的或通过<style>标签定义的CSS样式,构建CSS对象模型(CSSOM)。CSSOM以树状结构存储样式规则,包括选择器、属性和值。例如,.container { width: 100%; }会被解析为CSSOM中的一个节点,其属性会影响后续渲染树的样式计算。CSSOM的构建是异步的,但会阻塞渲染树的生成,因为渲染树需要结合DOM和CSSOM的信息。
3. 合并DOM与CSSOM生成渲染树
浏览器将DOM树和CSSOM合并,生成渲染树(Render Tree)。渲染树仅包含需要显示的节点(如排除了display: none的元素),每个节点关联对应的样式信息。例如,一个<p>标签及其文本内容会成为渲染树中的一个节点,其样式(如字体、颜色)来自CSSOM。渲染树的构建是布局和绘制的前提。
4. 布局(重排)计算元素位置与尺寸
浏览器根据渲染树的布局信息,计算每个元素在视口中的精确位置和尺寸。这一过程称为布局或重排(Reflow)。布局是计算密集型操作,需考虑元素间的层级关系、盒模型属性(如margin、padding)以及视口大小。例如,修改元素的width或height会触发重排,导致浏览器重新计算相关元素的布局。
5. 绘制(重绘)生成像素级图像
布局完成后,浏览器将渲染树的每个节点转换为屏幕上的像素,这一过程称为绘制或重绘(Repaint)。绘制涉及将样式属性(如背景色、边框)应用到元素上,并生成位图。例如,修改元素的color或background-color会触发重绘,但不会影响布局。重绘的复杂度取决于样式变化的范围。
6. 合成处理图层与显示
现代浏览器将页面拆分为多个图层(如文本、背景、动画),分别绘制后合成为最终图像。合成过程(Compositing)处理图层间的透明度、混合模式和叠加顺序,确保视觉效果正确。例如,使用transform或opacity的动画通常由合成器处理,避免触发重排和重绘,从而提升性能。
JS对渲染的影响与优化
JS执行会阻塞渲染:当浏览器遇到<script>标签时,会暂停HTML解析,先执行JS代码(除非标记为async或defer)。这是因为JS可能修改DOM或CSSOM(如通过document.body.style.color = 'red'),导致渲染树重建。为优化性能,浏览器采用以下策略:
理解渲染原理有助于编写高效代码,例如减少重排/重绘(如批量修改DOM、使用CSS transforms替代布局属性),从而提升页面加载速度和用户体验。