Ce face requestAnimationFrame
requestAnimationFrame programează funcția o singură dată, sincronizată cu ecranul (de obicei de 60 de ori pe secundă). Pentru o animație continuă, funcția se programează din nou pe ea însăși. Primește un timp în milisecunde, util pentru a calcula cât s-a mișcat ceva.
Spre deosebire de setInterval, se oprește automat când fila nu este vizibilă, ceea ce economisește bateria. cancelAnimationFrame(id) anulează o programare.
Parametri
| Parametru | Descriere |
|---|---|
functie |
Primește timpul curent (DOMHighResTimeStamp). |
Ce returnează
Un id, folosit la cancelAnimationFrame.
Exemple
Exemplul 1: O bară de progres animată 2 secunde
Pe un ecran de 60 Hz; pe unul de 120 Hz, numărul de cadre se dublează.
const bara = document.querySelector(".progres");
let inceput = null;
let cadre = 0;
function pas(timp) {
inceput ??= timp;
const procent = Math.min((timp - inceput) / 2000, 1);
bara.style.width = `${procent * 100}%`;
cadre++;
if (procent < 1) requestAnimationFrame(pas);
else console.log("gata după", cadre, "cadre");
}
requestAnimationFrame(pas);
Rezultat în browser
gata după 121 cadre
Exemplul 2: Anulare
const id = requestAnimationFrame(() => console.log("nu apare"));
cancelAnimationFrame(id);
console.log("anulat", typeof id);
Rezultat în browser
anulat number
Greșeli frecvente
- Muți elementul cu o distanță fixă la fiecare cadru. Pe ecranele de 120 Hz animația merge de două ori mai repede; calculează poziția din timpul scurs.
Comenzi înrudite
Element.animate: Animă un element direct din JavaScript (Web Animations API), fără clase CSS.setTimeout / setInterval: Rulează o funcție după o pauză (setTimeout) sau în mod repetat, la intervale egale (setInterval).performance.now / mark / measure: Măsoară timpul cu precizie de fracțiuni de milisecundă, pentru a afla cât durează o operație.