如何设置HTML视频的preload属性实现预加载?
- 内容介绍
- 文章标签
- 相关推荐
本文共计705个文字,预计阅读时间需要3分钟。
plaintextpreload属性不是开启,而是建议——浏览器可以、也可以经常忽略它。实现auto不代表视频真的会提前加载,实现none也不代表一点数据都不会取。
preload="metadata" 是最靠谱的默认值
它只请求视频容器头部(比如 MP4 的 moov box),用来获取时长、宽高、编码格式和封面图,不下载画面帧。这个行为在桌面 Chrome、Firefox、Safari 和大多数 Android 浏览器上都稳定生效。
- 若服务端未返回
Accept-Ranges: bytes响应头,metadata模式可能退化为下载前几 KB 甚至整个文件才能解析时长 - 务必确保视频文件已用
ffmpeg -c copy -movflags +faststart重写,否则moov在文件末尾,浏览器必须下载全部才能拿到元信息 - 配合
poster属性使用,能立刻显示占位图,避免空白闪烁
iOS Safari 无视 preload="auto" 是铁律
从 iOS 10 开始,Safari 就把所有 preload 值(包括 auto)静默降级为 none,哪怕你写了也等于没写。这不是 bug,是苹果强制的流量与电池策略。
- 即使页面加了
autoplay,iOS 也不会因此触发预加载;反而因为autoplay存在,preload会被直接忽略 - 不要靠
video.readyState判断是否预加载成功:iOS 上它长期卡在0(HAVE_NOTHING),直到用户点击播放才开始动 - 真想提前拿时长?必须监听
loadedmetadata事件,而不是检查preload属性值
比 preload 更有效的三种实操手段
单纯改 HTML 属性收效甚微,真正起作用的是组合动作:
立即学习“前端免费学习笔记(深入)”;
- 用
<link rel="preload" as="video" href="xxx.mp4">主动发起请求(仅同域有效,且不触发解码) - 服务端响应头必须含
Accept-Ranges: bytes,否则浏览器无法做字节范围请求,metadata就失效 - 在用户即将看到视频区域时(如 IntersectionObserver 进入视口),用 JS 显式调用
video.load(),并监听canplay或loadeddata再展示控件
最常被忽略的一点:preload 生效的前提是视频元素在 DOM 加载完成时已存在。动态插入的 <video> 即使带 preload="auto",也不会触发预加载——它压根没进初始 HTML 解析流程。
本文共计705个文字,预计阅读时间需要3分钟。
plaintextpreload属性不是开启,而是建议——浏览器可以、也可以经常忽略它。实现auto不代表视频真的会提前加载,实现none也不代表一点数据都不会取。
preload="metadata" 是最靠谱的默认值
它只请求视频容器头部(比如 MP4 的 moov box),用来获取时长、宽高、编码格式和封面图,不下载画面帧。这个行为在桌面 Chrome、Firefox、Safari 和大多数 Android 浏览器上都稳定生效。
- 若服务端未返回
Accept-Ranges: bytes响应头,metadata模式可能退化为下载前几 KB 甚至整个文件才能解析时长 - 务必确保视频文件已用
ffmpeg -c copy -movflags +faststart重写,否则moov在文件末尾,浏览器必须下载全部才能拿到元信息 - 配合
poster属性使用,能立刻显示占位图,避免空白闪烁
iOS Safari 无视 preload="auto" 是铁律
从 iOS 10 开始,Safari 就把所有 preload 值(包括 auto)静默降级为 none,哪怕你写了也等于没写。这不是 bug,是苹果强制的流量与电池策略。
- 即使页面加了
autoplay,iOS 也不会因此触发预加载;反而因为autoplay存在,preload会被直接忽略 - 不要靠
video.readyState判断是否预加载成功:iOS 上它长期卡在0(HAVE_NOTHING),直到用户点击播放才开始动 - 真想提前拿时长?必须监听
loadedmetadata事件,而不是检查preload属性值
比 preload 更有效的三种实操手段
单纯改 HTML 属性收效甚微,真正起作用的是组合动作:
立即学习“前端免费学习笔记(深入)”;
- 用
<link rel="preload" as="video" href="xxx.mp4">主动发起请求(仅同域有效,且不触发解码) - 服务端响应头必须含
Accept-Ranges: bytes,否则浏览器无法做字节范围请求,metadata就失效 - 在用户即将看到视频区域时(如 IntersectionObserver 进入视口),用 JS 显式调用
video.load(),并监听canplay或loadeddata再展示控件
最常被忽略的一点:preload 生效的前提是视频元素在 DOM 加载完成时已存在。动态插入的 <video> 即使带 preload="auto",也不会触发预加载——它压根没进初始 HTML 解析流程。

