img的loading="lazy"足够且推荐,video的该属性仅chrome 120+支持且只作用于poster图,不控制视频主体加载,真正懒加载video需用intersectionobserver手动控制src赋值时机。

img 和 video 的 loading="lazy" 属性是否足够?
对大多数静态图片和内联视频,loading="lazy" 是最轻量、浏览器原生支持的延迟加载方案。但它只对 <img> 和 <iframe></iframe> 全面生效;<video></video> 在 Chrome 120+ 才开始支持该属性,且仅作用于 poster 图片,不控制视频资源本身是否懒加载。
常见错误是给 <video></video> 写上 loading="lazy" 就以为视频文件不会提前下载——实际它仍可能触发 preload(尤其当 preload="auto" 或未显式设为 none 时)。
-
<img src="photo.jpg" loading="lazy">✅ 安全可用,兼容性好(Chrome 76+、Firefox 75+、Safari 15.4+) -
<video poster="thumb.jpg" loading="lazy" preload="auto"></video>❌loading不影响视频主体,preload="auto"会立即拉取视频数据 - 真正要懒加载视频,必须手动控制
src或source的赋值时机
用 IntersectionObserver 懒加载 video 和 iframe
这是目前最可靠、可精确控制加载时机的方式。核心逻辑:监听元素是否进入视口,进入后再设置 src 或 srcdoc,避免提前请求资源。
注意点:
-
IntersectionObserver回调中不要直接操作 DOM 多次,尤其避免重复设置src(已加载过的 video 再设一次会重载) - 需在首次进入后调用
unobserve(),否则持续监听无意义 - 对
<iframe></iframe>,若含第三方脚本(如 YouTube),建议加allow="accelerometer; gyroscope; picture-in-picture"保证功能完整
示例(懒加载 video):
const lazyVideos = document.querySelectorAll('video[data-src]');
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
const video = entry.target;
const src = video.dataset.src;
if (src && !video.src) {
video.src = src;
video.load(); // 触发元数据加载,必要时再 play()
observer.unobserve(video);
}
}
});
});
lazyVideos.forEach(v => observer.observe(v));
audio 和 canvas 动态资源怎么懒加载?
<audio></audio> 没有 loading 属性,且默认 preload="metadata" 就会拉取音频头信息(约几十 KB),对移动端流量敏感场景需干预;<canvas></canvas> 本身不加载资源,但常配合 Image 或 WebAssembly 模块,这些才是真正的加载目标。
- audio:显式设
preload="none",并在需要播放前才设置src并调用load() - canvas 图片资源:用
new Image()+onload加载,而非直接写死src;或结合IntersectionObserver控制加载时机 - WebAssembly 模块:延迟到用户交互(如点击按钮)再
fetch()+WebAssembly.instantiateStreaming()
关键区别在于:HTML 原生属性只能控制“是否自动触发加载”,而真正决定“何时发起网络请求”的,是你第一次给 src、href 或调用 fetch 的那一刻。
服务端配合:响应头与资源优先级
前端懒加载只是第一层,若资源本身体积大或 CDN 缓存策略不合理,仍可能拖慢首屏体验。容易被忽略的是服务端返回的 HTTP 响应头:
- 确保图片/视频资源返回
Cache-Control: public, max-age=31536000(强缓存一年),避免重复加载 - 对 poster 图或占位图,可加
Priority: high(HTTP/3)或Content-DPR等响应头辅助客户端决策 - 使用
<link rel="preload">仅用于首屏必需资源(如 banner 图),切勿预加载所有 lazy 元素,会抵消懒加载效果
最典型的矛盾点:开发者一边写 loading="lazy",一边又在 HTML 里 <link rel="preload" href="hero-video.mp4"> —— 这会让浏览器立刻并发下载,完全绕过懒加载逻辑。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











