渲染树和DOM树

在这里插入图片描述

HTML 经过解析生成 DOM树; CSS经过解析生成 Style Rules。 二者一结合生成了Render Tree。 通过layout计算出DOM要显示的宽高、位置、颜色。 最后渲染在界面上,用户就看到了

浏览器的渲染过程:

  1. 解析 HTML 构建 DOM(DOM 树),并行请求 css/image/js

  2. CSS 文件下载完成,开始构建 CSSOM(CSS 树)

  3. CSSOM 构建结束后,和 DOM 一起生成 Render Tree(渲染树)

  4. 布局(Layout):计算出每个节点在屏幕中的位置

  5. 显示(Painting):通过显卡把页面画到屏幕上

DOM树和渲染树的区别

  • DOM 树与 HTML 标签一一对应,包括 head 和隐藏元素
  • 渲染树不包括 head 和隐藏元素,大段文本的每一个行都是独立节点,每一个节点都有对应的 css 属性

CSS会阻塞DOM解析么?

对于一个HTML文档来说,不管是内联还是外链的css,都会阻碍后续的dom渲染,但是不会阻碍后续dom的解析。

当css文件下载中时,虽然css解析也会阻塞后续dom的渲染,但是在解析css的同时也在解析dom,所以等到css解析完毕就会逐步的渲染页面了

重绘和回流(重排)的区别和关系

  • 重绘:当渲染树中的元素外观(如:颜色)发生改变,不影响布局时,产生重绘
  • 回流:当渲染树中的元素的布局(如:尺寸、位置、隐藏/状态状态)发生改变时,产生重绘回流
  • 注意:JS 获取 Layout 属性值(如:offsetLeft、scrollTop、getComputedStyle
    等)也会引起回流。因为浏览器需要通过回流计算最新值
  • 回流必将引起重绘,而重绘不一定会引起回流

DOM结构中的各元素都有自己的盒子,这些都需要浏览器根据各种样式来计算,并根据结果将元素放到它该出现的位置,这个过程叫 reflow

触发reflow

  • 添加或删除可见的DOM元素。
  • 元素位置改变。
  • 元素的尺寸改变(包括:内外边距、边框厚度、宽度、高度等属性的改变)。
  • 内容改变。
  • 页面渲染器初始化。
  • 浏览器窗口尺寸改变。

如何最小化重绘(repaint)和回流(reflow)

以下几个操作会导致性能问题

  • 改变 window 大小
  • 改变字体
  • 添加或删除样式
  • 文字改变
  • 定位或者浮动
  • 盒模型

解决方法

  • 需要对DOM元素进行复杂的操作时,可以先隐藏(display:“none”),操作完成后再显示

  • 需要创建多个 DOM 节点时,使用 DocumentFragment 创建完后一次性的加入
    document,或使用字符串拼接方式构建好对应HTML后再使用innerHTML来修改页面

  • 缓存 Layout 属性值,如:var left = elem.offsetLeft; 这样,多次使用 left 只产生一次回流

  • 避免用 table 布局(table 元素一旦触发回流就会导致 table 里所有的其它元素回流)

  • 避免使用 css 表达式(expression),因为每次调用都会重新计算值(包括加载页面)

  • 尽量使用 css 属性简写,如:用 border 代替 border-width, border-style, border-color

  • 批量修改元素样式:elem.className 和 elem.style.cssText 代替 elem.style.xxx

### DOMCSSOM渲染树的概念及关系 #### 什么是DOM? 文档对象模型(Document Object Model, DOM)是一种用于表示HTML或XML文档的标准编程接口。当浏览器接收到HTML文件并开始解析时,它会将这些标记语言的内容转换为一棵节点,即DOM。这棵中的每个节点代表了一个HTML元素、属性或者文本片段[^4]。 #### CSSOM是什么? 层叠样式表对象模型(CSS Object Model, CSSOM),类似于DOM,但它专注于描述如何应用样式到网页上。一旦外部或内部的CSS资源被下载完成,浏览器就会创建一颗CSSOM来存储所有的样式规则及其对应的选择器信息[^1]。 #### 渲染树的意义 渲染树是由DOMCSSOM共同组合而成的一棵新。此包含了可见于屏幕上的所有内容——无论是来自HTML还是通过CSS定义的视觉效果。只有那些最终会被显示出来的部分才会进入这个阶段;例如,`display:none;`隐藏掉的部分不会出现在渲染树里[^2]。 #### 构建过程概述 整个构建流程可以分为以下几个主要环节: 1. **加载HTML**: 当用户访问某个URL地址之后,浏览器发起HTTP请求获取该页面对应的HTML源码。 2. **构建DOM**: 接着,基于所接收的数据流逐步建立起了反映文档逻辑结构的抽象表现形式—DOM Tree。 3. **加载CSS**: 并行地,在继续读取更多HTML数据之前,任何关联好的CSS文件也会尽快被抓取下来以便尽早影响布局计算工作。 4. **构建CSSOM**: 使用已有的CSS声明建立起另一套专门针对样式的层级体系–CSSOM Tree. 5. **合成渲染树**: 将上述两颗独立存在的木结合起来形成第三种形态叫Render Tree(亦可称为Layout Tree),其中仅保留实际需要呈现给用户的那部分内容节点。 6. **执行布局(Layout)**: 计算每一个可视区域的具体尺寸位置参数等细节方面的东西。 7. **绘制(Paint)**: 把经过精确测量后的图形化组件按照指定顺序画出来构成完整的视图界面供人们观看交互操作之用[^3]. 8. **JavaScript运行**: 如果存在脚本,则可能改变以上任何一个步骤的结果甚至重新触发某些特定事件链路从而引起回流(reflow) 或重绘(repait). #### 示例代码展示简单的DOM操作 下面是一个简单例子演示如何利用javascript动态修改现有的dom元素: ```javascript // 获取id为example的div元素 var divElement = document.getElementById('example'); // 修改其背景颜色 divElement.style.backgroundColor = 'blue'; // 添加一个新的子段落p标签进去 var newParagraph = document.createElement('p'); newParagraph.textContent = 'This is a dynamically added paragraph.'; divElement.appendChild(newParagraph); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值