web前端入门到实战:异步加载CSS最简单的实现方式

我们想提高网页性能的最有影响力的措施之一,就是以不延迟网页渲染的方式加载CSS

在默认情况下,浏览器在加载CSS时将终止页面的样式呈现(同步加载),也就是加载CSS会阻塞DOM树的渲染(但并不会阻塞DOM树的构建),可以简单理解为:当在加载CSS的同时,也在构建DOM树,只是没有应用上样式。

渲染流程

简单过一遍浏览器渲染的流程:

  1. 加载HTML资源
  2. 解析HTML
  3. 加载CSS资源,同时构建DOM树
  4. 解析CSS,同时渲染DOM树

CSS文件过大,就会停留在第3步,所以网速慢时,打开网站的时候经常遇到没有样式的情况。

所以我们需要先加载部分CSS首屏需要用到的CSS),其他优先级比较低的CSS就以异步的方式加载。与script元素不同,没有asyncdefer属性可以简单地应用于link元素,但是可以模拟。

异步加载

1. 利用媒体查询

设置一个当前浏览器不支持的值:

<link rel="stylesheet" href="./index.css" media="none" >

这样浏览器将会异步加载这个CSS文件(优先度比较低),在加载完毕之后,使用onload属性将link的媒体类型设置为all,然后便开始渲染。

如果有如下代码:

<link rel="stylesheet" href="./index2.css" media="none" >
<link rel="stylesheet" href="./index1.css">
web前端开发学习Q-q-u-n:784783012 ,分享学习的方法和需要注意的小细节,不停更新最新的教程和学习方法(详细的前端项目实战教学视频)

浏览器加载优先级如下:

又或者有如下代码:

<link rel="stylesheet" href="./index1.css" media="screen and (max-width: 800px)">
<link rel="stylesheet" href="./index2.css" media="screen and (min-width: 800px)">

刷新页面时,如果视窗宽度小于800px,那么优先加载index1.css,如果大于800px,则相反:

总结:媒体查询不匹配的样式优先级低?。

2. 提前加载资源

这个跟上述类似,但是优先级是最高的,不过还是异步加载,不会阻塞DOM的渲染,只是浏览器支持度比较低?。

<link rel="preload" href="./index.css" as="style">

告诉浏览器"请提前加载好此资源,我后面会用到!"。当用到的时候,浏览器便从缓存中拿取?。

所以正确操作跟媒体查询一样:

<link rel="preload" href="./index.css" as="style" >

当然,该属性还可以应用于其他资源,当你需要用到这些资源的时候,浏览器会直接从缓存中拿,不再次发送请求了。

<link rel="preload" href="./index.js" as="script">
<link rel="preload" href="./index.png" as="image">
<link rel="preload" href="./index.mp4" as="video" type="video/mp4">

3. 捞仔写法

let link = document.createElement("link");
link.rel = "stylesheet";
link.href = "./index1.css";

document.head.appendChild(link);
web前端开发学习Q-q-u-n:784783012 ,分享学习的方法和需要注意的小细节,不停更新最新的教程和学习方法(详细的前端项目实战教学视频)

总结

重要样式使用同步加载(常规写法),优先级低的则使用异步加载,异步加载不会阻塞页面的渲染。

越来越多的人发现,可能只需要简单的HTML方法,而简单往往是最好的。

<link rel="stylesheet" href="./main.css">
<link rel="stylesheet" href="./other.css" media="none" >

原文地址:https://blog.51cto.com/14592820/2447569

时间: 2024-07-31 04:58:02

web前端入门到实战:异步加载CSS最简单的实现方式的相关文章

web前端入门到实战:彻底掌握css动画【transition】

马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所以就导致了许多程序员比较排斥来学习css动画(至少我是),但是一个不懂css动画的前端工程师不能称之为掌握css3,其实当你真正学习css动画之后,你会被它的魅力所吸引的,它可以减少代码量.提高性能. 话不多说,马上和我一起去学习今天的主角transition吧! transition 语法 值 描述 tra

web前端入门到实战:彻底掌握css动画【animation】

马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所以就导致了许多程序员比较排斥来学习css动画(至少我是),但是一个不懂css动画的前端工程师不能称之为掌握css3,其实当你真正学习css动画之后,你会被它的魅力所吸引的,它可以减少代码量.提高性能. 上一篇文章我们已经一起学习了transition 的使用,如果有不了解的同学可以查看我的上一篇文章. 话不多

web前端入门到实战:HTML、CSS、JavaScript分别实现什么功能?

学习Web前端开发基础技术需要掌握:HTML.CSS.JavaScript,那么这三个都是分别实现什么功能的呢?下面和小编一起来看看吧! 一.HTML是网页内容的载体 内容就是网页制作者放在页面上想要让用户浏览的信息,可以包含文字.图片.视频等. 二.CSS样式是表现 就像网页的外衣,比如:标题字体.颜色变化.为标题加入背景图片.边框等. 所有这些用来改变内容外观的东西称之为表现. 三.JavaScript是用来实现网页上的特效效果 比如:鼠标滑过弹出下拉菜单.鼠标滑过表格的背景颜色改变.焦点新

好程序员web前端教程分享异步加载CSS的一些方法

好程序员web前端教程分享异步加载CSS的一些方法,在我们写页面的时候,我们做最主要的任务就是提高页面的性能和弹性加载速度,以不会延迟页面的呈现的形式来加载CSS.这是因为在默认情况下, - 浏览器会同步加载外部的CSS - 在下载和解析CSS时会影响所有页面呈现 这两种情况都会导致潜在的延迟. 当然,这也是在开始渲染页面之前,应该至少加载网站的CSS的一部分,并且为了立即将该初始CSS添加到浏览器,我们建议内联css.对于整体数量较少的网站,仅此一项就足够了,但如果CSS很大(例如,大于15到

web前端入门到实战:css选择器和css文本样式相关

[文章来源微信公众号:每天学编程]---关注,后台领取编程资源 css基础-css选择器和css文本样式相关: 使用link链入外部样式,页面加载时会同时加载样式 @import url("*.css");使用导入式,页面加载完后,才会加载样式 链接伪类的顺序 :link-> :visited ->:hover-> :active 或者 : visited -> : link ->:hover-> :active 选择器的优先级: id选择器>

异步加载css 和 谷歌浏览器各实用小工具介绍

异步加载css资源 加开页面首屏显示速度使我们前端一直在追求的目标,而css资源在这些优化中同样也是不可或缺的. 一个网站可能有一部分css资源是必须的,他需要在页面渲染完之前就被加载完,并和html一起解析,这个暂时无法做手脚,但是我们可以把一些非关键的css进行异步化,也就是异步加载. 市面上有很多工具可以达到这个效果,比如loadCSS 这次要说的这个异步加载方式,其实也是loadCSS中所用到的,代码如下: <link rel="stylesheet" href=&quo

web前端入门到实战:@import和link引入样式的区别

关于@import和link引入样式的区别网上有很多种说法.大致有如下几种,不过这其中会有我存疑的地方,我们可以一起来探讨一下. 区别 1.从属关系区别 @import是 CSS 提供的语法规则,只有导入样式表的作用:link是HTML提供的标签,不仅可以加载 CSS 文件,还可以定义 RSS.rel 连接属性等. 2.加载顺序区别 加载页面时,link标签引入的 CSS 被同时加载: @import 引入的 CSS 将在页面加载完毕后被加载. 3.兼容性区别 @import是 CSS2.1 才

web前端入门到实战:纯CSS实现加载转圈样式

不同的项目中对于等待加载时转圈圈的样式是不同的,有的是传统的转圈的gif图片,见得比较多的是将转圈圈的换成了可爱的图标.有时候项目中加入等待加载的图片会很违和,不符合美观,所以需要用CSS做一个.下面是一个纯CSS实现转圈样式的例子. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport&q

web前端入门到实战:详解css3如何给背景图片加颜色遮罩

前段时间在开发中,遇到需要给背景层加颜色遮罩的项目,现在特定总结一下给背景图层加颜色遮罩的方法. 方法一:通过定位叠加(注意层级) <div class="wrap1"> <div class="inner"> </div> </div> .wrap1 { position: relative; width: 1200px; height: 400px; background: rgba(0, 0, 0, .5); }