You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 00:42:03