点击上方 前端Q,关注公众号
回复加群,加入前端Q技术交流群
文章来源于稀土掘金技术社区——敲代码的彭于晏1. 配置浏览器网络速度首先配置浏览器网络速度,使现象更明显。
<!DOCTYPE html>
<html lang="en">
<head>
<title>css阻塞</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style>
h1 {
color: red !important;
}
</style>
<script>
function h() {
console.log(document.querySelectorAll("h1"));
}
setTimeout(h, 0);
</script>
<link
href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap.css"
rel="stylesheet"
/>
</head>
<body>
<h1>这是红色的</h1>
</body>
</html>
效果:在CSS加载时,JS就能获取到DOM节点,说明CSS加载不会堵塞DOM的解析
1696733748075.png使用Performance进行分析:可以看到在css加载完成后,DOM渲染才完成,说明CSS加载会堵塞DOM渲染(CSS加载完成前,页面白屏)
1696733775214.png从图中可知,Chrome浏览器渲染流程如下:
1.解析HTML,生成DOM树
2.解析CSS,生成CSS规则树
3.合并DOM树和CSS规则树,生成渲染树
4.布局
5.绘制
从流程可以看出来,DOM解析和CSS解析是两个并行的过程,因此CSS加载不会堵塞DOM的解析。但渲染树依赖CSS规则树,因此CSS加载会堵塞DOM的渲染。
<!DOCTYPE html>
<html lang="en">
<head>
<title>css阻塞</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script>
console.log("before css");
var startDate = new Date();
</script>
<link
href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap.css"
rel="stylesheet"
/>
</head>
<body>
<h1>这是红色的</h1>
<script>
var endDate = new Date();
console.log("after css");
console.log("经过了" + (endDate - startDate) + "ms");
</script>
</body>
</html>
运行结果:
1696733909782.png说明css会堵塞后面js执行
浏览器的渲染进程是多线程的,主要分为:GUI渲染线程、JS引擎线程、事件触发线程、定时器触发器线程、异步http请求线程
16f7ee2d5b4df806~tplv-t2oaga2asx-jj-mark_3024_0_0_0_q75.png由于JS可能会操作之前的DOM节点和CSS样式,为了防止渲染出现不可预期的结果,浏览器设置 GUI 渲染线程与 JavaScript 引擎为互斥的关系,因此css会堵塞后面js的执行
1. CSS加载不会堵塞DOM的解析,但会堵塞DOM的渲染
2. CSS加载会堵塞后面JS的执行
往期推荐
欢迎加我微信,拉你进技术群,长期交流学习...
欢迎关注「前端Q」,认真学前端,做个专业的技术人...