可能大家都知道,js执行会阻塞DOM树的解析和渲染,那么css加载会阻塞DOM树的解析和渲染吗?接下来,我们就一起来分析一下 。
原理解析那么为什么会出现上面的现象呢?我们从浏览器的渲染过程来解析下 。
不同的浏览器使用的内核不同,所以他们的渲染过程也是不一样的 。目前主要有两个:
webkit渲染过程
文章插图
Gecko渲染过程
文章插图
从上面两个流程图我们可以看出来,浏览器渲染的流程如下:
- html解析文件,生成DOM Tree,解析CSS文件生成CSSOM Tree
- 将Dom Tree和CSSOM Tree结合,生成Render Tree(渲染树)
- 根据Render Tree渲染绘制,将像素渲染到屏幕上 。
- DOM解析和CSS解析是两个并行的进程,所以这也解释了为什么CSS加载不会阻塞DOM的解析 。
- 然而,由于Render Tree是依赖于DOM Tree和CSSOM Tree的,所以他必须等待到CSSOM Tree构建完成,也就是CSS资源加载完成(或者CSS资源加载失败)后,才能开始渲染 。因此,CSS加载是会阻塞Dom的渲染的 。
- 由于js可能会操作之前的Dom节点和css样式,因此浏览器会维持html中css和js的顺序 。因此,样式表会在后面的js执行前先加载执行完毕 。所以css会阻塞后面js的执行 。
而DOMContentLoaded,顾名思义,就是当页面的内容解析完成后,则触发该事件 。那么,正如我们上面讨论过的,css会阻塞Dom渲染和js执行,而js会阻塞Dom解析 。那么我们可以做出这样的假设
- 当页面只存在css,或者js都在css前面,那么DomContentLoaded不需要等到css加载完毕 。
- 当页面里同时存在css和js,并且js在css后面的时候,DomContentLoaded必须等到css和js都加载完毕才触发 。
<!DOCTYPE html><html lang="en"> <head> <title>css阻塞</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <script> document.addEventListener('DOMContentLoaded', function() { console.log('DOMContentLoaded'); }) </script> <link href=https://www.isolves.com/it/cxkf/yy/CSS2/2020-06-06/"https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap.css" rel="stylesheet">