图片降级需javascript主动干预,onerror适合单图轻量降级,picture+source实现格式级选择,js批量加载支持超时与多级fallback,css背景图需预判处理,构建时插件更可靠。

图片降级不是靠 HTML 自己完成的,<img> 标签没有内置“自动 fallback”机制;必须用 JavaScript 主动干预加载失败流程,再结合 src、srcset、onerror 或 loading 等特性协同控制。
用 onerror 最快实现单图降级
这是最轻量、兼容性最好(IE8+)的方式,适合静态图片或简单场景。原理是当原图 src 加载失败时触发 onerror 事件,把 src 换成备用地址。
- 必须在
<img>上直接写onerror,内联写法才能保证首次失败时被调用(绑定事件监听器可能来不及) - 记得在
onerror中先清除原onerror处理函数,否则降级图再失败会无限循环 - 备用图路径建议用相对路径或 CDN 稳定地址,避免二次失败
示例:
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
@@##@@
用 picture + source 做格式级降级(WebP → JPEG)
这不是“错误后 fallback”,而是浏览器主动按支持能力选择资源,更可靠,但不解决网络中断或 404 问题。
-
<source></source>的type属性必须精确匹配 MIME 类型,比如image/webp,拼错就跳过该源 - 务必保留底部的
<img src="/original.jpg" onerror="this.onerror=null; this.src='/fallback.webp';">标签作为兜底——它不是可选的,而是<picture></picture>的必需子元素 - 所有
srcset地址需真实存在,否则即使格式支持,也会因 404 触发onerror(可叠加使用)
示例:
<picture><source type="image/webp" srcset="/photo.webp 1x, /photo@2x.webp 2x"><source type="image/avif" srcset="/photo.avif 1x, /photo@2x.avif 2x"> @@##@@ </source></source></picture>
用 JS 批量接管图片加载,支持超时 + 多级 fallback
当需要统一策略(如加监控、埋点、重试、CDN 切换)、或处理懒加载图片时,就得用脚本主动管理。
- 不要依赖
load或error事件监听——它们不保证按顺序触发,尤其对已缓存图片;改用decode()方法显式等待解码完成 - 设置超时比等
error更可控:网络卡住时,error可能几秒甚至不触发,Promise.race()配合setTimeout更稳 - 多级 fallback 建议最多 2~3 层(如 WebP → JPEG → SVG 占位图),再多会影响首屏速度且维护成本陡增
简版逻辑示意:
function loadWithFallback(img, urls, timeout = 5000) {
return Promise.race([
new Promise((resolve, reject) => {
img.onload = () => resolve(img);
img.onerror = () => reject();
img.src = urls[0];
}),
new Promise((_, reject) => setTimeout(reject, timeout))
]).catch(() => {
if (urls.length > 1) return loadWithFallback(img, urls.slice(1), timeout);
throw new Error('All image sources failed');
});
}
容易被忽略的细节:CSS 背景图没法用 onerror
background-image 是 CSS 控制的,DOM 无加载事件接口。想做降级,只能提前预判——比如用 @supports (background: image-set(...)) 或 JS 检测 createImageBitmap 支持度,再动态切类名。
- 别试图用
img元素加载完再设背景——会闪动,且破坏 SSR 友好性 - 服务端生成图片时,可统一加一层透明 PNG 占位(1×1),确保背景图容器始终有内容,避免布局抖动
- 真正要强保障,得靠构建时插件(如 Webpack 的
image-minimizer-webpack-plugin)生成多格式并注入 HTML,而非运行时补救
降级不是加个属性就完事,关键在失败路径是否被真实覆盖、是否引入新延迟、以及兜底图本身是否可靠——很多项目只写了 fallback 地址,却忘了那个地址也可能 404 或跨域失败。

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










