DOM树和CSSOM树的构建和渲染

article/2025/10/31 16:07:00

页面的渲染过程

当我们在浏览器里输入一个 URL 后,最终会呈现一个完整的网页。会经历以下几个步骤:

1、HTML 的加载

页面上输入 URL 后,会先拿到 HTML 文件。HTML是一个页面的基础,所以会在最开始的时候下载它,下载完毕后就开始对它进行解析

2、其他静态资源的下载

HTML 在解析的过程中,如果发现 HTML 文本里面有一些外部的资源链接,比如 CSS、JS 和图片等,会立即启用别的线程下载这些静态资源。在 head 中遇到 JS 文件时,HTML 的解析会停 下来,等 JS 文件下载结束并且执行完,HTML 的解析工作再接着来,防止 JS 修改已经完成的解析结果

知识拓展

由上得知,JS 文件放在 head 中属于同步加载,会阻塞 DOM 树的构建,进而影响页面的加载。当 JS 文件较多时,页面白屏的时间也会变长

那如何避免这个问题呢?下面有三个解决方案

1、 script 放在 body 里(一般是 </body> 上面)

由于 DOM 是自上而下解析的,因此 JS 不会阻塞 DOM 的解析,而且这时候可以在 JS 中操作 DOM

2、设置 defer 属性

通过给 script 标签设置 defer 属性,将脚本文件设置为延迟加载,当浏览器遇到带有 defer 属性的 script 标签时,会再开启一个线程去下载 JS 文件,同时继续解析 HTML,等 HTML 全部解析完、DOM 加载完成之后,再去执行加载好的 JS 文件。只适用于引用外部 JS 文件,并且可以确保所有加了 defer 属性的脚本会按顺序执行

3、设置 async 属性

async 属性和 defer 属性类似,也是会开启一个线程去下载js文件,但和 defer 不同的是,aysnc 会在 JS 加载完成后立刻执行,而不是会等到 DOM 加载完成之后再执行,所以还是有可能会造成阻塞。同样的也是只适用于外部 JS 文件,如果有多个设置了 aysnc 的 JS 文件,不能像 defer 那样保证按照顺序执行

4、动态创建脚本

这样去动态创建文件也不会影响到页面的加载,以下是百度统计的demo

<script>var _hmt = _hmt || [];
(function () {var hm = document.createElement("script");hm.src = "https://hm.baidu.com/hm.js";var s = document.getElementsByTagName("script")[0];s.parentNode.insertBefore(hm, s);
})();
</script>

3、DOM 树的构建

DOM 的全称是:文档对象模型(Document Object Model),在 HTML 解析时,解析器会把解析完的 HTML转化成 DOM 对象,再进一步构建 DOM 树

4、CSSOM 树的构建

当 CSS 下载完,CSS 解析器就开始对 CSS 进行解析,把 CSS 解析成 CSS 对象,然后把这些 CSS 对象组装成一颗 CSSOM 树

5、渲染树的构建

DOM 树和 CSSOM 树都构建完成以后,浏览器会根据这两棵树构建出一棵渲染树

6、布局计算

渲染树构建完成以后,所有元素的位置关系和需要应用的样式就确定了。这时候浏览器会计算出所有元素的大小
和绝对位置

7、渲染

布局计算完成以后,浏览器就可以在页面上渲染元素了,经过渲染引擎的处理后,整个页面就显示在了屏幕上

上面是一个浏览器渲染页面的大概过程,接下来就来把这个过程的几个重要部分再详细讲下


DOM 树的构建

页面中的每一个 HTML 标签,都会被浏览器解析成一个对象,我们称它为文档对象(Document Object)。HTML
本质是一个嵌套结构,在解析的时候会把每个文档对象用一个树形结构组织起来,所有的文档对象都会挂在一个叫做 Document 的东西上,这种组织方式就是 HTML 最基础的结构–文档对象模型(DOM),这棵树里面的每个文档对象就叫做 DOM 节点。
在 HTML 加载的过程中,DOM 树就在开始构建了。构建的过程是先把 HTML 里每个标签都解析成 DOM 节点(每
个标签的属性、值和上下文关系等都在这个文档对象里),然后使用深度遍历的方法把这些对象构造成一棵树。
我们以下面的 HTML 文件为例:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><header><p>header</p></header><div class="content"><p class="title">title</p></div>
</body>
</html>

在构建 DOM 树的时候,就是从最外层 HTML 节点开始,按深度优先的方式构建。之所以用深度优先,是因为HTML在加载的时候是自上而下的,最先加载的是根节点 ,然后是根节点的第一个子节点 ,再然后是 head 的第一个子节点,head 构建完成后再去构建 body 部分的内容,以此类推。使用深度优先的方式构建 这棵树就和文档的加载顺序吻合了。最后,上面这个 HTML 结构会生成这样一颗 DOM 树:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UFUa0edZ-1589276730057)(https://user-gold-cdn.xitu.io/2020/5/12/172083fc6802bb64?w=532&h=287&f=png&s=12789)]

CSSOM 树的构建

在浏览器构建 DOM 树的同时,如果样式也加载完成了,那么 CSSOM 树也在同步地构建。CSS 树和 DOM 类
似,它的树形结构会记录所有样式的信息

假设我们给上面的 HTML 加上这些样式:

body {font-size: 16px;
}p {margin: 0;padding: 0;
}header {width: 100%;height: 50px;text-align: center;display: none;
}header p {color: #333;
}.content {padding: 0 16px;
}.content .title {font-size: 24px;
}

Tips:

1、这棵树的结构只是一个示意图,并不是浏览器构造 CSSOM 树的真实数据结构,各个浏览器实现 CSSOM 树的方式也不完全相同

2、CSSOM 树和 DOM 树是独立的两个数据结构,它们没有一一对应的关系。DOM 树描述的是 HTML 标签的层级关系,CSSOM 树描述的是选择器之间的层级关系

3、CSS 中存在样式继承机制,有些属性在父节点设置后,其后代节点都会具备这个样式。比如在 html 上设置一个 “color: red” ,那页面的所有标签都会继承这个属性。当然不是所有标签和属性都是可以继承的,比如 border 这种属性就是不可继承的。如果 border 可继承,那么在一个父元素里设置了以后,所有子元素都会有个边框,这显然是不合理的。所以在大部分情况下,通过这种推理,就能知道哪些样式可以继承,哪些样式不可以继承

 


http://chatgpt.dhexx.cn/article/4hTafAYc.shtml

相关文章

深入解析DOM树的加载

DOM树 在介绍 DOM 树之前&#xff0c;首先要清楚&#xff0c;DOM 规范中&#xff0c;对于文档的表示方法并没有任何限制&#xff0c;因此&#xff0c;DOM 树只是多种文档结构中的一种较为普遍的实现方式。 DOM 结构构成的基本要素是 “节点“&#xff0c;而文档的结构就是由层…

DOM树节点解析

目录(?)[] 转自&#xff1a;http://blog.csdn.net/skyer518/article/details/37904787 DOM是解析XML文件的官方标准&#xff0c;它与平台和语言无关。DOM解析将整个XML文件载入并组装成一棵DOM节点树&#xff0c;然后通过遍历、查找节点以读取XML文件中定义的数据。由于DOM解析…

JavaScript之DOM树

一、什么是DOM树&#xff1f; DOM &#xff08;Document Object Model&#xff09;是指文档对象模型&#xff0c;通过它&#xff0c;可以访问HTML文档的所有元素。 DOM树是结构&#xff0c;所谓层级结构是指元素和元素之间的关系&#xff1a;父子&#xff0c;兄弟。 文档&am…

JavaScript的DOM 树是如何构建的 ?

今天通过对 DOM 模型、HTML 解释器和 JavaScript 的执行的介绍&#xff0c;来初步学习 HTML 解释器是如何将从网络或者本地文件获取的字节流转成 DOM 树的。 DOM 模型 1、DOM 标准 DOM (Document Object Model) 的全称是文档对象模型&#xff0c;它可以以一种独立于平台和语言…

DOM系列:DOM树和遍历DOM

上一节&#xff0c;咱们整理了DOM系列中的第一篇&#xff0c;主要介绍浏览器与DOM相关的知识。从标题中我们可以看出来&#xff0c;今天所要学的东西包含两个部分&#xff0c;第一部分是DOM树&#xff0c;第二部分是遍历DOM。如果你和我一样对于DOM树和遍历DOM是初次接触&#…

DOM树的理解【面试常问】

前言 vue和react框架被广泛应用&#xff0c;封装了DOM操作但是DOM操作一直都是前端工程师的基础、必备知识只会vue而不懂DOM操作的程序员&#xff0c;不会长久 DOM 全称为文档对象模型&#xff08;Document Object Model&#xff09;。有这几个概念&#xff1a; 文档、元素…

DOM树知识点梳理

为什么会提到Dom树呢,或许它对于我们很好地理解网页各个元素,标签和控件搭配,以及各种js,css等的加载会有一些帮助。笔者在工程中遇到了一些小问题,本质就是dom树的东西掌握的不扎实。所以借此来梳理一下。 1.HTML DOM ok, 我们先来看一下W3school中怎么解释这个概念和结…

浏览器-DOM树

前言&#xff1a; 在渲染流水线中直接或者间接地依赖于 DOM 结构&#xff0c;本文按着网络数据流路径来介绍 DOM 树是如何进行构建的。 节点&#xff08;Node&#xff09;&#xff1a; 节点&#xff08;Node&#xff09;原本是网络术语&#xff0c;表示网络中的连接点。一个网…

Dom树,什么是dom树?

相信很多初学前端的小伙伴&#xff0c;学了html, css, js之后&#xff0c;会遇到 一个名词 DOM树。 首先说一下DOM是什么&#xff1f; DOM 是 Document Object Model&#xff08;文档对象模型&#xff09;的缩写。 举个例子 我们日常生活中&#xff0c;经常会遇到一些写文档…

对 Dom 树的理解

什么是 DOM 从网络传给渲染引擎的 HTML 文件字节流是无法直接被渲染引擎理解的&#xff0c;所以要将其转化为渲染引擎能够理解的内部结构&#xff0c;这个结构就是 DOM。 DOM 提供了对 HTML 文档结构化的表述。 在渲染引擎中&#xff0c;DOM 有三个层面的作用&#xff1a; …

DOM初探(9)——DOM结构树

document一回车&#xff0c;他就代表整个文档&#xff1b;Document一回车&#xff0c;他代表的是一个函数&#xff0c;什么函数需要首字母大写&#xff1f;构造函数吧&#xff0c;只不过这个Document有点特殊&#xff0c;你不能new他&#xff0c;这时系统留给自己new的。那这个…

dom树是如何生成的

页面得渲染流程总得俩说就五步&#xff0c;创建 DOM 树——创建 StyleRules——创建 Render 树——布局Layout&#xff08;重排&#xff09;——绘制 Painting&#xff08;重绘&#xff09; 第一步&#xff0c;用 HTML 分析器&#xff0c;分析 HTML 元素&#xff0c;构建一颗 D…

Dom树 CSS树 渲染树(render树) 规则、原理

前端不可不学的浏览器渲染机制&#xff0c;阿里年年问&#xff0c;去一个栽一个。听说百度也在考这个&#xff0c;你还不准备学吗&#xff1f; 首先你要了解浏览器渲染的顺序&#xff1a;   1.构建dom 树   2.构建css 树   3.构建渲染树   4.节点布局   5.页面渲染 什么…

HTML-DOM树篇

一、什么是DOM DOM&#xff08;Document Object Model&#xff09; 文档对象模型&#xff0c;是HTML和XML文档的编程接口 DOM 以树结构表达 HTML 文档&#xff0c;树的每个分支的终点都是一个节点&#xff0c;每个节点都包含着对象DOM 将web页面与脚本或编程语言链接起来&#…

DOM结构(DOM树)

DOM 文档类型DOM&#xff08;Document Object Model&#xff09;主要用于HTML文档和XML文档的内容进行操作。DOM描绘了一个层次化的节点树&#xff0c;通过节点的操作&#xff0c;来实现对文档内容进行增删改查。 1.DOM&#xff08;Document Object Model&#xff09;&#x…

DOM(一)概述、dom树、查找元素

目录 一、DOM 概述 二、DOM树 二、查找元素 1. 无需查找的元素 2. 按节点间关系查找 3. 按 HTML 特征查找 三、案例&#xff1a;通过DOM实现购物车效果 一、DOM 概述 DOM全称 Document Object Model&#xff0c;是专门操作网页内容的一套对象和函数的总称。由于 ES 标准…

DOM深入学习 --- DOM 树介绍,如何遍历 DOM 树节点(一)

DOM 树 HTML 文档的主干是标签&#xff08;tag&#xff09;。 根据文档对象模型&#xff08;DOM&#xff09;&#xff0c;每个 HTML 标签都是一个对象。嵌套的标签是闭合标签的“子标签&#xff08;children&#xff09;”。标签内的文本也是一个对象。 所有这些对象都可以通…

什么是DOM?你了解DOM树吗?

在找工作的过程中&#xff0c;看到了招聘信息上有写这么一条信息&#xff1a; 掌握WEB前端开发技术&#xff1a;JavaScript(含ES6)、HTML、CSS、DOM等 看见这条信息我心里安心了不少&#xff0c;都是一些基础问题&#xff0c;但是乍一看DOM&#xff0c;脑子有点短路了&#x…

Windows命令:CHCP

CHCP 用途一&#xff1a;Windows操作系统默认编码格式是GBK&#xff08;963&#xff09;&#xff0c;cmd窗口编码方式设置为UTF-8方法&#xff1a; 临时修改方案&#xff1a;CHCP 65001永久修改方案&#xff1a;参考资料&#xff1a;https://jingyan.baidu.com/article/d71306…

查看windows操作系统的默认编码(字符集)-chcp

在windows cmd 模式下&#xff0c;输入命令 &#xff1a; chcp 如上图&#xff0c;我的活动代码页为936&#xff0c;意思是"中国-简体中文(GB2312)" 说明&#xff1a;代码页是“字符集编码”的别名&#xff0c;也有人称为“内码表”。 下表列出了所有支持的代码页…