核心是用navigator.connection.effectivetype预判网络能力,在请求前分级加载lqip+对应清晰度图片,结合onerror/超时兜底与轻量ping探测,形成感知—决策—呈现—容错闭环。

核心是用 navigator.connection.effectiveType 预判网络能力,在图片请求发出前就决定加载哪一档资源,再配合 LQIP 占位和加载兜底,形成“感知—决策—呈现—容错”闭环。不依赖 onload 后才降级,也不靠 navigator.onLine 做误判。
一、先确认 API 可用并读取当前网络类型
Network Information API 必须在 HTTPS 环境下使用,且部分浏览器(如 Safari)对 effectiveType 或 change 事件支持有限,需做降级处理:
- 检查是否存在:
if ('connection' in navigator && navigator.connection.effectiveType) - 获取当前粗略类型:
navigator.connection.effectiveType(值为'slow-2g'、'2g'、'3g'、'4g'或'unknown') - 监听变化(可选):
navigator.connection.addEventListener('change', updateImageStrategy),但注意首次加载时该事件尚未触发,需主动读取一次
二、按 effectiveType 分级生成 LQIP + 降级图地址
LQIP 不是静态占位图,而是原图的语义等价缩略版(1–5KB WebP,宽高内联),它要在原图加载完成前就渲染出来。关键在于:用 JS 动态控制 src,避免 HTML 中预设高清图造成浪费:
-
slow-2g / 2g:加载 LQIP(如 32×32 WebP,质量 20)+ 同步加载极低清图(320px 宽、WebP、q=40) -
3g:加载中等 LQIP(80×80 WebP)+ 中等图(750px、WebP、q=60) -
4g / unknown:加载高清 LQIP(160×160)+ 原图或 AVIF/1200px 图 - 所有 LQIP 地址应与原图语义一致,例如
photo.jpg→photo.lqip.webp,不可用统一灰色图
三、DOM 中实现平滑切换与加载保护
用 <img> 的原生能力完成过渡,不引入额外动画库:
- 内联
width和height属性,防止布局偏移(layout shift) - LQIP 加载后设
opacity: 1,原图加载完成时用 CSS transition 实现淡入(opacity: 0 → 1)+ 微缩放(transform: scale(0.98) → scale(1)) - 绑定
onerror:若降级图也失败,尝试再降一级(如加?q=30&w=240),最多重试 2 次,之后显示 fallback 占位 - 对 fetch 加载的图片 URL 使用
AbortController设置 3s 超时,超时即切更低清版本
四、补充弱网探测,弥补 effectiveType 的盲区
Network API 是启发式判断,实际链路可能更差(如高丢包、DNS 慢)。因此需叠加轻量探测:
- 在 DOM ready 后发起一次
fetch('/ping?_t=' + Date.now(), { cache: 'no-cache', signal }) - 超时设为 1500ms,响应时间 >800ms 且连续两次失败 → 触发全局降级策略(如强制所有图片走 2g 档)
- 探测结果仅用于调整后续图片策略,不中断当前加载流
- 禁用复杂动画提示,改用
aria-live="polite"插入“简化模式已启用”文本,保障可访问性
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










