Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu
Budowanie niewielkiej pętli animacji, aktualizowanie zależne od czasu (delta), symulowanie requestAnimationFrame i dodawanie prostego easing
Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu to bezpłatna lekcja JavaScript Academy na CoddyKit. To lekcja 3 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej JavaScript Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs JavaScript Academy zawiera 3 lekcji w sumie.
Po co animacja oparta na czasie?
Cel: sterować płynnym ruchem za pomocą aktualizacji zależnych od czasu.
- Symulowanie requestAnimationFrame
- Mierzenie czasu delta
- Poruszanie się z prędkością jednostek na sekundę
- Dodanie niewielkiego easing

Symulowane rAF
Nie ma tu DOM, dlatego symulujemy requestAnimationFrame za pomocą setTimeout uruchamianego mniej więcej co 16 ms.
// requestFrame: simulate ~60 FPS with setTimeout
function requestFrame(fn) {
// ~16ms between frames for ~60fps
return setTimeout(function () { fn(Date.now()); }, 16);
}
function cancelFrame(id) {
clearTimeout(id);
}
// Tiny demo: schedule one frame
requestFrame(function (ts) {
console.log("frame at", ts);
});

Podstawy czasu delta
W każdej klatce należy obliczyć czas delta: (now − last) / 1000. Dzięki temu ruch jest skalowany względem rzeczywistego czasu.
// Time-based loop: compute delta time in seconds
let running = true;
let last = Date.now();
function loop() {
if (!running) { return; }
const now = Date.now();
const dt = (now - last) / 1000; // seconds
last = now;
// Print a tiny delta preview
console.log("dt", dt.toFixed(3), "s");
requestFrame(loop);
}
// Start the loop and stop after a few frames
loop();
setTimeout(function () {
running = false;
console.log("stop");
}, 60);

Jednostki na sekundę
Należy użyć speed × dt do aktualizowania pozycji, aby ruch pozostał spójny niezależnie od częstotliwości wyświetlania klatek.
// Move with a speed in units/second
let x = 0; // position
const speed = 50; // units per second
let lastT = Date.now();
let frames = 0;
function moveLoop() {
const now = Date.now();
const dt = (now - lastT) / 1000;
lastT = now;
// Distance = speed * time
x = x + speed * dt;
frames = frames + 1;
console.log("x", Math.round(x));
if (frames < 5) {
requestFrame(moveLoop);
} else {
console.log("final x", Math.round(x));
}
}
moveLoop();

Krótki przykład easing
Easing kształtuje krzywą. W tym przykładzie easeOutQuad rozpoczyna się szybko, a pod koniec zwalnia.
// Ease from 0 to 1 over duration using easeOutQuad
function easeOutQuad(t) {
// t in [0,1]
return 1 - (1 - t) * (1 - t);
}
async function tween(durationMs) {
let start = Date.now();
let id = null;
function step() {
const now = Date.now();
const t = Math.min(1, (now - start) / durationMs);
const eased = easeOutQuad(t);
console.log("eased", eased.toFixed(2));
if (t < 1) {
id = requestFrame(step);
} else {
cancelFrame(id);
console.log("done");
}
}
step();
}
tween(60);

Próba użycia stałego kroku
Stały krok może ustabilizować logikę; accumulator nadrabia zaległości, jeśli klatka pojawi się z opóźnieniem.
// Fixed-step taste: step a physics tick and catch up using an accumulator
let acc = 0; // accumulated time
const step = 1 / 30; // 30 FPS fixed step in seconds
let lastTime = Date.now();
let value = 0;
let fixedFrames = 0;
function fixedLoop() {
const now = Date.now();
const dt = (now - lastTime) / 1000;
lastTime = now;
acc = acc + dt;
// Run zero or more fixed steps to catch up
while (acc >= step) {
// Update logic at a fixed rate
value = value + 1; // pretend physics
acc = acc - step;
}
console.log("value", value);
fixedFrames = fixedFrames + 1;
if (fixedFrames < 5) {
requestFrame(fixedLoop);
} else {
console.log("fixed stop");
}
}
fixedLoop();

Quiz: delta kontra stały krok
Szybkie sprawdzenie: po co używać czasu delta?

Podsumowanie
Podsumowanie: zasymulowano rAF za pomocą setTimeout, mierzono czas delta, poruszano obiektem z prędkością jednostek na sekundę, dodano ease-out oraz poznano stały krok z użyciem akumulatora.

Często zadawane pytania
Czy lekcja „Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu” jest bezpłatna?
Tak — pełny tekst „Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu JavaScript Academy, przejdź na CoddyKit PRO. Kurs JavaScript Academy zawiera 3 lekcji w sumie.
Co nauczysz się w „Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu”?
Budowanie niewielkiej pętli animacji, aktualizowanie zależne od czasu (delta), symulowanie requestAnimationFrame i dodawanie prostego easing Ćwiczysz JavaScript Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć JavaScript Academy?
Nie wymagamy żadnego doświadczenia. JavaScript Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 3.
Ile czasu zajmuje lekcja „Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji JavaScript Academy?
Tak. Każda lekcja JavaScript Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- setTimeout, setInterval i dryf czasomierza
- Debounce a throttle — implementacja od podstaw
- Synchronizacja animacji — wprowadzenie do pętli zależnych od czasu