弹幕元素必须用position: absolute定位,挂载于同一relative容器内,通过js动态设置top/left、animation-delay和animation-duration实现随机匀速飘动,关键帧仅用transform/opacity,出屏后主动remove()。

弹幕元素必须用 position: absolute 定位,不能依赖 flex/grid 布局
弹幕是纯动态、多实例、无序叠加的动画流,flex 或 grid 会强制重排,导致性能断崖式下降。所有弹幕 div 必须挂载在同一个 relative 容器内,并用 absolute + top/left 控制起始位置。Tailwind 中对应类是 absolute top-0 left-0,但 top 和 left 值需 JS 动态注入,不能写死。
animate-[name] 自定义动画必须配 infinite linear,且关键帧只动 transform 和 opacity
弹幕要匀速横穿屏幕,不能有缓动(ease-in-out 会让速度不一致),也不能触发重排。因此:
- 在
tailwind.config.js的keyframes中定义类似danmuMove:从translateX(100vw)到translateX(-100%) -
animation配置里必须加infinite linear,不能漏掉linear—— 否则默认是ease,首尾减速明显 - 禁止在关键帧里写
width、height、margin、color等非 GPU 加速属性
keyframes: {
danmuMove: {
'0%': { transform: 'translateX(100vw) translateY(-20px)' },
'100%': { transform: 'translateX(-100%) translateY(-20px)' },
}
},
animation: {
'danmu-move': 'danmuMove 15s linear infinite',
}
每条弹幕的 animation-delay 和 animation-duration 必须随机,否则会堆成一坨
如果所有弹幕共用同一套 animate-danmu-move 类,它们会同步出发、同步结束,视觉上就是一条粗带子,完全失去“飘动”感。真实做法是:
- 用 JS 创建弹幕元素时,动态设置
style.animationDelay(如-Math.random() * 10 + 's') - 同时微调
style.animationDuration(如12 + Math.random() * 8 + 's'),让快慢错开 - 避免用
delay-工具类 —— Tailwind 的delay-是静态预设值,无法满足随机性需求
animation-delay 为负值是合法的,表示“从动画中途开始播放”,这正是实现“已有弹幕正在飘过”的关键。容器必须设 overflow-hidden,且弹幕出屏后应主动 remove()
弹幕一旦移出视口右边界(translateX ),继续留在 DOM 里只会白占内存和重绘资源。虽然 <code>overflow-hidden 能隐藏它,但:
- 不清理会导致弹幕节点无限累积,几小时后页面卡死
- 务必监听
animationend事件,或用requestAnimationFrame检测getBoundingClientRect().right - 不要依赖
visibility: hidden或opacity: 0—— 它们不释放渲染压力
relative overflow-hidden,否则弹幕可能溢出到页面其他区域。
Tailwind 本身不提供弹幕逻辑,真正难的是控制并发数量、防重叠、响应弹幕密度变化——这些都得靠 JS 实时计算,CSS 只管“怎么飘”。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











