opera mini 完全不支持 srcset 和 picture,因其代理压缩机制导致客户端无 dom 和媒体查询能力,必须通过服务端 ua 识别+预生成静态图片 url 实现适配。

Opera Mini 不支持 srcset,不是“部分忽略”,而是整个属性被浏览器直接跳过——它根本不会解析 srcset 或 sizes,所有图片加载行为退化为仅读取 src 属性。
Opera Mini 的图片加载机制本质是代理压缩
Opera Mini 不在本地渲染页面,而是通过 Opera 服务器中转:HTML/CSS/JS 被压缩、重写甚至部分执行,再以简化格式(通常是 OBML)下发到客户端。这个过程天然不保留响应式图片的语义逻辑:
-
srcset和sizes是客户端运行时决策用的,而 Opera Mini 客户端不具备完整 DOM 和媒体查询计算能力 - 服务器端无法可靠推断用户视口宽度或设备像素比(尤其在代理链多层、UA 伪造普遍的情况下)
- 实测中,即使写全
srcset="a.jpg 400w, b.jpg 800w" sizes="100vw",Network 面板也只看到src对应的单张图被请求
替代方案只能绕开 srcset,改用服务端适配
想让 Opera Mini 用户也拿到合适尺寸的图,必须把适配逻辑前移到服务端,而不是依赖 HTML 属性:
- 用
User-Agent头识别Opera Mini(特征字符串含Opera Mini且无WebKit/Gecko) - 结合已知的 Opera Mini 典型屏幕宽度(如 240px、320px、480px)和固定 DPR(通常按 1x 处理),生成对应缩略图 URL
- 最终输出的
<img>标签里只保留静态src,例如<img src="/img/photo-320.jpg"> - CDN 如 Cloudflare 或 Cloudinary 可配置 UA 规则自动重写图片 URL,避免手写判断逻辑
不要依赖 picture + media 在 Opera Mini 生效
<picture></picture> 同样无效——<source media="(max-width: 768px)"></source> 中的媒体查询在 Opera Mini 中不执行,浏览器会直接 fallback 到内部 <img> 的 src。
更隐蔽的坑是:某些构建工具(如 Webpack 的 html-loader)或 CMS 模板引擎,会在生产环境自动补 srcset。如果没显式禁用,就可能在 Opera Mini 流量里埋下无效属性,徒增 HTML 体积。
真正要记住的只有一条:Opera Mini 的世界里没有客户端响应式图片。所有“适配”都得在服务端做完,然后喂给它一张确定尺寸的图——别留幻想,也别测兼容性,直接切逻辑分支。











