孅いエンジニアブログ

JavaScriptでカーソルに追従させる処理、デベロッパーツールとかYouTubeの画面上で重くなる件

数年前にこういう拡張機能を作りました。

この拡張機能はマウスカーソルの後ろを四角い図形がついてくるというお遊び高負荷拡張機能です。動作としては、addEventListener("mousemove")でマウスが動くごとに追従する四角い図形のtopleftを書き換えていました。

const element = /* 追従させたいえれめんと */

addEventListener("mousemove", (event) => {
    element.style.top = event.clientX;
    element.style.left = event.clientY;

    requestAnimationFrame(move);
});

これをリニューアルした時に気づいたんですが、addEventListener("mousemove")で追従させる処理がデベロッパーツールを開いたり、YouTubeの再生中とかですごく遅くなるっぽいです。

topleftを変えてるからかなと思って、transform: translate()にしてみたけど一緒でした。

なので、addEventListener("mousemove")で変数のtop, leftだけ変動させて実際に値を適用させるのはrequestAnimationFrame()でループさせてる中で実行することにしてみた。

const element = /* 追従させたいえれめんと */
let x = 0;
let y = 0;

addEventListener("mousemove", (event) => {
    x = event.clientX;
    y = event.clientY;
});

const move = () => {
    element.style.top = x;
    element.style.left = y;

    requestAnimationFrame(move);
};

move();

そしたらなめらかに動くようになりました。

why...

addEventListenerは特定の条件下で負荷が高くなるのかな。。。

実際の拡張機能はもっといろいろ間引いたり、なんやかんやしたり軽量化処理しているので、より負荷は軽減してると思いますが、めっちゃ重いです。なんとかならんかな。