HTML5视频需在loadedmetadata事件后设currentTime属性(单位秒)才能精准跳转,URL的#t=参数可静态指定起播时间但仅首次加载有效,preload应设为metadata,跨域视频须配置CORS头否则静默失败。
currentTime 属性控制起始播放时间HTML5 元素原生支持从指定时间点开始播放,核心是设置 currentTime 属性。这个属性单位为秒(浮点数),代表视频当前播放位置。它必须在视频元数据加载完成(loadedmetadata 事件触发后)才能安全设置,否则可能被忽略或抛错。
常见错误是直接在 onload 或 DOM 加载后立刻赋值,但此时视频尚未解析时长和关键帧信息,currentTime 设置无效。
loaded
metadata 事件回调中设置:const video = document.getElementById('myVideo');
video.addEventListener('loadedmetadata', () => {
video.currentTime = 65.5; // 从第 65.5 秒开始
});playBtn.addEventListener('click', () => {
video.currentTime = 120;
video.play();
});#t=)HTML5 规范支持在视频 URL 后添加 #t= 片段标识符来声明起始时间,浏览器会在加载时自动跳转。语法支持两种格式:#t=65.5(仅开始时间)或 #t=65.5,120(开始+结束时间)。
这个方法无需 JS,适合静态页面或服务端直出场景,但有明显限制:
立即学习“前端免费学习笔记(深入)”;
src 后才重新解析preload 属性影响 currentTime 设置时机preload 决定了浏览器加载视频的积极程度,间接影响 currentTime 是否能及时生效。默认值 metadata 仅加载元数据(含时长、尺寸),已足够支持 currentTime 设置;而 none 可能导致 loadedmetadata 延迟甚至不触发。
preload 不为 none,尤其在需要精确起播的场景下:preload="auto" 会预加载更多数据,可能加快跳转响应,但增加带宽消耗,移动端慎用preload="metadata",仍需监听 loadedmetadata,不能假设 DOM ready 后就绪currentTime 设置失败的静默问题当视频资源位于不同源(CORS)且响应头未包含 Access-Control-Allow-Origin 时,浏览器出于安全限制,会禁止读取视频元数据(包括时长),导致 currentTime 设置无效,且通常不报错——只是静默失败。
验证方式:检查控制台是否出现类似 Unable to get video metadata: No 'Access-Control-Allow-Origin' header 的警告;或打印 video.duration,若为 NaN 即表示元数据不可用。
Access-Control-Allow-Origin: *(或具体域名)
if (isNaN(video.duration)) {
console.warn('Video metadata not available — currentTime may not work');
}loadedmetadata 的等待逻辑——没这两个,其他写法都可能白忙。