マウスストーカー requestAnimationFrame

#rectangle {
  position: absolute;
  width: 100px;
  height: 100px;
  background-color: rgba(255, 0, 0, 0.5);
}

#circle {
  position: absolute;
  width: 100px;
  height: 100px;
  border-radius: 50%;
  background-color: rgba(0, 255, 0, 0.5);
}
<div id="rectangle"></div>
<div id="circle"></div>
const rectangle = document.getElementById("rectangle");
const circle = document.getElementById("circle");

let mouseY = 0;
let mouseX = 0;
let circleY = 0;
let circleX = 0;

document.addEventListener("mousemove", (e) => {
  console.dir(e);
  mouseY = e.clientY;
  mouseX = e.clientX;
  rectangle.style.top = `${e.clientY}px`;
  rectangle.style.left = `${e.clientX}px`;
});

circleMove();

function circleMove() {
  requestAnimationFrame(circleMove);

  circleY += (mouseY - circleY) * 0.01;
  circleX += (mouseX - circleX) * 0.03;

  circle.style.transform = `translate(${circleX}px,${circleY}px)`;
}

requestAnimationFrame()メソッドは再描画の前に関数の呼び出しを要求する命令。
一般的なディスプレイでは1秒間に60回画面が更新される
requestAnimationFrame()メソッドは一度しか呼び出されないので、関数の中で自身を呼び出すことが必要。setTimeout()メソッドと一緒。