Canvas字母交互代码在Chrome与Firefox中表现差异问题咨询
问题根因
问题核心出在鼠标移动事件的时间差计算逻辑:
Firefox 触发 mousemove 事件的频率高于 Chrome,可能出现两次事件触发间隔小于 1ms 的情况,此时 Date.now() 返回的时间戳完全相同,导致代码中的 mouse.dt 等于 0。计算粒子速度时除以 0 会得到无穷大的数值,粒子位置直接溢出边界,最终跳转至左上角。
另外首次触发 mousemove 时,mouse.timestamp 初始值为 0,也可能导致首次计算的位移参数异常。
修复方案
1. 修复mousemove事件逻辑
修改原有的鼠标移动监听代码,增加首次事件初始化逻辑和最小时间差限制,避免除以0的问题:
canvas.addEventListener("mousemove", function(e) { var now = Date.now() // 首次触发事件时直接初始化坐标,不计算位移 if (mouse.timestamp === 0) { mouse.x = e.clientX; mouse.y = e.clientY; mouse.prevX = e.clientX; mouse.prevY = e.clientY; mouse.timestamp = now; } else { mouse.prevX = mouse.x; mouse.prevY = mouse.y; mouse.x = e.clientX; mouse.y = e.clientY; mouse.dt = now - mouse.timestamp; // 最小时间差限制为16ms,对应60帧刷新间隔,避免除以0 if (mouse.dt < 16) mouse.dt = 16; mouse.timestamp = now; } // 光标样式判断逻辑保持不变 if (e.clientX - window.innerWidth / 2 > 14.5 && e.clientX - window.innerWidth / 2 < 205.5 && e.clientY - window.innerHeight / 2 - vGap > -25 && e.clientY - window.innerHeight / 2 - vGap < 10) { canvas.style.cursor = "pointer" } else { canvas.style.cursor = "auto" } })
2. 可选优化:增加速度上限
为了避免其他异常场景下速度溢出,可以在粒子update方法中计算完速度后,增加速度阈值限制:
// 放在this.velocity.x、this.velocity.y赋值完成之后 this.velocity.x = Math.max(-50, Math.min(50, this.velocity.x)); this.velocity.y = Math.max(-50, Math.min(50, this.velocity.y));
内容的提问来源于stack exchange,提问作者Aditya Prakash
相关产品推荐
相关产品推荐

