CSS加载会造成堵塞吗?

点击上方 前端Q,关注公众号

回复加群,加入前端Q技术交流群

文章来源于稀土掘金技术社区——敲代码的彭于晏

1. 配置浏览器网络速度

首先配置浏览器网络速度,使现象更明显。

  1. 打开chrome控制台(按下F12),选择No Throttling,并在Custom中选择Add

eb024c528c45e1cdbc511c313bb187d2.jpeg
1696733672891.png
  1. 对浏览器上传与下载速度进行限制

c520e82e25161063efbbc845b76955d8.jpeg
1696733695177.png

2. CSS加载不会堵塞DOM的解析,但会堵塞DOM的渲染

<!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的解析

9f4e5183ed6cb28385f4ffe60ac648f3.jpeg
1696733748075.png

使用Performance进行分析:可以看到在css加载完成后,DOM渲染才完成,说明CSS加载会堵塞DOM渲染(CSS加载完成前,页面白屏)

2988caa1f8a41f6283ee119e4ea5fd46.jpeg
1696733775214.png
  1. Load:在所有依赖资源加载完触发

  2. LCP(largest contentful Paint):页面最大内容渲染时间

  3. FP(First Paint):第一个像素渲染到屏幕上的时间

  4. FCP(First Contentful Paint):渲染出第一个内容。内容可以是文本、图片

3. 原理分析

8e06ae4a86d269348e60c2d18c025e2c.jpeg
3534846-00ef9f3d405462ef.png

从图中可知,Chrome浏览器渲染流程如下:

1.解析HTML,生成DOM树

2.解析CSS,生成CSS规则树

3.合并DOM树和CSS规则树,生成渲染树

4.布局

5.绘制

从流程可以看出来,DOM解析和CSS解析是两个并行的过程,因此CSS加载不会堵塞DOM的解析。但渲染树依赖CSS规则树,因此CSS加载会堵塞DOM的渲染

4. 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>
      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>

运行结果:

a5f196befc6fdcd90610867fff17d0b4.jpeg
1696733909782.png

说明css会堵塞后面js执行

5. 原理分析

浏览器的渲染进程是多线程的,主要分为:GUI渲染线程、JS引擎线程、事件触发线程、定时器触发器线程、异步http请求线程

87f1c9a07656c83cf7f2250d35804a9b.jpeg
16f7ee2d5b4df806~tplv-t2oaga2asx-jj-mark_3024_0_0_0_q75.png

由于JS可能会操作之前的DOM节点和CSS样式,为了防止渲染出现不可预期的结果,浏览器设置 GUI 渲染线程与 JavaScript 引擎为互斥的关系,因此css会堵塞后面js的执行

6. 结论

1. CSS加载不会堵塞DOM的解析,但会堵塞DOM的渲染

2. CSS加载会堵塞后面JS的执行

870094fdd30950930645ea8e0c919d01.png

往期推荐

vue3自定义hooks大集合,你要的都在这!

56fc91e468a7ce66cdcc171df4bc447f.png

js如何控制一次只加载一张图片,加载完成后再加载下一张

96d25fbfa86b2c1a19cd84c98ab29dab.png

面试官:假如有几十个请求,如何去控制并发?

e053be62e23999c238c43362928b9baf.png


最后

  • 欢迎加我微信,拉你进技术群,长期交流学习...

  • 欢迎关注「前端Q」,认真学前端,做个专业的技术人...

367b88633cce0a2b9eeec813624b41c6.jpeg

2d21120dad84acebafa23a841110d4fb.png

点个在看支持我吧

cad4f8c5f37a2cf61599f6d8f86f0b33.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值