标签本身不自动检测网速,需结合js读取navigator.connection.effectivetype动态切换img的src或data属性实现低网速fallback,同时注意webp兼容性与服务端网络提示头协同优化。

picture 标签本身不自动检测网速,得靠 srcset + sizes + media 配合 JS 才能实现低网速 fallback
浏览器原生的 <picture></picture> 不会读取网络状况(比如 navigator.connection.effectiveType),它只按 media 查询条件或 srcset 的 DPR/宽度提示做静态选择。真要“低网速时自动切备用图”,必须手动介入。
常见错误是直接写:<source media="(max-width: 768px)" srcset="low.jpg"></source>——这只会响应屏幕尺寸,跟网速无关。
- 真正触发低网速逻辑,得先用 JS 检测
navigator.connection.effectiveType(值为"2g"、"3g"、"4g"或"slow-2g") - 再动态修改
<picture></picture>内部的<source></source>的srcset或切换<img>的src - 注意:IE 和部分旧版 Safari 不支持
navigator.connection,需降级兜底
推荐做法:用 JS 切换 <img> 的 src,而非重写整个 <picture></picture> 结构
直接操作 <img> 的 src 更轻量、兼容性更好,也避免重复解析 <source></source>。把高清图和低清图路径都提前存在 data 属性里:
<picture><source media="(min-width: 1024px)" srcset="hero-high.webp" type="image/webp"><source media="(min-width: 1024px)" srcset="hero-high.jpg" type="image/jpeg"> @@##@@ </source></source></picture>
然后在加载后检查网速:
- 若
navigator.connection?.effectiveType === "2g" || "3g" || "slow-2g",则把<img src="hero-low.jpg" data-low-src="hero-low.jpg" data-high-src="hero-high.jpg" alt="活动主图">的src设为data-low-src的值 - 否则保持原
src,或设为data-high-src - 务必加
loading="lazy"防止低网速下预加载高清图
别忽略 WebP 兼容性和 fallback 顺序
<source></source> 的顺序决定浏览器选用优先级:从上到下,第一个匹配且格式支持的生效。WebP 虽小但老版 iOS Safari(≤13.3)、IE 完全不支持,所以必须紧跟一个 JPEG/PNG fallback:
- 错误写法:
<source srcset="a.webp" type="image/webp"><source srcset="b.jpg"></source></source>→ 在不支持 WebP 的设备上,b.jpg可能因缺少media或type被跳过 - 正确写法:每个
<source></source>都带明确media和type,最后用<img>保底 - 测试时用 Chrome DevTools 的 Network Conditions 模拟
Slow 3G并禁用 WebP,确认最终加载的是 JPEG
更稳妥的方案:服务端根据 UA + 网络提示头(如 Sec-CH-NetHint)返回不同 HTML
客户端 JS 检测有延迟,首屏仍可能加载高清图。现代方案是让服务端识别请求头中的网络线索:
- Chrome/Edge 支持
Sec-CH-NetHint(值为"4g"、"3g"等),配合Accept: image/webp - 服务端(如 Nginx + Lua 或 Node.js)根据这些头,直接渲染不同的
<img src="fallback.jpg"> - 客户端 JS 仅作为二次修正(比如用户中途切到飞行模式),不承担首屏决策
- 注意:该 Header 目前仅 Chromium 基础浏览器支持,需保留 JS fallback
实际项目里,多数团队选「JS 检测 + data-src 切换」已够用;真要极致体验,得前后端协同,且接受一定兼容成本。别指望单靠 <picture></picture> 标签自己“聪明起来”。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











