网页生成的过程

2020-02-10  本文已影响0人  learninginto

网页生成的过程

一、浏览器渲染页面的流程

当浏览器获得一个html文件时,会 “自上而下” 加载,并在加载过程中进行解析渲染。

  1. 浏览器会将HTML解析成一个DOM树,DOM 树的构建过程是一个深度遍历过程:当前节点的所有子节点都构建好后才会去构建当前节点的下一个兄弟节点。
  2. 将CSS代码转化成CSSOM(CSS Object Model)
  3. 根据DOM树和CSSOM来构造 Rendering Tree。注意:Rendering Tree 渲染树并不等同于 DOM 树,因为一些像 Header 或 display:none 的标签就没必要放在渲染树中了。
  4. 生成布局(layout),即将所有渲染树的所有节点进行平面合成。
  5. 将布局绘制(paint) 在屏幕上。

上面的步骤当中,1-3步都非常快,真正耗时的是4-5步。

render.png

二、回流与重绘

上述这个过程是逐步完成的,为了更好的用户体验,渲染引擎将会尽可能早的将内容呈现到屏幕上,并不会等到所有的html都解析完成之后再去构建和布局render树。它是解析完一部分内容就显示一部分内容,同时,可能还在通过网络下载其余内容。

网页生成的时候,至少会渲染一次。用户访问的过程中,还会不断重新渲染。以下四种情况,会导致网页重新渲染。

  1. 页面初始化
  2. 修改DOM
  3. 修改样式表
  4. 用户事件(比如鼠标悬停、页面滚动、输入框键入文字、改变窗口大小等等)

重新渲染,就需要重新生成布局和重新绘制。前者叫做"回流/重排"(reflow),后者叫做"重绘"(repaint)。

浏览器要花时间去渲染,当它发现了某个部分发生了变化影响了布局,那就需要倒回去重新渲染。"回流/重排"必然导致"重绘"。

如果只是改变了某个元素的背景颜色,文字颜色等,不影响元素周围或内部布局的属性,将只会引起浏览器的repaint,重画某一部分。

"重绘"不一定需要"重排"。但是,"重排"必然导致"重绘"。Reflow要比Repaint更花费时间,也就更影响性能。所以在写代码的时候,要尽量避免过多的Reflow。

三、对于性能的影响

​ 提高网页性能,就是要降低"重排"和"重绘"的频率和成本,尽量少触发重新渲染。

四、HTML页面加载和解析流程举例

  1. 用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件;
  2. 浏览器开始载入html代码,发现<head>标签内有一个<link>标签引用外部CSS文件;
  3. 浏览器又发出CSS文件的请求,服务器返回这个CSS文件;
  4. 浏览器继续载入html中<body>部分的代码,并且CSS文件已经拿到手了,可以开始渲染页面了;
  5. 浏览器在代码中发现一个<img>标签引用了一张图片,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码;
  6. 服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器需要回过头来重新渲染这部分代码;
  7. 浏览器发现了一个包含一行Javascript代码的<script>标签,赶快运行它;
  8. Javascript脚本执行了这条语句,它命令浏览器隐藏掉代码中的某个<div> (style.display=”none”)。突然少了这么一个元素,浏览器不得不重新渲染这部分代码;
  9. 终于等到了</html>的到来,浏览器泪流满面……
  10. 等等,还没完,用户点了一下界面中的“换肤”按钮,Javascript让浏览器换了一下<link>标签的CSS路径;
  11. 浏览器召集了在座的各位<div><span><ul><li>们,“大伙儿收拾收拾行李,咱得重新来过……”,浏览器向服务器请求了新的CSS文件,重新渲染页面。

更多请见 :参考博客1 参考博客2

上一篇下一篇

猜你喜欢

热点阅读