JavaScript requestAnimationFrame() — плавна анімація на JavaScript


Метод requestAnimationFrame() викликає функцію перед наступним кадром — синхронно з частотою оновлення екрана.

автор: NagarD

Загальний опис

Анімація через setInterval(fn, 16) завжди трохи смикається: браузер малює кадри за своїм розкладом, а таймер б'є за своїм, і вони не збігаються.

requestAnimationFrame вирішує це в корені — браузер сам каже, коли збирається малювати. Звідси плавність, яку інакше не отримати.

І ще дві переваги, за які його люблять: у прихованій вкладці він зупиняється (не палить батарею намарно) і підлаштовується під екран із частотою 120 Гц, а не тримається за жорсткі 60.

Анімація будується рекурсивно: усередині обробника плануємо наступний кадр.

автор: NagarD

Порада

Обробник отримує час із моменту завантаження сторінки. Рахуй рух від нього, а не від номера кадру — інакше на екрані зі 120 Гц усе побіжить удвічі швидше.

автор: NagarD

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE Microsoft Internet Explorer
requestAnimationFrame 24+ 23+ 6.1+ 15+ 12+ 10+
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
requestAnimationFrame 4.4+ yes yes 7+

Приклади

+ запропонувати свій приклад у пісочниці

Плавний рух, прив'язаний до часу, а не до кількості кадрів.

HTML

<div id="box" style="width:50px;height:50px;background:#0172ad"></div>

JS

const box = document.getElementById('box');
let start = null;

function step(timestamp) {
    start ??= timestamp;

    const elapsed = timestamp - start;
    // 100px за секунду — незалежно від частоти екрана
    const x = Math.min(elapsed / 10, 300);

    box.style.transform = 'translateX(' + x + 'px)';

    if (x < 300) {
        requestAnimationFrame(step);
    }
}

requestAnimationFrame(step);
автор: NagarD

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід