Как заставить mosemove читать все движения мышью?

На сайте есть множество элементов, которые при движении мышью должны двигаться. Написал вот такую функцию.

let blur = document.querySelectorAll(".blur");
blur.forEach(function (elem) {
  window.addEventListener("mousemove", function (e) {
    let x = e.clientX / window.innerWidth;
    let y = e.clientY / window.innerHeight;
    elem.style.transform = "translate(-" + x * 15 + "px, -" + y * 15 + "px)";
    elem.style.transform = "translate(-" + x * 15 + "px, -" + y * 15 + "px)";
  });
});

Но возникла проблема, если двигать мышью очень быстро, то движения мышью не ловятся, отрабатывает только последнее расположение мыши, а надо чтобы работало на все движения мышью. Читал, что это такой принцип работы метода, что он пропускает некоторые движения и фиксирует только последние или типо того, но хотелось бы заставить эту функцию работать как надо.


Ответы (1 шт):

Автор решения: navasiolau

Думаю, если вы достанете из цикла вот это:

window.addEventListener("mousemove", function (e) {
    let x = e.clientX / window.innerWidth;
    let y = e.clientY / window.innerHeight;
    elem.style.transform = "translate(-" + x * 15 + "px, -" + y * 15 + "px)";
    elem.style.transform = "translate(-" + x * 15 + "px, -" + y * 15 + "px)";
  });

то работать будет прекрасно. Я не понял для чего вы вешаете множество раз на window обработчик. Это делается единожды где-то в вашем скрипте, а дальше просто работает как должно.

По идее никаких пропусков быть не должно, по крайней мере в такой реализации я отслеживал вообще все действия пользователя:

function idleLogout(object) {
    var t;
    window.onload = resetTimer;
    window.onmousemove = resetTimer;
    window.onmousedown = resetTimer;
    window.ontouchstart = resetTimer;
    window.onclick = resetTimer;
    window.onkeypress = resetTimer;
    window.addEventListener('scroll', resetTimer, true);

    function abortAutosave() {
        object.clearTimers();
        object.clearCache();
    }

    function resetTimer() {
        clearTimeout(t);
        // после 10 минут бездействия пользователя сбрасываются таймеры
        t = setTimeout(abortAutosave, 600000);
    }
}
→ Ссылка