2.构建DOM与CSSOM 来源:https://w0hog67yl81.feishu.cn/wiki/KBxwwj9RAi5Swmk8jQVcQyR9nvc 采集状态:已完成正文采集;已滚动到底部并按块及代码行号采集 一、 DOM树的构建过程 (Incremental) 当浏览器从服务器接收到HTML文档的字节数据后,它会立即开始处理,这个过程是渐进式的,意味着浏览器无需等待整个文档加载完毕就可以开始解析和渲染页面。 构建流程如下: 1. 字节 (Bytes) → 字符 (Characters): 浏览器根据文件指定的编码(例如 UTF-8)将原始的字节数据转换为字符。 2. 字符 (Characters) → 令牌 (Tokens): 浏览器将字符串形式的字符转换为W3C HTML5标准所规定的各种令牌(Token),例如 、
等。每个令牌都具有特殊的含义和一组属性。这个过程被称为“词法分析”或“令牌化”。 3. 令牌 (Tokens) → 节点 (Nodes): 经过词法分析后,令牌会被转换成定义了其属性和规则的“对象”(即节点)。 4. 节点 (Nodes) → DOM树 (DOM Tree): 由于HTML中的元素存在嵌套关系,这些节点之间会根据这种关系链接成一个树形数据结构,这就是文档对象模型(DOM)。 关键特性:渐进式构建 DOM的构建过程是自上而下、循序渐进的。浏览器每接收到一部分HTML,就会解析并生成对应的DOM节点,并将其添加到DOM树中。这使得浏览器可以在接收到全部HTML之前,就开始渲染页面的已就绪部分,这也是为什么我们有时会看到网页内容从上到下一点点加载显示出来的原因。 二、 CSSOM树的构建过程 (Blocking) 与构建DOM类似,当浏览器遇到CSS代码(无论是外部CSS文件、style标签还是内联样式)时,也会进行类似的处理。 构建流程如下: 1. 字节 (Bytes) → 字符 (Characters): 将CSS文件字节转换为字符。 2. 字符 (Characters) → 令牌 (Tokens): 将字符转换为CSS令牌。 3. 令牌 (Tokens) → 节点 (Nodes): 将令牌转换为包含样式信息的CSS节点。 4. 节点 (Nodes) → CSSOM树 (CSSOM Tree): 将CSS节点聚合成一个树形结构,即CSS对象模型(CSSOM)。 关键特性:渲染阻塞 与DOM不同,CSSOM的构建是渲染阻塞 (Render-Blocking)的。这意味着在CSSOM树完全构建完成之前,浏览器不会进行后续的渲染树构建、布局和绘制工作。 三、 为何DOM是渐进式的,而CSSOM是阻塞性的? 理解这个差异的核心在于样式的继承和覆盖规则。 • 对于DOM:一个父节点的结构并不会被其后的兄弟节点或子节点所改变。解析到