Safari 12 不支持 loading="lazy",会忽略该属性并按 eager 加载;验证方式是创建 img 元素设 loading="lazy" 后检查其 loading 值是否仍为 "lazy";不支持时需降级使用 Intersection Observer,注意兼容 rootMargin 正值及避免双加载。

不支持。 Safari 12 完全不识别 loading="lazy" 属性,解析时会直接忽略,图片仍按默认方式(loading="eager")加载。
如何验证当前 Safari 是否支持 loading="lazy"
最可靠的方式是运行一段极简检测逻辑,而不是查 UA 或硬编码版本号:
- 创建一个
img元素,设置loading="lazy"和一个无效的src(如data:image/gif;base64,R0lGODdh) - 插入 DOM 后立即检查该元素的
loading属性值是否仍为"lazy" - 若返回
undefined或空字符串,说明浏览器不支持该属性(Safari 12 就属于此列)
示例代码:
const img = document.createElement('img');
img.loading = 'lazy';
document.body.appendChild(img);
console.log(img.loading); // Safari 12 输出 '',Chrome/Firefox/Safari ≥15.4 输出 'lazy'
Safari 12 必须降级用 Intersection Observer
原生 loading="lazy" 在 Safari 12 上等于不存在,必须手动实现。但注意不是所有场景都适合上 IntersectionObserver:
- 仅对视口内/即将进入视口的图片触发加载,需绑定
src或srcset - 避免在页面滚动频繁时反复创建/销毁 observer 实例;建议复用单个实例监听所有懒加载图片
- Safari 12 支持
IntersectionObserver,但不支持rootMargin的负值(如"-100px"),需改用正值预留缓冲区 - 不要给
<img>同时写loading="lazy"和手动 observer —— Safari 12 会忽略前者,但其他浏览器可能双加载
服务端无需配合,但 HTML 结构要留余地
懒加载是纯客户端行为,PHP/Node/Nginx 等后端完全不用改。但前端模板要注意:
- 把真实图片地址放在
data-src或data-srcset中,而非直接写死src - 保留
width和height属性(或 CSS aspect-ratio),防止布局抖动 - 避免用
background-image做图片容器再懒加载——CSS 背景图无法被IntersectionObserver检测,也不支持loading属性
真正容易被忽略的是:Safari 12 用户占比虽低,但一旦遇到首屏大图 + 无占位尺寸 + 手动 observer 未 fallback 的组合,页面就会白屏几秒。别只测 Chrome,真机连 Safari 12 的 iOS 12 设备跑一跑,比查 Can I Use 更准。











