你知道src和srcset的加载顺序吗?

你知道src和srcset的加载顺序吗?

根据 HTML 规范与浏览器加载机制,<img> 标签的 src 属性和 srcset 属性的加载顺序遵循以下逻辑:


1. 默认行为:src 图片优先加载

  • src 作为兜底资源 :浏览器在解析 HTML 时,会优先加载 src 属性指定的图片 ,作为默认显示的图像。即使 srcset 存在,浏览器也会先下载 src 的图片以确保兼容性(尤其在不支持 srcset 的旧浏览器中)。
  • srcset 的延迟加载 :浏览器在完成 src 图片加载后,会根据设备的视口宽度、像素密度(DPR)和 sizes 属性的规则,从 srcset 候选集中选择更合适的图片异步加载。这一过程通常在浏览器空闲时或视口变化时触发。

2. 高分辨率图片的替换逻辑

  • 智能升级机制 :如果 srcset 中存在更高分辨率或更适配当前设备的图片,浏览器会在后台加载这些候选图,并在加载完成后替换默认的 src 图片 。例如,在高 DPR 的 Retina 屏幕上,浏览器可能加载 2x3x 的高清图替换 1x 的低清图。
  • 视觉过渡效果 :若使用渐进式图片格式(如 Progressive JPEG),用户会先看到模糊的低清图,随着高清图加载完成逐渐清晰。

3. 加载顺序的优化策略

以下方法可控制加载顺序,实现"先低后高"的体验优化:

  1. 首屏关键图片优先加载

    • 对首屏图片直接使用 src 指定低分辨率图,srcset 提供高清候选,并添加 sizes 属性辅助浏览器决策。

    • 示例

      html 复制代码
      <img src="low-res.jpg"
           srcset="high-res.jpg 1024w"
           sizes="(max-width: 600px) 100vw, 50vw"
           alt="示例图片">
  2. 非首屏图片延迟加载

    • 对非关键图片添加 loading="lazy" 属性,浏览器会在用户滚动到附近时再加载高清图:

      html 复制代码
      <img src="low-res.jpg"
           srcset="high-res.jpg 1024w"
           loading="lazy"
           alt="示例图片">
    • 此方法减少初始请求压力,同时保证低分辨率图快速展示。

  3. 动态加载控制(JavaScript)

    • 使用 Intersection Observer API 监听图片是否进入视口,动态触发高清图加载:

      javascript 复制代码
      const images = document.querySelectorAll('img[data-srcset]');
      const observer = new IntersectionObserver((entries) => {
        entries.forEach(entry => {
          if (entry.isIntersecting) {
            const img = entry.target;
            img.srcset = img.dataset.srcset;
            observer.unobserve(img);
          }
        });
      });
      images.forEach(img => observer.observe(img));
    • 此方案可手动控制高清图的加载时机。


4. 、注意事项

  • 兼容性 :旧浏览器(如 IE11)不支持 srcset,需始终保留 src 作为兜底。
  • 性能优化
    • 低清图应压缩至最小体积(如 20-50KB),高清图优先使用 WebP/AVIF 格式。
    • 使用 CDN 动态适配图片尺寸(如 Cloudinary),避免手动处理多版本图片。

总结

浏览器默认会先加载 src 图片 ,随后根据设备特性从 srcset 中选择并加载更合适的图片进行替换。通过合理利用 sizes、懒加载和渐进式格式,可优化加载顺序,实现低清图快速展示、高清图后续加载的流畅体验。

相关推荐
浪浪山_大橙子2 分钟前
Trae SOLO 生成 TensorFlow.js 手势抓取物品太牛了 程序员可以退下了
前端·javascript
出征8 分钟前
Pnpm的进化进程
前端
屿小夏21 分钟前
openGauss020-openGauss 向量数据库深度解析:从存储到AI的全栈优化
前端
Y***985133 分钟前
【学术会议论文投稿】Spring Boot实战:零基础打造你的Web应用新纪元
前端·spring boot·后端
拾忆,想起40 分钟前
Dubbo分组(Group)使用指南:实现服务接口的多版本管理与环境隔离
分布式·微服务·性能优化·架构·dubbo
q***33371 小时前
SpringMVC新版本踩坑[已解决]
android·前端·后端
青云交1 小时前
Java 大视界 -- 基于 Java 的大数据分布式存储在数字媒体内容存储与版权保护中的应用
java·性能优化·区块链·分布式存储·版权保护·数字媒体·ai 识别
亿元程序员1 小时前
做了十年游戏,我才意识到:程序员最该投资的,是一台专业的编程显示器
前端
IT_陈寒2 小时前
Python高手都在用的5个隐藏技巧,让你的代码效率提升50%
前端·人工智能·后端
Dovis(誓平步青云)2 小时前
《内核视角下的 Linux 锁与普通生产消费模型:同步原语设计与性能优化思路》
linux·运维·性能优化