Animations CSS
Les transitions ont appris A → B sur un déclencheur. Les transforms ont appris où va la boîte peinte. Les animations écrivent une chronologie : faire pulser un point de statut, faire tourner un loader sans fin, faire entrer des cartes en décalé — avec @keyframes pour les étapes et animation pour les lancer.
Ce qu’est une animation
Une animation a deux parties : un jeu de keyframes nommé (@keyframes) qui liste les styles à des pourcentages (ou from / to), et une règle qui joue ce nom avec une durée, un délai optionnel, un nombre d’itérations, une direction, une fonction de timing et un fill-mode. Le navigateur interpole entre les arrêts keyframe.
La correspondance des noms est stricte : animation-name: pulse ne tourne que si @keyframes pulse existe. Renommez l’un sans l’autre et rien ne bouge.
Les contrôles d’animation en bref
📊 Pièces essentielles de l’animation
| Pièce | Rôle |
|---|---|
@keyframes name { … } |
Chronologie des valeurs de propriétés à % / from / to |
animation-name |
Quel jeu de keyframes jouer |
animation-duration |
Durée d’un cycle (s ou ms) |
animation-timing-function |
Easing dans le cycle (ease, linear, …) |
animation-delay |
Attente avant le premier cycle |
animation-iteration-count |
Nombre de cycles (number ou infinite) |
animation-direction |
normal, reverse, alternate, alternate-reverse |
animation-fill-mode |
Styles avant/après (none, forwards, backwards, both) |
animation shorthand |
name → duration → timing → delay → iteration → direction → fill-mode (ordre courant) |
Vous n’avez rarement besoin de tous les longhands à la fois. Commencez par name + duration ; ajoutez infinite pour les loaders, alternate pour un rebond aller-retour, et forwards quand la dernière keyframe doit rester.
Première chronologie — un pulse calme
Opacity et transform restent paint-friendly. Un pulse doux est un classique pour le premier @keyframes.
@keyframes pulse {
0%,
100% {
opacity: 1;
transform: scale(1);
}
50% {
opacity: 0.55;
transform: scale(0.92);
}
}
.status-dot {
display: inline-block;
width: 0.75rem;
height: 0.75rem;
border-radius: 50%;
background: #16a34a;
animation: pulse 1.4s ease-in-out infinite;
}
0% et 100% correspondent pour que la boucle se raccorde proprement. infinite fait tourner le cycle — bien pour un petit indicateur de statut, bruyant si vous animez tout le hero de la page.
Rotation infinie — les loaders aiment linear
Une rotation avec linear et infinite se lit comme un spinner continu. Prévoyez un repli reduced-motion qui cache ou fige la rotation.
@keyframes spin {
to {
transform: rotate(360deg);
}
}
.loader {
width: 2rem;
height: 2rem;
border: 3px solid #e5e7eb;
border-top-color: #2563eb;
border-radius: 50%;
animation: spin 0.8s linear infinite;
}
@media (prefers-reduced-motion: reduce) {
.loader {
animation: none;
border-top-color: #e5e7eb;
}
}
to est le raccourci de 100%. Partir du 0% par défaut (sans transform) suffit quand seule la fin du tour compte.
Délai et stagger — mêmes keyframes, départs différents
Un même jeu de keyframes peut animer plusieurs éléments. Décalez avec animation-delay pour qu’une liste paraisse séquentielle sans écrire trois animations différentes.
@keyframes fade-up {
from {
opacity: 0;
transform: translateY(0.75rem);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.reveal-list li {
opacity: 0;
animation: fade-up 0.45s ease forwards;
}
.reveal-list li:nth-child(1) { animation-delay: 0s; }
.reveal-list li:nth-child(2) { animation-delay: 0.08s; }
.reveal-list li:nth-child(3) { animation-delay: 0.16s; }
forwards garde les styles de la keyframe finale après la fin du cycle — sans ça, les items peuvent revenir d’un coup à opacity: 0 de la règle de base. C’est là que animation-fill-mode fait vraiment le travail.
Fill-mode sur une entrée unique
Les entrées en mouvement tournent souvent une seule fois. Le fill-mode décide si les styles s’appliquent avant le délai et après la dernière image.
@keyframes card-in {
from {
opacity: 0;
transform: translateY(1rem) scale(0.98);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}
.card-enter {
animation: card-in 0.5s ease 0.1s both;
}
Raccourci ici : name card-in, duration 0.5s, easing ease, delay 0.1s, fill-mode both. both applique la première keyframe pendant le délai et retient la dernière ensuite.
Direction, play state, et quand ne pas animer
animation-direction: alternate fait tourner les cycles impairs en avant et les pairs en arrière — pratique pour un léger bounce sans dupliquer les keyframes. animation-play-state: paused fige une animation en cours (utile pour mettre en pause au survol sur des boucles décoratives).
Pour un simple changement de couleur au survol, gardez les transitions. Passez aux animations quand il faut des boucles, des histoires en plusieurs étapes, ou un mouvement qui ne dépend pas d’un seul basculement d’état. Privilégiez transform et opacity dans les keyframes ; animer width, height ou top coûte plus cher et fait souvent trembler le layout.
À essayer
- Construisez un pulse à trois arrêts (
0%/50%/100%) sur l’opacity seule ; ajoutez ensuite un petitscale. - Faites un spinner avec
spin+linear+infinite; passez àeaseet notez l’effet irrégulier. - Décalez trois badges avec les mêmes keyframes
fade-upet des delays0s,0.1s,0.2s— comparez avec et sansforwards. - Utilisez le raccourci
animation: card-in 0.5s ease 0.15s bothsur un panneau ; retirezbothet observez le snap-back. - Sous
prefers-reduced-motion: reduce, mettezanimation: none(ou un court fade unique) sur les boucles décoratives.
Erreurs fréquentes
- Attendre qu’un fade A→B au survol « boucle » — c’est le terrain de l’animation, pas d’une transition seule
- Faute de frappe entre
animation-nameet le nom@keyframes— silence total, aucun mouvement infinitesur de grandes zones très visibles sans pause ni chemin reduced-motion- Animer des propriétés de layout (
width,margin,top) alors que transform/opacity suffiraient - Oublier
forwards/bothsur des révélations one-shot qui partent deopacity: 0dans la règle de base
Résumé
@keyframesdéfinissent la chronologie ;animation(ou longhands) la joue- Itération, direction, délai et fill-mode pour boucles, rebond, stagger et fins qui restent
- Préférez transform/opacity ; respectez prefers-reduced-motion sur le mouvement décoratif
- Transitions pour les changements d’état simples ; animations pour le multi-étapes et le répétitif
- Suite dans Effects & Motion : CSS Filters
🧠 Testez Vos Connaissances
Testez Vos Connaissances
Mettez-vous au défi avec ce quiz interactif et voyez à quel point vous comprenez le sujet
📝 Instructions
- Lisez chaque question attentivement
- Sélectionnez la meilleure réponse pour chaque question
- Vous pouvez refaire le quiz autant de fois que vous le souhaitez
- Votre progression sera affichée en haut