Menu

Transition CSS : propriété, durée, courbe et délai

Une transition CSS anime une propriété de son ancienne valeur vers la nouvelle quand elle change, par exemple au survol. Découvrez le raccourci transition, toutes les fonctions de temporisation côte à côte, ce qui peut ou non être animé, l'astuce pour height: auto, et la réduction des animations.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

Une transition en un exemple

Une transition dit au navigateur : quand cette propriété change, anime-la pendant ce temps au lieu de basculer d'un coup. Placez-la sur la règle normale de l'élément, pas seulement sur :hover :

Survolez le premier bouton : sa couleur passe progressivement au vert et il monte de 4px en 0,4 seconde, et quand le pointeur s'en va, la même transition se joue en sens inverse. Le second bouton a transition: none et change instantanément. Les utilisateurs du clavier obtiennent le même effet via :focus-visible.

Le raccourci transition

transition: background-color 0.3s ease-in-out 0.1s;
/*          property         duration timing    delay */
Propriété détailléeCe qu'elle définitPar défaut
transition-propertyquelles propriétés sont animées (all, ou une liste)all
transition-durationcombien de temps, en s ou ms0s
transition-timing-functionla courbe de vitesseease
transition-delayl'attente avant le départ (peut être négative)0s

La durée par défaut est 0s, c'est pourquoi rien n'est animé tant que vous n'en définissez pas une. Dans le raccourci, la première durée est toujours la durée de l'animation et la seconde le délai. Pour des réglages différents selon la propriété, séparez-les par des virgules :

.card {
  transition: transform 0.2s ease-out, box-shadow 0.4s ease-out;
}

Les fonctions de temporisation côte à côte

La fonction de temporisation décide comment la vitesse évolue pendant la transition. Appuyez sur Play : les sept barres parcourent la même distance dans les mêmes 1,5 seconde :

Fonction de temporisationRessenti
linearvitesse constante, mécanique
ease (par défaut)départ rapide, arrêt en douceur
ease-indépart lent, fin rapide : bien pour ce qui s'en va
ease-outdépart rapide, fin lente : bien pour ce qui arrive
ease-in-outlent aux deux extrémités
cubic-bezier(x1, y1, x2, y2)votre propre courbe ; un y supérieur à 1 dépasse la cible puis revient
steps(n)avance par n sauts égaux, sans images intermédiaires

Pour les effets de survol et les menus, ease-out avec une durée entre 150ms et 300ms donne une sensation de réactivité.

Ce qui peut être animé

Les propriétés qui ont des valeurs intermédiaires peuvent être animées : couleurs, longueurs (width, padding, margin), opacity, transform, box-shadow, border-radius, filter, background-color. Les propriétés qui sautent d'un mot-clé à l'autre, comme display ou font-family, changent d'un coup.

height: auto est le cas le plus fréquent : un panneau qui s'ouvre de height: 0 à height: auto n'est pas animé par défaut, car le navigateur ne calcule pas les valeurs entre 0 et « auto ». Une solution fiable est un conteneur grid dont l'unique ligne passe de 0fr à 1fr :

aria-expanded indique aux utilisateurs de lecteurs d'écran si le panneau est ouvert, ce que l'animation seule ne dit pas.

Exécuter du code à la fin d'une transition

L'événement transitionend se déclenche à la fin d'une transition, une fois par propriété. Utilisez-le pour agir après le mouvement, par exemple déplacer le focus ou retirer un élément :

Respecter la réduction des animations

Certaines personnes activent « réduire les animations » dans les réglages de leur système, car le mouvement à l'écran leur donne le vertige ou les distrait. Gardez les fondus de couleur et d'opacité, et supprimez les grands mouvements, avec une media query :

@media (prefers-reduced-motion: reduce) {
  .btn { transition: background-color 0.2s ease; } /* no movement, only the color */
}

Des transitions fluides

transform et opacity sont les propriétés les moins coûteuses à animer : le navigateur peut déplacer et estomper un élément sans recalculer la mise en page. Animer width, height, top ou margin oblige le navigateur à recalculer la mise en page à chaque image, ce qui peut saccader sur les téléphones lents. Pour déplacer un élément, préférez transform: translate() à left ou margin. La page transform présente les fonctions.

Erreurs courantes

  • transition uniquement dans la règle :hover. L'effet est animé à l'aller mais revient d'un coup à la fin du survol. Placez transition sur la règle de base.
  • Une durée sans unité. transition: opacity 300 est invalide. Écrivez 300ms ou 0.3s.
  • transition: all. Cela anime toutes les propriétés qui changent, y compris celles que vous ne vouliez pas animer, et peut ralentir les changements de mise en page. Listez les propriétés.
  • Attendre de display: none un fondu. display change d'un coup. Estompez plutôt opacity (et passez à visibility: hidden à la fin du fondu).
  • Une transition vers height: auto. Elle saute. Utilisez la technique grid-template-rows ci-dessus.
  • Des durées longues sur de petites interactions. Au-delà d'environ 400ms sur un bouton ou un menu, l'effet paraît lent.

Questions fréquentes

Comment fonctionnent les transitions CSS ?

Vous déclarez sur un élément quelles propriétés doivent être animées et pendant combien de temps, par exemple transition: background-color 0.3s ease;. Quand la valeur de cette propriété change (via :hover, une classe ou JavaScript), le navigateur anime le passage de l'ancienne valeur à la nouvelle au lieu de basculer d'un coup.

Dans quel ordre sont les valeurs du raccourci transition ?

transition: property duration timing-function delay;, par exemple transition: opacity 0.3s ease-in 0.1s;. La seule règle stricte est que la première durée est la durée de l'animation et la seconde le délai. Séparez plusieurs transitions par des virgules.

Pourquoi ma transition CSS ne fonctionne-t-elle pas ?

Causes fréquentes : la transition n'est que dans la règle :hover (l'animation se fait à l'aller et revient d'un coup), la propriété ne peut pas être animée (display, ou height vers auto), la durée n'a pas d'unité (0.3 au lieu de 0.3s), ou la valeur change au moment même où l'élément est ajouté à la page.

Peut-on animer height: auto avec une transition ?

Pas avec une simple transition de height dans tous les navigateurs : interpoler vers auto demande la propriété plus récente interpolate-size, qui n'est pas encore prise en charge partout. Les solutions courantes sont d'animer grid-template-rows de 0fr à 1fr sur un conteneur grid, ou d'animer max-height vers une valeur plus grande que le contenu.

Quelle est la différence entre transition et animation en CSS ?

Une transition s'exécute une fois, entre deux valeurs, quand une propriété change. Une animation utilise @keyframes, peut avoir de nombreuses étapes, démarre seule au chargement de la page et peut se répéter ou tourner en boucle.

Coddy programming languages illustration

Apprendre à coder avec Coddy

COMMENCER