应使用requestanimationframe替代mousemove直接更新位置,仅在mousemove中记录坐标,再通过raf每帧读取并用transform:translate()平滑更新元素位置,避免重排卡顿。

用 requestAnimationFrame 替代 mousemove 频繁触发
直接监听 mousemove 并立刻更新鼠标元素位置,会导致大量重绘、卡顿甚至掉帧。浏览器每秒触发 mousemove 可达 60–120 次,但屏幕刷新通常只有 60fps,多余计算纯属浪费。
实操建议:
- 只在
mousemove中记录最新坐标(如存到mouseX/mouseY变量),不操作 DOM - 用
requestAnimationFrame统一驱动动画帧,在每一帧里读取最新坐标并更新元素transform - 避免使用
left/top+position: absolute,改用transform: translate(),触发 GPU 加速且不触发 layout
如何让跟随元素「带拖尾」或「有延迟感」
生硬贴着鼠标移动会显得机械。真实跟随需要插值(lerp)或缓动逻辑,本质是让元素位置平滑趋近目标点,而非瞬移。
实操建议:
- 维护两个坐标:目标位置(鼠标实时坐标)、当前渲染位置(元素实际
transform值) - 每帧用
current = current + (target - current) * easeFactor更新(easeFactor通常取 0.1–0.25) - 若需多段拖尾(如光点残影),可维护一个数组存储历史位置,逐帧衰减透明度并渲染多个
span - 注意:不要在 lerp 中使用
setTimeout或setInterval,它们与帧率不同步,易导致抖动
兼容性与性能关键点:指针事件 vs clientX/Y
用 event.clientX / event.clientY 最稳妥;event.pageX/pageY 在页面缩放或滚动时可能偏移;event.x/y 兼容性差(IE 不支持)。
实操建议:
- 监听
document而非具体容器,防止鼠标快速移出区域时丢失事件 - 给跟随元素设
pointer-events: none,否则它会拦截后续的mousemove,导致鼠标“卡住” - 移动端默认无鼠标,如需支持触摸,需额外监听
touchmove并取touches[0].clientX,但要注意 touch 事件默认可滚动,需e.preventDefault() - 低端设备上,可加节流判断:
if (performance.now() - lastTime ,强制不低于 60fps 下限
最简可用代码结构(仅核心逻辑)
以下不是完整 HTML,而是插入到已有 index.html 的 <script></script> 中即可运行的骨架:
<style>
.cursor { position: fixed; width: 20px; height: 20px; border-radius: 50%; background: #007bff; transform: translate(-50%, -50%); pointer-events: none; z-index: 9999; }
</style><p></p><div class="cursor"></div><p><script>
const cursor = document.querySelector('.cursor');
let mouseX = 0, mouseY = 0;
let currentX = 0, currentY = 0;</script></p><p>document.addEventListener('mousemove', e => {
mouseX = e.clientX;
mouseY = e.clientY;
});</p><p>function animate() {
currentX += (mouseX - currentX) <em> 0.15;
currentY += (mouseY - currentY) </em> 0.15;
cursor.style.transform = <code>translate(${currentX}px, ${currentY}px) translate(-50%, -50%)</code>;
requestAnimationFrame(animate);
}
animate();
</p>
这个结构没封装、没防错、没响应式适配——但它能跑,且踩中了绝大多数初学者写崩的点:没节流、没用 transform、忘了 pointer-events、用了 pageX。
真正难的不是让光标动起来,而是让它在各种缩放、滚动、高 DPR 屏幕、低配安卓机上都不掉帧、不偏移、不抢焦点。这些细节藏在 event 坐标来源、CSS 渲染层、以及是否信任 requestAnimationFrame 的调度精度里。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











