chrome浏览器在地址栏输入URL到页面展示,这中间发生了什么?(中)

距上次的导航流程已有些日子,趁着这次休假把剩下的渲染流程也分享出来。
通过本文可以透视浏览器是如何进行渲染工作的。

众所周知,浏览器传输的相关文件包括 js文件html文件css文件。

//HTMl: 超文本 标记语言

山野乔治

//CSS:层叠样式表 p { color: red } //JavaScript p.style.color = 'gray' 通过页面修改内容

1.html的内容由标记和文本组成,标记也称为标签。每个标签都有自己特定的含义,浏览器会根据不同的语义化的标签来进行渲染不同的内容。比如上面的的

标签会告诉浏览器在这里需要创建一个新的段落,中间的文本就是段落要显示的内容。

2.css文件又称为层叠样式表,是由选择器和属性组成。通过css可以改变文字的大小,颜色等信息。图中的p标签,会把设定的属性值,全部应用到p标签上。

3.至于JavaScript,使用这个可以让页面的内容‘动’起来。也就是大部分的用户和浏览器的交互操作,都是通过JavaScript完成的。


搞清楚了HTML,CSS,JavaScript基本含义之后,我们就开始详细了解浏览器的渲染机制吧。

渲染模块在执行过程中会被划分为很多子阶段,输入的HTML经过这些子阶段,最后输出为了像素。我们把这样的一个处理流程就叫做渲染流水线,大致过程如下图所示。

img

按照渲染的时间顺序,流水线可以分为这几个子阶段:

  • 构建DOM树
  • 样式计算
  • 布局阶段
  • 分层
  • 绘制
  • 分块
  • 光栅化
  • 合成

每个阶段的过程中,我们应该重点关注:1,开始每个子阶段都有其输入的内容;2,然后每个子阶段有其处理过程;3,最终子阶段会生成其输出内容。也就是:输入-》加工-》输出

构建DOM树

为什么要构建DOM树呢?

我们浏览器是无法直接理解和使用HTML的(HTML标记语言是为了让开发人员进行编程的语言)所以浏览器需要将转化为浏览器可以理解的结构,那就是---DOM树。

了解过数据结构的开发人员应该都清楚什么是树结构。有一父节点可以有很多个子节点,但一个子节点不能被不同的父节点共享。在我们浏览器的渲染机制中,就频繁的使用到了树结构。

那么DOM树是如何进行构建并进行渲染的呢?

DOM树构建过程.png

在构建DOM树的时候,输入内容就是一个简单的HTML文件,然后由HTML解析器进行解析,最终输出一个树状结构的DOM。

为了能直观的了解什么是DOM结构,可以在控制台上输入document进行查看完整的一个DOM结构。DOM和HTML内容几乎一摸一样的,但是和HTML不同的是,DOM是保存在内存中的树状结构,可以通过JavaScript来查询或修改其内容。如何通过JavaScript来修改DOM的内容呢?控制台输入以下内容

document.getElementsByTagName('p')[0].innerText = 'black'

这个代码作用就是把第一个P标签的文本内容转换为black。当执行这行代码的时候,DOM的一个p节点的内容成功被修改,同时页面的内容也会被修改。

这就是生成DOM树的过程,此刻DOM节点的样式我们依然不知道,要让DOM拥有正确的样式,就需要进行下一个渲染子进程了。

样式计算(Recalculate Style)

样式计算的目的是为了计算DOM节点中每个元素的具体样式,这个子进程大概需要分为三步来完成。

1.把CSS转化为浏览器能够理解的结构

那么CSS样式的来源主要有哪些呢?

  • 通过link引用的外部CSS文件