【发布时间】:2021-03-12 13:59:35
【问题描述】:
我希望点跟随鼠标光标,例如点击。 代码看起来很简单,但每次点击时,点的距离都会变短,而且不会到达目标。
问题是为什么?
代码在这里:
https://jsfiddle.net/thiefunny/ny0chx3q/3/
HTML
<circle r="10" cx="300" cy="300" />
JavaScript
const circle = document.querySelector("circle")
window.addEventListener("click", mouse => {
const animation = _ => {
let getCx = Number(circle.getAttribute('cx'))
let getCy = Number(circle.getAttribute('cy'))
circle.setAttribute("cx", `${getCx + (mouse.clientX - getCx)/10}`);
circle.setAttribute("cy", `${getCy + (mouse.clientY - getCy)/10}`);
requestAnimationFrame(animation)
}
requestAnimationFrame(animation)
});
编辑:对于这个任务,我需要 requestAnimationFrame(),而不是 CSS,因为这只是最简单的例子,但我想在后面的动作中添加更多的复杂性,包括多个点、随机参数等,就像我做的那样这里:https://walanus.pl
我花了很多时间进行实验,但我唯一的结论是,在单击事件之后,我应该以某种方式取消当前动画并开始新的动画,以便为下一个动画重新开始。
【问题讨论】:
-
到达目的地时停止动画帧(不要再次调用 requestAnimationFrame(animation))。并在您开始新的帧回调时取消任何先前安排的帧回调。在这里,您在页面上点击的次数与您点击的次数一样多,并且一直在努力将点移动到不同的方向。
-
凯多您好,感谢您的回复。但是,重点是如何“在开始新的帧回调时取消任何先前安排的帧回调”。如果我将动画命名为让
animationName = requestAnimationFrame(animation)在“动画”函数中,我不能在回调函数的开头使用cancelAnimationFrame(animationName)来引用它,因为那时它甚至还没有声明。 -
另外,我不确定你的意思,因为我不会在任何地方“再次”调用
requestAnimationFrame(animation)。我只是初始化它const animation = ...,而不是在动画函数中“递归”调用它,然后最终运行它。
标签: javascript animation requestanimationframe cancelanimationframe