核心是弹幕需在正确时间点随视频实时滚动,canvas负责高效绘制,video的timeupdate事件实现时间对齐;二者须通过绝对定位、动态同步尺寸及z-index精准层叠;弹幕按时间轴触发并由requestanimationframe平滑渲染。

核心是让弹幕在正确的时间点出现,并随视频播放实时滚动。Canvas 负责高效绘制,video 的 timeupdate 事件负责时间对齐,二者必须协同工作,缺一不可。
Canvas 与 video 的精准层叠布局
弹幕要“浮”在视频上,前提是 canvas 和 video 在视觉上完全重合。不能只靠 width/height 属性匹配,更要依赖 CSS 定位控制。
- 用一个 position: relative 的容器包裹 video 和 canvas
- video 和 canvas 都设为 position: absolute; top: 0; left: 0;
- canvas 的 width/height 必须通过 JavaScript 动态同步 video.clientWidth/clientHeight,否则缩放或全屏时会错位
- z-index 确保 canvas 在 video 上层(通常 canvas 设为 2,video 为 1)
按时间轴触发弹幕的关键逻辑
不是所有弹幕都立刻显示,而是等视频播到对应时刻才激活。这依赖于对 timeupdate 事件的稳定监听和弹幕池的有序管理。
- 弹幕数据应为数组,每个对象含 time(秒级浮点数)、text、color、size、speed 等字段
- 监听 video 的 timeupdate 事件,每次获取 currentTime
- 遍历预加载的弹幕池,将 time ≤ currentTime 且未触发过 的弹幕推入活动队列,并标记已触发
- 暂停播放时,清空活动队列或暂停动画循环;恢复播放时重新检查当前时间,补发遗漏弹幕
requestAnimationFrame 驱动的平滑渲染
用 requestAnimationFrame 替代 setInterval,能更好匹配浏览器刷新节奏,避免卡顿或跳帧。
- 每一帧先 ctx.clearRect() 清空画布,再逐个绘制活动弹幕
- 每个弹幕对象维护自己的 x 坐标,每帧执行 x -= speed 实现左移
- 当 x
- 为防文字重叠,可预设若干垂直轨道(如 top: 20%、40%、60%),随机分配新弹幕到空闲轨道
基础交互与轻量优化建议
用户发送、颜色选择、速度调节等是标配功能,但实现时需兼顾可用性与性能边界。
- 输入框回车或点击按钮后,生成新弹幕对象并直接加入活动队列(不走 time 字段,即时显示)
- 限制活动弹幕总数(如最多 100 条),超出则淘汰最早入队的,防止内存持续增长
- 文字绘制前调用 ctx.font = size + 'px sans-serif',避免重复设置影响性能
- 移动端需监听 window.resize 事件,重新同步 canvas 尺寸,否则横竖屏切换后弹幕错位
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











