Aller au contenu
M04 · C. Mettre en forme une page web avec les feuilles de style CSS

Animer avec CSS : transitions, transformations et keyframes

Adoucir un changement d'état avec transition, déplacer, agrandir ou tourner un élément avec transform, et créer une animation en plusieurs étapes avec @keyframes.

1Situer

Une pâtisserie de Tétouan veut que ses cartes de gâteaux se soulèvent doucement au survol, que le bouton « Commander » grossisse légèrement et qu'un petit logo tourne pendant le chargement. Ces effets donnent une impression de qualité, et le CSS les fait seul, sans une ligne de JavaScript.

2Comprendre

@keyframes : les images clés d'une animation
@keyframes rebond {   0% { translateY(0) }   50% { translateY(120px) }   100% { translateY(0) } } .balle { animation:   rebond 1s infinite; } sol 0 %, 100 % 50 %

On décrit une animation rebond par ses images clés : au début (0 %), au milieu (50 %) et à la fin (100 %).

1 / 5

Les transitions

Une transition anime le passage d’une valeur à une autre quand l’état change (survol, focus, classe ajoutée).

.carte {
  transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.carte:hover {
  transform: translateY(-6px);
  box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
}

On écrit la transition sur l’élément au repos, pas sur :hover : ainsi l’effet joue à l’aller et au retour.

Courbes de vitesse : linear (constante), ease (par défaut), ease-in (démarre lentement), ease-out (finit lentement), ease-in-out.

Les transformations

FonctionEffet
translate(x, y)déplacer
scale(1.1)agrandir (ou réduire avec moins de 1)
rotate(45deg)tourner
skew(10deg)incliner

Elles se combinent : transform: translateY(-4px) scale(1.05);.

Les animations @keyframes

On décrit les images clés, puis on applique l’animation :

@keyframes tourner {
  from { transform: rotate(0deg); }
  to   { transform: rotate(360deg); }
}

.logo {
  animation-name: tourner;
  animation-duration: 2s;
  animation-timing-function: linear;
  animation-iteration-count: infinite;
  /* ou en une ligne : animation: tourner 2s linear infinite; */
}

Avec modération

Une animation doit aider : montrer qu’un bouton est cliquable, attirer l’œil sur un message. Trop d’effets fatiguent. Certains visiteurs demandent à leur système de réduire les animations ; on le respecte avec @media (prefers-reduced-motion: reduce) { ... }.

Exemple simple

La porte automatique

Une porte qui claque d'un coup surprend ; une porte automatique s'ouvre en une seconde, en douceur. transition transforme un changement brutal (au survol) en mouvement fluide.

.bouton { background: #c0392b; transition: background 0.3s ease; }
.bouton:hover { background: #8e2a1f; }
Exemple simple

Le dessin animé image par image

Un dessin animé, ce sont des images clés : au début le ballon est en haut, au milieu il touche le sol, à la fin il est remonté. @keyframes décrit ces images clés, le navigateur dessine les étapes intermédiaires.

@keyframes rebond {
  0%   { transform: translateY(0); }
  50%  { transform: translateY(40px); }
  100% { transform: translateY(0); }
}

3Manipuler

Passez la souris sur la carte et sur le bouton : rien ne bouge. Ajoutez les effets dans style.css, puis survolez à nouveau.
Ouvrir dans le lab ↗
  • Adoucissez le mouvement de la carte (transition sur .carte)
  • Faites grossir le bouton au survol (.bouton:hover avec transform: scale(1.1)), avec une transition
  • Créez une animation @keyframes tourner et appliquez-la au .logo (animation-name)
  • Faites-la tourner en boucle (animation-iteration-count: infinite)

4Pratiquer

Exercice 1 · La rotation complète

Écrivez l'animation qui fait tourner le logo sur lui-même en 2 secondes, à vitesse constante, sans arrêt.

Voir le corrigé
@keyframes tourner {
  from { transform: rotate(0deg); }
  to   { transform: rotate(360deg); }
}
.logo {
  animation: tourner 2s linear infinite;
}

Exercice 2 · Lire une transition

Expliquez chaque valeur : transition: transform 0.4s ease-in-out 0.1s;

Voir le corrigé
transform    : la propriété animée
0.4s         : la durée
ease-in-out  : la courbe (lent au début et à la fin)
0.1s         : le délai avant de commencer

Exercice 3 · Le message qui apparaît

Écrivez une animation apparition qui fait passer un message d'invisible (opacity 0, 20px plus bas) à visible et à sa place, en 0,6 s, une seule fois.

Voir le corrigé
@keyframes apparition {
  from { opacity: 0; transform: translateY(20px); }
  to   { opacity: 1; transform: translateY(0); }
}
.message { animation: apparition 0.6s ease-out; }

5Vérifier

1. Quelle est la différence entre transition et animation ?
2. Que fait transform: scale(1.2) ?
3. Pourquoi préférer animer transform et opacity plutôt que width ou margin ?