页面滚动时自动暂停视频需用intersectionobserver监听视口可见性,视频进入视口时play()(需muted解决自动播放限制),离开时pause();配合loading="lazy"优化性能。

页面滚动时自动暂停视频,核心是监听滚动事件,结合 <video></video> 元素的 play() 和 pause() 方法控制播放状态。关键在于判断视频是否在视口内,只对“可见”的视频播放,其余暂停。
监听页面滚动并检测视频可视状态
使用 IntersectionObserver 是最高效、性能友好的方式——它异步监听目标元素是否进入/离开视口,避免频繁触发滚动事件导致卡顿。
- 为每个
<video></video>创建一个观察器实例(或复用一个观察器观察多个视频) - 当视频元素
isIntersecting === true时尝试播放(需处理自动播放策略限制) - 当
isIntersecting === false时立即调用pause()
处理浏览器自动播放策略限制
现代浏览器禁止无用户交互时的自动播放(尤其带声音的视频)。若视频含音频,需设置 muted 属性才能静音自动播放;若需有声播放,首次播放必须由用户点击等手势触发。
- 推荐写法:
<video muted autoplay playsinline></video> -
playsinline防止 iOS 全屏播放 - 即使静音,
play()仍可能返回 Promise,应捕获错误:video.play().catch(e => console.warn("Play prevented:", e))
基础实现代码示例
以下为轻量、可直接使用的脚本:
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
const video = entry.target;
if (entry.isIntersecting) {
video.play().catch(() => video.pause());
} else {
video.pause();
}
});
});
document.querySelectorAll('video').forEach(video => {
observer.observe(video);
});
补充优化点
提升体验和兼容性的小技巧:
- 添加
loading="lazy"延迟加载非首屏视频,减少初始资源压力 - 对已暂停且长时间不可见的视频,可考虑调用
load()释放部分资源(非必需) - 如需支持旧浏览器(IE),可用
getBoundingClientRect()+scroll事件降级,但注意性能损耗
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











