一、浏览器如何渲染网页

要了解浏览器渲染页面的过程,首先得知道一个名词——关键路径渲染。关键渲染路径(Critical Rendering Path)是指与当前用户操作有关的内容。例如用户在浏览器中打开一个页面,其中页面所显示的东西就是当前用户操作相关的内容,也就是浏览器从服务器那收到的HTML,CSS,JavaScript等相关资源,然后经过一系列处理后渲染出来的web页面。

而浏览器渲染的过程主要包括以下五步:

  • 浏览器将获取的HTML文档并解析成DOM树。

  • 处理CSS标记,构成层叠样式表模型CSSOM(CSS Object Model)。

  • 将DOM和CSSOM合并为渲染树(rendering tree)将会被创建,代表一系列将被渲染的对象。

  • 渲染树的每个元素包含的内容都是计算过的,它被称之为布局layout。浏览器使用一种流式处理的方法,只需要一次pass绘制操作就可以布局所有的元素。

  • 将渲染树的各个节点绘制到屏幕上,这一步被称为绘制painting.

具体如下图过程如下图所示:

Webkit

需要注意的是,以上五个步骤并不一定一次性顺序完成,比如DOM或CSSOM被修改时,亦或是哪个过程会重复执行,这样才能计算出哪些像素需要在屏幕上进行重新渲染。而在实际情况中,JavaScript和CSS的某些操作往往会多次修改DOM或者CSSOM。

下面我们就来详细的了解一下这几个过程及需要注意的事项。

二、浏览器渲染网页的具体流程

2.1 构建DOM树

当浏览器客户端从服务器那接受到HTML文档后,就会遍历文档节点然后生成DOM树,DOM树结构和HTML标签一一对应。需要注意记下几点:

  1. DOM树在构建的过程中可能会被CSS和JS的加载而执行阻塞。(这在后面会详细介绍。)

  2. display:none 的元素也会在DOM树中。

  3. 注释也会在DOM树中

  4. script标签会在DOM树中

2.2 CSS解析

浏览器会解析CSS文件并生成CSS规则树,在过程中,每个CSS文件都会被分析成StyleSheet对象,每个对象都包括CSS规则,CSS规则对象包括对应的选择器和声明对象以及其他对象。
在这个过程需要注意的是:

  • CSS解析可以与DOM解析同进行。

  • CSS解析与script的执行互斥 。

  • 在Webkit内核中进行了script执行优化,只有在JS访问CSS时才会发生互斥。

2.3 构建渲染树(Rendr tree construction)

通过DOM树和CSS规则树,浏览器就可以通过它两构建渲染树了。浏览器会先从DOM树的根节点开始遍历每个可见节点,让后对每个可见节点找到适配的CSS样式规则并应用。具体的规则有以下几点需要注意:

  • Render Tree和DOM Tree不完全对应。

  • display: none的元素不在Render Tree中

  • visibility: hidden的元素在Render Tree中

2.4 渲染树布局(layout of the render tree)

布局阶段会从渲染树的更节点开始遍历,由于渲染树的每个节点都是一个Render Object对象,包含宽高,位置,背景色等样式信息。所以浏览器就可以通过这些样式信息来确定每个节点对象在页面上的确切大小和位置,布局阶段的输出就是我们常说的盒子模型,它会精确地捕获每个元素在屏幕内的确切位置与大小。需要注意的是:

  • float元素,absoulte元素,fixed元素会发生位置偏移。

  • 我们常说的脱离文档流,其实就是脱离Render Tree。

2.5 渲染树绘制(Painting the render tree)

在绘制阶段,浏览器会遍历渲染树,调用渲染器的paint()方法在屏幕上显示其内容。渲染树的绘制工作是由浏览器的UI后端组件完成的。

三、浏览器渲染网页的那些事儿

3.1 阻塞渲染

前面我们有提到这方面的问题,说到资源的阻塞我们清楚的是,现代浏览器总是并行加载自语言。例如当HTML解析器被脚本阻塞时,解析器虽然会停止构建DOM,但仍然会辨识该脚本后面的资源,并进行预加载。且由于以下两点。浏览器会延迟 JavaScript 的执行和 DOM 构建:

  • CSS 被默认被视为阻塞渲染的资源,因此浏览器将在 CSSOM 构建完毕前不会渲染任何已处理的内容。

  • JavaScript 不仅可以读取和修改 DOM 属性,还可以读取和修改 CSSOM 属性,因此CSS解析与script的执行互斥。

正是由于以上这些原因,script标签的位置很重要我们在实际开发中应该尽量坚持以下两个原则:

  • 在引入顺序上,CSS 资源先于 JavaScript 资源。

  • JavaScript 应尽量少的去影响 DOM 的构建。

3.2 回流和重绘(reflow和repaint)

我们都知道HTML默认是流式布局的,但CSS和JS会打破这种布局,改变DOM的外观样式以及大小和位置。因此我们就需要知道两个概念:

  • reflow(回流):当浏览器发现某个部分发生了变化从而影响了布局,这个时候就需要倒回去重新渲染,大家称这个回退的过程叫 reflow。 常见的reflow是一些会影响页面布局的操作,诸如Tab,隐藏等。reflow 会从 html 这个 root frame 开始递归往下,依次计算所有的结点几何尺寸和位置,以确认是渲染树的一部分发生变化还是整个渲染树。reflow几乎是无法避免的,因为只要用户进行交互操作,就势必会发生页面的一部分的重新渲染,且通常我们也无法预估浏览器到底会reflow哪一部分的代码,因为他们会相互影响。

  • repaint(重绘): repaint则是当我们改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性时,屏幕的一部分要重画,但是元素的几何尺寸和位置没有发生改变。

需要注意的是,display:none 会触发 reflow,而visibility: hidden属性则并不算是不可见属性,它的语义是隐藏元素,但元素仍然占据着布局空间,它会被渲染成一个空框,这在我们上面有提到过。所以visibility:hidden 只会触发 repaint,因为没有发生位置变化。

我们不能避免reflow,但还是能通过一些操作来减少回流:

  1. 用transform做形变和位移.

  2. 通过绝对位移来脱离当前层叠上下文,形成新的Render Layer。

另外有些情况下,比如修改了元素的样式,浏览器并不会立刻reflow 或 repaint 一次,而是会把这样的操作积攒一批,然后做一次 reflow,这又叫异步 reflow 或增量异步 reflow。但是在有些情况下,比如resize 窗口,改变了页面默认的字体等。对于这些操作,浏览器会马上进行 reflow。

3.3 几条关于优化渲染效率的建议

结合上文和我看到的一些文章,有以下几点可以优化渲染效率

  1. 合法地去书写 HTML 和 CSS ,且不要忘了文档编码类型。

  2. 样式文件应当在 head 标签中,而脚本文件在 body 结束前,这样可以防止阻塞的方式。

  3. 简化并优化CSS选择器,尽量将嵌套层减少到最小。

  4. 尽量减少在 JavaScript 中进行DOM操作。

  5. 修改元素样式时,更改其class属性是性能最高的方法。

  6. 尽量用 transform 来做形变和位移

转载于:https://www.cnblogs.com/guchengnan/p/10755950.html

浏览器渲染原理与过程相关推荐

  1. 重学前端 => 浏览器渲染原理,过程

    我认为作为前端工程师了解HTML,CSS,JS,浏览器的渲染以及运行原理. 就好比士兵打仗要用枪,那么士兵一定对自身的武器非常了解这样在武器发生故障的时候才可以精准的定位问题解决问题. 那么浏览器,三 ...

  2. 单文件浏览器_图文并茂深度解析浏览器渲染原理,包看懂超值得收藏

    在我们面试过程中,面试官经常会问到这么一个问题,那就是从在浏览器地址栏中输入URL到页面显示,浏览器到底发生了什么?这个问题看起来是老生常谈,但是这个问题回答的好坏,确实可以很好的反映出面试者知识的广 ...

  3. 浏览器渲染机制面试_浏览器渲染原理

    本文目录结构 问题 浏览器渲染原理 渲染过程 1. 浏览器接收到 HTML ⽂件并转换为 DOM 树 当我们打开⼀个⽹⻚时,浏览器都会去请求对应的 HTML ⽂件.虽然平时我 们写代码时都会分为 JS ...

  4. 浏览器内存不足导致页面崩溃_深度精读:浏览器渲染原理 [8000字图文并茂]

    原文地址:https://segmentfault.com/a/1190000022633988作者:_杨溜溜 在我们面试过程中,面试官经常会问到这么一个问题,那就是从在浏览器地址栏中输入URL到页面 ...

  5. 浏览器渲染机制面试_前端面试大全:浏览器渲染原理-文件无法渲染

    在这一篇文章中,我们将一起学习浏览器渲染原理这部分的知识.你可能会有疑问,我又不是做浏览器研发的,为什么要来学习这个?其实我们学习浏览器渲染原理更多的是为了解决性能的问题,如果你不了解这部分的知识,你 ...

  6. 浏览器渲染原理以及性能优化

    浏览器渲染原理以及性能优化 浏览器渲染原理 进程与线程 Request请求阶段 Response响应阶段 浏览器渲染网页注意事项 浏览器渲染网页阻塞顺序 DOM的重绘和回流 Repaint & ...

  7. 渡一大师课笔记(重点:事件循环、浏览器渲染原理)

    渡一大师课笔记(重点:事件循环.浏览器渲染原理) 响应式原理(渡一) 什么是数据响应式? 函数与数据的关联(重要) 数据变化后,会自动重新运行依赖该数据的函数(重要) 被监控的函数 render.co ...

  8. 前端浏览器渲染原理及优化

    文章目录 一.浏览器组成 1. 对浏览器内核的理解 2. 浏览器的主要组成部分 二.浏览器渲染原理 1.浏览器的渲染过程 步骤一: 步骤二: 步骤三: 步骤四: 步骤五: 2.相关概念 ①重排(更新元 ...

  9. 浏览器渲染原理-通俗易懂版本

    文章目录 浏览器渲染原理 前言 1. 网页的解析过程 2. 浏览器的功能与组成 2.1 浏览器内核 2.2 进程与线程 3. 浏览器渲染流程 3.1 渲染引擎解析过程 3.2 渲染引擎主要模块 4. ...

最新文章

  1. 如何搭建并使用便携式 4G/LTE 伪基站研究移动安全
  2. 15个Android通用流行框架大全
  3. java final关键字_终于明白 Java 为什么要加 final 关键字了!
  4. UVA 821 Page Hopping
  5. java宝典_JAVA宝典之_JAVA基础
  6. XV6操作系统代码阅读心得(二):进程
  7. python的selenium模块博客园_selenium 模块的使用
  8. mysql 优化技巧
  9. 2016年回顾2017年目标之流水账
  10. oracle时间查询
  11. 2014北京邀请赛 F Football on Table
  12. JAVA获取硬盘序列号
  13. 【编译原理系列】语法分析与上下文无关文法
  14. gimp 抠图_制作假条(wps与gimp)
  15. 【日语口语词典学习】第0002页
  16. 深度学习入门基础讲义
  17. Springboot之监控健康状况
  18. Bark 使用指南:如何自建 iOS 消息推送服务
  19. 【学习笔记】IGMP snooping原理
  20. java基础题22:(单选题)在Java中,以下描述错误的是( )

热门文章

  1. 动态内存分配到底为谁分配内存空间【浅谈动态内存的一个实例】
  2. 我搜集的C++字符类型的相互转换
  3. Python中global和nolocal作用域的理解
  4. 机器学习实战(十)利用K-means算法对未标注数据分组
  5. 透过性别看世界_透过树林看森林
  6. linux应用开发:日志记录
  7. 实现ftoa与itoa
  8. java farm tycoon_Idle Farm Tycoon
  9. mysql5.7 新增参数_MySQL 5.7 新增参数
  10. echart移上去显示内容_echarts如何移动到柱状图上显示自己想显示的提示信息