外置的媒体查询,对性能又一次的优化提升

简介: 通常情况下我们写媒体查询都是写在一个样式文件中,对于浏览器加载的时候,会解析到最后一行样式时才会渲染页面,这样就会造成页面的白屏时间过长。

通常情况下我们写媒体查询都是写在一个样式文件中,对于浏览器加载的时候,会解析到最后一行样式时才会渲染页面,这样就会造成页面的白屏时间过长。

但是通常情况下大量的媒体查询样式都是无用的,现在浏览器允许我们在引用样式文件的时候就可以指定媒体查询,这样没有匹配到的样式加载的优先级会被降低,从而提升页面的渲染速度。

案例

假设我们有一个页面,需要在不同的设备上显示不同的样式,我们可能会这样写:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="css/desktop.css">
    <link rel="stylesheet" href="css/mobile.css">
</head>
<body></body>
</html>
  • desktop.css
html, body {
   
   
    margin: 0;
    padding: 0;
}

body {
   
   
    background: pink;
}
  • mobile.css
@media (max-width: 600px) {
   
   
    body {
   
   
        background: lightblue;
    }
}

这样有什么问题呢?我们先来分析一下在这整个期间发生了什么:

首先是网络,可以看到优先级都是最高的,优先级最高代表着会被优先加载,css加载又会阻塞渲染,所以如果css文件过大,会造成页面的白屏时间过长。

image.png

再看性能分析,在网络一栏并行发送了两个请求,可以看到mobile.css是后加载出来的,但是渲染是在mobile.css加载完成之后才开始的,但是桌面模式下不需要mobile.css,这样就造成白屏时间延长。

image.png

解决方案

这个时候我们就可以使用外置的媒体查询,来解决这个问题,我们只需要在link标签上添加media属性,就可以实现这个效果。

<link rel="stylesheet" href="css/desktop.css" media="screen and (min-width: 600px)">
<link rel="stylesheet" href="css/mobile.css" media="screen and (max-width: 600px)">

在我们加上这个属性之后,我们再来看一下网络和性能分析:

网络方面可以看到,当我的设备分辨率小于600px的时候,desktop.css虽然放在最前面,但是优先级却是最低的,而mobile.css则是最先加载的。

image.png

性能方面可以看到,desktop.css一加载完毕就开始渲染页面,而mobile.css则是继续加载,仿佛不关心页面的渲染,这样页面的白屏时间就有效的缩短了。

image.png

这次我调整了分辨率,因为desktop.css加载比较快,可以看我画红色竖线的地方,desktop.css加载完毕之后,页面就开始渲染了;

同时使用这种方式加载,可以省掉css文件中的媒体查询,这样可以减少css文件的大小,提高加载速度。

其他用法

这种方式可以支持几乎所有的媒体查询,比如:

<link rel="stylesheet" href="css/print.css" media="print">
<link rel="stylesheet" href="css/landscape.css" media="screen and (orientation: landscape)">
<link rel="stylesheet" href="css/retina.css" media="screen and (-webkit-min-device-pixel-ratio: 2)">

这些都可以通过media属性来实现,但是需要注意的是,目前并不是所有的浏览器都支持这种方式,而且部分浏览器表现形式也不相同。

由于个人设备有限,我这里只是在chrome上写的示例,根据资料显示,firefoxsafari都支持这种方式,但是safari并没有做任何优化。

目录
相关文章
|
机器学习/深度学习 编解码 自然语言处理
深度学习进阶篇[9]:对抗生成网络GANs综述、代表变体模型、训练策略、GAN在计算机视觉应用和常见数据集介绍,以及前沿问题解决
深度学习进阶篇[9]:对抗生成网络GANs综述、代表变体模型、训练策略、GAN在计算机视觉应用和常见数据集介绍,以及前沿问题解决
深度学习进阶篇[9]:对抗生成网络GANs综述、代表变体模型、训练策略、GAN在计算机视觉应用和常见数据集介绍,以及前沿问题解决
|
弹性计算 运维 Linux
ECS多场景迁移上云最佳实践
阿里云弹性计算团队十三位产品专家和技术专家共同分享云上运维深度实践,详细阐述如何利用CloudOps工具实现运维提效、弹性降本。
731 0
|
移动开发 JavaScript 小程序
uniapp为什么能支持多端开发?uniapp底层是怎么做的?
uniapp为什么能支持多端开发?uniapp底层是怎么做的?
518 0
|
JavaScript 编译器 索引
如何在 TypeScript 中为对象动态添加属性?
如何在 TypeScript 中为对象动态添加属性?
1291 0
|
Web App开发 前端开发 JavaScript
跨浏览器兼容性指南:解决常见的前端兼容性问题
跨浏览器兼容性是前端开发中至关重要的概念。由于不同浏览器(如Chrome、Firefox、Safari等)在实现Web标准方面存在差异,网页在不同浏览器上可能会呈现不一致的结果。因此,确保网页在各种浏览器上都能正确显示和运行,是提供良好用户体验、扩大受众范围以及增强网站可访问性的关键。
|
存储 Kubernetes 监控
阿里云容器网络文件系统 CNFS 1.0 发布,体验云原生时代的容器共享存储
CNFS 通过将阿里云的文件存储抽象为一个 Kubernetes 对象(CRD)进行独立管理,包括创建、删除、描述、挂载,监控及扩容等运维操作,使用户可以在享受容器使用文件存储带来的便捷的同时,提高文件存储的性能和数据安全,并提供容器一致的声明式管理。
阿里云容器网络文件系统 CNFS 1.0 发布,体验云原生时代的容器共享存储
|
Android开发 异构计算
【Android 性能优化】布局渲染优化 ( CPU 渲染优化 | 减少布局的嵌套 | 测量布局绘制时间 | OnFrameMetricsAvailableListener | 布局渲染优化总结 )
【Android 性能优化】布局渲染优化 ( CPU 渲染优化 | 减少布局的嵌套 | 测量布局绘制时间 | OnFrameMetricsAvailableListener | 布局渲染优化总结 )
550 0
|
5天前
|
弹性计算 人工智能 安全
云上十五年——「弹性计算十五周年」系列客户故事(第二期)
阿里云弹性计算十五年深耕,以第九代ECS g9i实例引领算力革新。携手海尔三翼鸟、小鹏汽车、微帧科技等企业,实现性能跃升与成本优化,赋能AI、物联网、智能驾驶等前沿场景,共绘云端增长新图景。