preload属性有auto、metadata、none三值,是提示而非强制指令;auto在ios safari中被无视,android chrome在非用户手势下降级,桌面chrome依网络和可视区决定预加载;metadata最稳定,仅取元信息,需监听loadedmetadata;none仅为建议,chrome仍可能加载小mp4。

preload 属性只有三个合法取值:auto、metadata、none。它不是开关,而是提示;浏览器可以忽略、降级甚至反向处理——尤其在移动端。
preload="auto" 在哪些场景下实际不加载
设成 auto 并不等于“开始下载视频”。iOS Safari 从 iOS 10 起就完全无视该值,强制按需加载;Android Chrome 在非用户手势触发上下文中(比如页面 onload 后自动调用)也会降级为只取元数据甚至不取。
- 桌面 Chrome 可能预加载前几秒,但取决于网络条件和视频是否在首屏可视区
- 即使写了
preload="auto",video.readyState仍常为0(HAVE_NOTHING),直到用户点击播放 - 服务端未开启
Accept-Ranges: bytes支持时,auto可能退化为全量下载或失败
preload="metadata" 是最可控的选择
它明确告诉浏览器:只取封面、时长、宽高、编码格式等元信息,不碰画面帧数据。这是唯一能在 iOS Safari、微信 X5、Android WebView 上稳定生效的值。
- 元数据请求体积小(通常几百字节),失败率低,且可被 CDN 缓存
- 必须监听
loadedmetadata事件来确认就绪,不能依赖canplay或canplaythrough - 若视频源是 MP4 且未做
faststart(moov box 前置),metadata请求可能卡住或超时
preload="none" 不代表“绝对不加载”
它只是建议浏览器暂不发起请求,但 Chrome 对小体积 MP4(如 audio 更激进——哪怕设 none,只要调了 play(),就会立即请求并缓存前 1–2MB。
- 不要以为写了
none就能省掉所有流量,真实行为得看网络面板里有没有提前发出的.mp4或.m4a请求 - 移动端几乎无法靠
none实现“零预加载”,更可靠的做法是延迟创建video或audio元素,直到用户交互后 - 如果真要杜绝预加载,得配合 JS 控制:初始不设
src,交互后再赋值并调load()
真正决定预加载效果的,从来不是 preload 的字符串值,而是你是否监听了 loadedmetadata、是否检查了 buffered 范围、是否在 Network 面板里验证了请求时机——属性只是起点,不是终点。










