preload 属性非强制开关,浏览器常忽略;metadata 最稳妥,仅请求头部元信息,需服务端支持字节范围请求及 moov 快速启动;ios safari 永远降级为 none;动态插入 video 的 preload 无效,须用 intersectionobserver + load() 控制。

preload 属性不是开关,浏览器可以、也经常忽略它。设成 auto 不代表视频真会提前加载,设成 none 也不代表一丁点数据都不取。
preload="metadata" 是最稳妥的默认值
它只请求视频容器头部(比如 MP4 的 moov box),用来获取时长、宽高、编码格式和封面图,不下载画面帧。这个行为在桌面 Chrome、Firefox、Safari 和大多数 Android 浏览器上都稳定生效。
- 务必确保服务端返回
Accept-Ranges: bytes响应头,否则浏览器无法做字节范围请求,metadata模式可能退化为下载前几 KB 甚至整个文件 - 视频文件需用
ffmpeg -c copy -movflags +faststart重写,否则moov在文件末尾,浏览器必须下载全部才能拿到元信息 - 配合
poster属性使用,能立刻显示占位图,避免空白闪烁 - 监听
loadedmetadata事件确认元信息就绪,不要依赖video.readyState判断是否“已预加载”
iOS Safari 无视 preload="auto" 是铁律
从 iOS 10 开始,Safari 就把所有 preload 值(包括 auto)静默降级为 none,哪怕你写了也等于没写。这不是 bug,是苹果强制的流量与电池策略。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 即使页面加了
autoplay,preload也会被直接忽略 -
video.readyState在 iOS 上长期卡在0(HAVE_NOTHING),直到用户点击播放才开始动 - 不要靠 UA 字符串检测 iOS 后再设
auto——写了也没用,不如省掉这行代码
动态插入的
preload 生效的前提是视频元素在 DOM 加载完成时已存在。动态插入的 <video></video> 即使带 preload="auto",也不会触发预加载——它压根没进初始 HTML 解析流程。
- 想实现“即将进入视口时才加载”,应监听
IntersectionObserver,当目标可见后调用video.load() - 调用
load()后,需监听canplay或loadeddata才能安全展示控件或自动播放 - 若需更激进加载(如课程主视频),可搭配
<link rel="preload" as="video" href="xxx.mp4">主动发起请求(仅同域有效,且不触发解码)
最容易被忽略的一点:preload 生效只在 HTML 解析阶段;后续 JS 设置完全不触发浏览器预加载逻辑。如果你的视频是懒加载组件的一部分,preload 写在模板里也没用,得靠 JS 显式调用 load()。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










