一文详解CSS 和 JS 如何阻塞浏览器渲染DOM

 更新时间:2025年12月22日 11:00:49   作者:全马必破三  
渲染和执行JS是互斥的,都在渲染主线程中进行,这篇文章主要介绍了CSS和JS如何阻塞浏览器渲染DOM的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

CSS 和 JS 如何阻塞浏览器渲染 DOM:CSS 阻塞渲染、JS 阻塞解析、阻塞原因、优化策略

CSS 和 JS 对浏览器渲染 DOM 的影响主要体现在阻塞渲染过程上。CSS 阻塞渲染、JS 阻塞解析、阻塞原因、优化策略

CSS 会阻塞浏览器的渲染,因为浏览器需要先获取所有 CSS 文件才能正确渲染页面。

而 JS 则会阻塞 DOM 的解析,因为浏览器必须先执行 JS 代码,以防止脚本对 DOM 结构进行修改。

下面详细分析其中一个阻塞原因:在 CSS 加载过程中,浏览器无法继续渲染 DOM,因为它需要知道所有元素的样式属性。这样可以确保在页面渲染时,所有元素都能正确显示。

一、CSS 阻塞渲染

1、CSS 加载与渲染

CSS 文件的加载和渲染是一个关键的过程,当浏览器遇到 <link> 标签时,会暂停 DOM 渲染,开始下载和解析 CSS 文件。

浏览器需要完整的 CSS 文件来计算各个元素的样式,这意味着在 CSS 文件下载和解析完成之前,浏览器不会开始绘制页面。

这是因为样式信息直接影响页面布局和元素的显示,如果样式文件未加载完成,页面渲染可能出现错误或闪烁。

2、CSS 文件的下载顺序

浏览器在下载 CSS 文件时会根据其在 HTML 文档中的顺序进行下载。

如果 CSS 文件较大或网络速度较慢,下载时间会显著延长,进一步阻塞渲染过程。

为了优化这一过程,建议将 CSS 文件放置在 <head> 标签中,并尽量减少 CSS 文件的大小和数量。

另外,可以采用 CSS 代码压缩和合并技术来提高加载速度。

二、JS 阻塞解析

1、JS 执行与 DOM 解析

当浏览器遇到 <script> 标签时,会暂停 DOM 解析,先下载并执行 JS 脚本。

JavaScript 可能会修改 DOM 结构,因此浏览器必须在执行 JS 代码之前暂停解析。

这种行为会导致页面加载时间增加,因为浏览器需要等待脚本的下载和执行完成后才能继续解析和渲染 DOM。

2、异步与延迟加载

为了解决 JS 阻塞解析的问题,可以使用异步加载(async)和延迟加载(defer)属性。

async 属性允许浏览器在后台下载 JS 文件,并在下载完成后立即执行,但仍会阻塞解析。

defer 属性则允许浏览器在下载文件的同时继续解析 DOM,并在解析完成后才执行 JS 脚本。这样可以显著提高页面加载速度和用户体验。

三、阻塞原因

1、资源依赖性

页面渲染依赖于 CSS 和 JS 资源的完整性,因此在这些资源未完全加载和解析前,浏览器无法进行有效渲染。

CSS 影响元素的布局和样式,JS 可能会动态改变 DOM 结构,任何不完整的资源都会导致渲染错误或页面崩溃。

2、网络延迟与资源大小

网络延迟和资源文件的大小直接影响加载时间。

如果网络速度较慢或资源文件过大,浏览器需要更长时间来下载这些文件,导致渲染过程被阻塞。因此,优化网络请求和减小资源文件大小是提高页面加载速度的重要手段。

四、优化策略

1、CSS 优化

为了减少 CSS 对渲染的阻塞,可以采取以下优化策略:

  • 压缩与合并:将多个 CSS 文件合并为一个文件,并进行代码压缩,减少文件大小和请求数量。
  • 异步加载:使用媒体查询(media 属性)来异步加载非关键 CSS 文件,仅在特定条件下加载。
  • 内联关键 CSS:将关键的 CSS 内联到 HTML 文档中,减少外部请求,提高加载速度。

2、JS 优化

优化 JS 以减少其对解析的阻塞,可以采取以下策略:

  • 异步与延迟加载:使用 async 和 defer 属性来异步或延迟加载 JS 文件,避免阻塞 DOM 解析。
  • 代码分割:将大型 JS 文件分割为多个小文件,仅在需要时加载,减少初始加载时间。
  • 减少依赖:尽量减少对外部库的依赖,使用原生 JS 或轻量级库,降低文件大小。

3、资源缓存与 CDN

利用浏览器缓存和内容分发网络(CDN)可以显著提高资源加载速度:

  • 浏览器缓存:设置适当的缓存策略,使静态资源在浏览器中缓存,减少重复请求。
  • 内容分发网络(CDN):使用 CDN 来分发静态资源,将资源存储在离用户更近的服务器上,减少延迟。

4、减少 HTTP 请求

减少 HTTP 请求数量是优化页面加载速度的重要手段:

  • 合并文件:将多个 CSS 和 JS 文件合并为一个文件,减少请求数量。
  • 使用图像精灵:将多个小图标合并为一张图像,通过 CSS 定位显示不同部分,减少图像请求。

五、实践应用

1、案例分析

通过分析一些实际案例,我们可以更好地理解 CSS 和 JS 阻塞渲染的影响。

例如,某电商网站在优化前,页面加载时间较长,用户体验较差。通过合并和压缩 CSS 文件、使用 asyncdefer 属性加载 JS 脚本以及利用 CDN 分发资源,该网站的页面加载速度显著提高,用户留存率和转化率也随之增加。

2、性能测试工具

使用性能测试工具可以有效监控和分析页面加载情况,

如 Google 的 Lighthouse、WebPageTest 和 GTmetrix 等。

这些工具可以提供详细的性能报告,帮助开发者识别和解决阻塞渲染的问题。

相关问答FAQs:

1. CSS和JS是如何阻塞浏览器渲染DOM?

当浏览器解析HTML文档时,遇到外部CSS和JavaScript文件时,会立即停止渲染DOM,以便先加载和执行这些文件。这可能会导致页面出现白屏或闪烁的情况。

2. CSS和JS的阻塞对网页性能有什么影响?

CSS和JS的阻塞会延迟页面的呈现,因为浏览器需要等待这些外部文件加载和执行完成后才能继续渲染DOM。这可能导致页面加载速度变慢,用户体验下降。

3. 如何避免CSS和JS阻塞浏览器渲染DOM?

为了避免CSS和JS阻塞浏览器渲染DOM,可以采取以下措施:

  • 将CSS文件放在HTML文档头部,JavaScript文件放在HTML文档尾部。这样可以确保CSS文件在加载和执行时不会阻塞DOM渲染,而JavaScript文件在页面渲染完成后再加载和执行。
  • 使用异步加载或延迟加载外部JavaScript文件。通过在<script>标签中添加asyncdefer属性,可以使浏览器在加载这些文件时不阻塞DOM渲染。
  • 使用内联CSS和JavaScript。将CSS和JavaScript代码直接嵌入到HTML文档中,可以避免外部文件的加载和执行,加快页面渲染速度。
  • 使用浏览器缓存。当浏览器第一次加载CSS和JavaScript文件后,可以将它们缓存在本地,以便后续访问时不需要再次下载和执行,从而提高页面加载速度。

总结 

到此这篇关于CSS和JS如何阻塞浏览器渲染DOM的文章就介绍到这了,更多相关CSS和JS阻塞浏览器渲染DOM内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript 常用函数

    JavaScript 常用函数

    javascript提供了许多函数供开发人员使用,下面给出一个简单介绍,更详细的信息请参考Visual InterDev提供的在线帮助。
    2009-12-12
  • JS实现隐藏同级元素后只显示JS文件内容的方法

    JS实现隐藏同级元素后只显示JS文件内容的方法

    这篇文章主要介绍了JS实现隐藏同级元素后只显示JS文件内容的方法,可实现将与js文件的同级元素全部隐藏,只显示js文件内容的功能,涉及javascript针对页面元素的遍历与属性修改相关技巧,需要的朋友可以参考下
    2016-09-09
  • 在Node.js中使用Javascript Generators详解

    在Node.js中使用Javascript Generators详解

    下面小编就为大家带来一篇在Node.js中使用Javascript Generators详解。小编觉得挺不错的,现在分享给大家,也给大家做个参考
    2016-05-05
  • JS实现太极旋转思路分析

    JS实现太极旋转思路分析

    本文主要对JS实现太极旋转的思路进行分析,步骤清晰,简短的文字,深入的理解。需要的朋友可以看下
    2016-12-12
  • 小程序测试后台服务的方法(ngrok)

    小程序测试后台服务的方法(ngrok)

    这篇文章主要介绍了小程序测试后台服务的方法(ngrok),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • 教学演示-UBB,剪贴板,textRange及其他

    教学演示-UBB,剪贴板,textRange及其他

    教学演示-UBB,剪贴板,textRange及其他...
    2006-07-07
  • JavaScript高级教程5.6之基本包装类型(详细)

    JavaScript高级教程5.6之基本包装类型(详细)

    在基本类型当中,有三种类型是我们经常使用的:boolean,number,string,通过本篇文章给大家介绍javascript高级教程5.6之基本包装类型,感兴趣的朋友一起学习吧
    2015-11-11
  • js处理跨域的方案之jsonp用法详解

    js处理跨域的方案之jsonp用法详解

    这篇文章主要介绍了js处理跨域的方案之jsonp用法的相关资料,文中分享了前端调用后端接口的三种方式:Ajax、fetch、axios,并详细解释了同源策略和跨域的概念,需要的朋友可以参考下
    2024-11-11
  • UniApp表单校验两种方式对比详解

    UniApp表单校验两种方式对比详解

    本文对比了UniApp中表单校验的命令式和声明式两种方式,通过实战示例展示了它们的优缺点,并有详细的代码示例供大家参考,需要的朋友可以参考下
    2025-03-03
  • 用javascript关闭本窗口不弹出询问框的方法

    用javascript关闭本窗口不弹出询问框的方法

    ie中用close关闭非open打开的窗口时回弹出一个对话框询问用户,怎么去掉这个框呢,在window.close之前加上window.top.opener = null就可以了
    2014-09-09

最新评论