| name | web-animation |
| description | Patterns et bonnes pratiques pour les animations JS (async/await pour algorithmes pas-à-pas, requestAnimationFrame pour mouvement continu). |
| keep_inline | true |
Skill : Web Animation & Visualizers (JS Vanilla)
⚠️ RÈGLE CRITIQUE — Animation pas-à-pas (algorithmes, tris, visualiseurs)
Pour un visualiseur d'algorithme (tri à bulles, pathfinding, etc.), tu DOIS utiliser
async/await avec une fonction sleep. C'est le SEUL pattern fiable pour un
modèle local — n'utilise JAMAIS setTimeout dans une boucle.
✅ PATTERN OBLIGATOIRE (async/await)
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function bubbleSort() {
let swapped = true;
while (swapped) {
swapped = false;
for (let i = 0; i < arr.length - 1; i++) {
bars[i].classList.add('comparing');
bars[i + 1].classList.add('comparing');
await sleep(speed);
if (arr[i] > arr[i + 1]) {
[arr[i], arr[i + 1]] = [arr[i + 1], arr[i]];
updateBar(i);
updateBar(i + 1);
swapped = true;
}
bars[i].classList.remove('comparing');
bars[i + 1].classList.remove('comparing');
}
}
bars.forEach(b => b.classList.add('sorted'));
}
❌ PATTERNS INTERDITS (causent une animation instantanée invisible)
while (swapped) {
setTimeout(() => swap(), delay);
}
for (let i = 0; i < arr.length; i++) {
setTimeout(() => draw(), delay);
}
while (swapped) {
doSwap();
}
🔄 Sync DOM — Obligatoire après chaque modification
Après chaque swap ou modification de donnée, tu DOIS mettre à jour l'affichage :
function updateBar(index) {
const bar = bars[index];
bar.style.height = (arr[index] / maxVal) * maxHeight + 'px';
}
Sans ça, les données sont triées en mémoire mais les barres ne bougent pas visuellement.
🎨 Init au chargement — Barres visibles immédiatement
Le tableau DOIT être généré ET affiché au chargement de la page :
generateArray();
draw();
Ressources détaillées (lecture optionnelle)
Pour aller plus loin (race conditions, requestAnimationFrame, state machines) :