如何在Video.js中重新定位进度条的开始与结束时间?
解决Video.js进度条重新定位起始时间的方案
我刚好处理过类似的需求,给你分享个基于Video.js最新版本的原生实现方案,完全能满足你说的:把当前播放位置设为新的进度条0点,视频还能继续播放。
核心思路
我们需要做的就是“调整”播放器的时间显示逻辑,把原视频时间转换成相对于自定义起始点的时间,同时确保进度条的交互(点击、拖动)能准确映射回正确的原视频时间。
具体实现步骤
1. 初始化播放器并定义变量
首先正常初始化你的Video.js播放器,然后定义一个变量来存储我们的自定义起始时间:
const player = videojs('my-video'); let customStartTime = 0; // 初始为0,对应原视频的起始点
2. 编写重置起始点的核心函数
这个函数负责更新起始时间、重写时间显示逻辑、处理进度条交互:
function setCustomStartTime(newStartTime) { // 先记录当前播放状态,避免设置后意外暂停 const wasPlaying = !player.paused(); // 保存新的起始时间 customStartTime = newStartTime; // 计算自定义的总时长(原视频总时长 - 新起始时间) const customDuration = player.duration() - customStartTime; // 等播放器就绪后重写相关方法 player.ready(() => { // 重写当前时间显示的更新逻辑 player.currentTimeDisplay.update = function() { // 计算相对于新起始点的时间 const relativeTime = player.currentTime() - customStartTime; this.el_.textContent = player.formatTime(relativeTime); }; // 重写总时长显示的更新逻辑 player.durationDisplay.update = function() { this.el_.textContent = player.formatTime(customDuration); }; // 处理进度条点击事件:把点击位置映射回原视频时间 player.controlBar.progressBar.on('click', function(e) { // 计算点击位置对应的相对时间 const relativeSeekTime = (e.offsetX / this.el_.offsetWidth) * customDuration; // 设置原视频的对应时间 player.currentTime(customStartTime + relativeSeekTime); }); // 处理进度条拖动事件:限制拖动范围在自定义的时间区间内 const originalMouseMove = player.controlBar.progressBar.seekBar.handleMouseMove; player.controlBar.progressBar.seekBar.handleMouseMove = function(e) { originalMouseMove.call(this, e); const currentRelativeTime = player.currentTime() - customStartTime; // 边界检查,避免拖动超出自定义的起始/结束点 if (currentRelativeTime < 0) { player.currentTime(customStartTime); } else if (currentRelativeTime > customDuration) { player.currentTime(customStartTime + customDuration); } }; }); // 如果之前在播放,设置后继续播放 if (wasPlaying) { player.play(); } // 强制更新时间显示和进度条状态 player.currentTimeDisplay.update(); player.durationDisplay.update(); player.controlBar.progressBar.update(); }
3. 触发重置操作
比如你要在播放到200秒时自动触发,就可以监听timeupdate事件:
player.on('timeupdate', function() { // 当播放到200秒且还没设置过自定义起始点时触发 if (player.currentTime() >= 200 && customStartTime === 0) { setCustomStartTime(200); // 只触发一次,移除这个监听 player.off('timeupdate', arguments.callee); } });
额外说明
- 如果你需要手动触发(比如加个按钮),直接调用
setCustomStartTime(200)就行,不用监听timeupdate。 - 测试时要注意进度条的拖动边界,确保不会拖到原视频的200秒之前或者300秒之后。
- 这个方案基于Video.js的原生API,不需要额外插件,适配最新版本没问题。
内容的提问来源于stack exchange,提问作者goltornate




