HTML弹幕与滚动评论必须物理隔离DOM:弹幕层用position:fixed全屏覆盖并pointer-events:none,评论区用固定高度+overflow-y:auto;二者数据同源但渲染独立,禁用innerHTML拼接、强制节点复用,并以seq_id替代时间戳确保顺序。
HTML弹幕和滚动评论不能共用同一套 DOM 渲染逻辑,强行混合会导致视觉错乱、内存泄漏、滚动卡顿——这不是样式微调能解决的问题,而是架构层面的隔离缺失。
把弹幕节点塞进评论列表容器里,等于主动触发重排+重绘风暴。哪怕只显示 20 条弹幕,也会让 overflow-y: auto 的评论区容器频繁计算布局。
position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 9999; 全屏覆盖,且设 pointer-events: none; 防止遮挡下方操作max-height: 300px;),overflow-y: auto;,z-index: 1;
appendBarrage() 和 appendCommentList()
scrollLeft,优先用 transform: translateX()
直接改 scrollLeft 在 iOS Safari 和部分安卓 WebView 上会掉帧,尤其当评论区在 position: sticky 或嵌套在 flex 容器中时,浏览器无法合并滚动合成层。
overflow: hidden; 和 white-space: nowrap;,子元素用 display: inline-block; 或 flex 排列element.style.transform = 'translateX(' + x + 'px)';,配合 will-change: transform;
requestAnimationFrame 控制位移节奏,避免 setInterval 累积误差offsetTop、getBoundingClientRect() 的逻辑——这是卡顿元凶innerHTML += 渲染弹幕是内存泄漏高危操作每次拼接字符串生成新 DOM,旧节点没被显式 remove(),又没被 JS 引用,就变成孤立节点,V8 垃圾回收不及时,低端机几秒就卡死。
立即学习“前端免费学习笔记(深入)”;
danmu-${Date.now()}-${Math.random().toString(36).substr(2, 6)})animationend 或在 rAF 循环中判断 x ,然后 <code>node.remove()
remove() 后推入池尾,下次从池头取container.innerHTML += '<div>...</div>',改用 container.appendChild(danmuNode)
WebSocket 消息到达、JS 执行、CSS 动画启动之间存在毫秒级延迟。若 5 条弹幕在 100ms 内连发,服务端用 Date.now() 打时间戳,前端直接按时间排序并启动动画,大概率出现“后发先至”或堆叠卡顿。
seq_id 字段,前端按此排序,而非依赖客户端时间time 字段应为相对视频起始的秒数(如 12.34),由 video.ontimeupdate 触发匹配,而非一收到就播performance.now() - server_ts 补偿网络传输延迟,否则快速连发时视觉节奏全乱真正难的不是让文字动起来,而是让动起来的文字不干扰页面其他行为——DOM 隔离、节点生命周期、时间精度,这三处稍有松懈,滚动评论就会在用户滑动时突然卡住半秒,而这个半秒没人会归因到弹幕上。