弹幕容器必须用 position: relative 包裹视频,不可直接设在 video 标签上;弹幕层需加 pointer-events: none 以保障控件可点击;动画优先用 transform + transition;轨道分配须 JS 动态计算并及时清理 DOM。
position: relative 包裹视频直接对 <video> 标签设 position: relative 是无效的——它默认是 inline 元素,且多数浏览器不将其视为可靠的定位上下文。常见错误是只给弹幕层设 position: absolute,结果弹幕飞到页面左上角或顶部空白处。
<div class="video-wrapper"> 这类容器包裹 <video>,并显式声明 position: relative
width: 100% + aspect-ratio 或固定尺寸)display: flex 或 grid 的父容器替代 position: relative——flex/grid 不自动创建定位上下文pointer-events: none 必须加在弹幕层上否则用户点不到视频控件(比如播放/暂停按钮、进度条),尤其在移动端会直接失效。这不是可选项,是必填项。
#barrageContainer)样式中必须包含 pointer-events: none
pointer-events: auto 配合事件委托,且只对具体弹幕元素启用pointer-events: none 支持不稳定,若遇兼容问题,可用 z-index: -1 + 单独一层控件覆盖来兜底transform + transition 比 left 动画更稳用 left 配合 setInterval 或 requestAnimationFrame 更新位置,在低端安卓机和旧 iPhone 上容易掉帧;而 CSS transform 走 GPU 加速,实测在 iPhone 6、Redmi 4 等设备无卡顿。
<span> 设 position: absolute,初始 transform: translateX(100vw)
transition: transform 8s linear(时长按视频宽度和速度反推)transitionend 事件移除 DOM,避免内存堆积animate() 或纯 JS 修改 left 值——重排重绘开销大,移动端尤其明显CSS 无法自动判断哪一行空闲,硬写死 top: 20px、top: 60px 会导致弹幕堆叠或大片留白。必须用 JS 实时分配垂直位置。
立即学习“前端免费学习笔记(深入)”;
[false, false, true, false] 表示第 3 行被占)false 位置,设为 top: calc(20% * index) 或固定像素偏移font-size 和 line-height 必须固定,否则动态计算的 top 值会错位真实项目里最容易被忽略的不是动画怎么写,而是轨道管理没做或做了但没清空已移出屏幕的弹幕节点——内存泄漏比卡顿更隐蔽,也更难 debug。