I. Introduction

Avant de nous plonger tête baissée dans les exemples et le code, il est important de poser les bases.

Qu'est-ce qu'une transition et quand intervient-elle ?

Une transition est l'étape entre deux états. C'est indiquer comment on passe d'un état A à un état B. Par exemple, vous changez la couleur de fond d'un menu quand on le survole ? Et bien la transition intervient au moment du changement, entre le background: red; initial et background: blue; final.
Plus concrètement : si vous disposez d'un bloc avec une couleur de fond rouge et qu'au survol de celui-ci vous voulez qu'il soit bleu, le changement de couleur se fera directement. Avec les transitions, il est possible de changer la couleur progressivement. Voyez plutôt…

Oups ! Avant de continuer… Vous êtes sous Internet Explorer ? Je suis vraiment navré, mais la suite de cet article ne sera qu'une lecture à titre informatif. Ces propriétés ne sont pas encore prises en charge, même dans sa version 9.

II. Fini le blabla, place au code !

II-A. Tout part de là

Je pense que nous sommes au point sur le principe, voyons maintenant comment on le met en œuvre.

Voici les propriétés que nous allons voir dans la suite de cet article :

Nom Description Syntaxe
transition-property les propriétés CSS à transformer none | [ all | <IDENT> ] [ ‘,' [ all | <IDENT> ] ]*
transition-duration la durée de la transition <time> [, <time>]*
transition-delay le délai du départ de la transition <time> [, <time>]*
transition-timing-function le modèle d'interpolation (accélération, décélération…) [ ease | linear | ease-in | ease-out | ease-in-out | step-start | step-end | steps(<integer>[, [ start | end ] ]?) | cubic-bezier(<number>, <number>, <number>, <number>) ] [, [ ease | linear | ease-in | ease-out | ease-in-out | step-start | step-end | steps(<number>[, [ start | end ] ]?) | cubic-bezier(<number>, <number>, <number>, <number>) ] ]*

Sans oublier la propriété raccourcie : transition qui regroupe celles sus-citées.

Firefox a besoin d'une version préfixée (-moz-transition-*) et ce depuis la version 12. Idem pour Chrome et Safari (WebKit oblige), préfixe (-webkit-transition-*) depuis la version 20 pour Google et 5.1 pour Apple. Enfin, Opera, pour qui il faut le préfixe -o depuis la version 12.

Pour des raisons de clarté et de lecture, les exemples ci-dessous ne seront pas préfixés. À vous de vous assurer de la compatibilité de ces sources avec votre navigateur.


Entrons dans le vif du sujet avec ceci :

 
Sélectionnez
  1. <!doctype html> 
  2. <head> 
  3.     <title>Les transitions ? C'est trop la classe !</title> 
  4.     <meta charset="utf-8" /> 
  5.     <style type="text/css"> 
  6.     div { 
  7.         width: 300px; 
  8.         height: 200px; 
  9.         line-height: 200px; 
  10.         text-align: center; 
  11.         background-color: silver; 
  12.         border-radius: 20px; 
  13.         color: white; 
  14.         font-weight: bold; 
  15.         text-shadow: 1px 1px 2px black; 
  16.   
  17.         /* Seuls la couleur de fond et les arrondis seront affectés par la transition */ 
  18.         transition-property: background-color, border-radius; 
  19.   
  20.         /* La transition se fera en une seconde */ 
  21.         transition-duration: 1s; 
  22.     } 
  23.   
  24.     div:hover { 
  25.         background-color: #4282b4; 
  26.         border-radius: 60px; 
  27.         color: yellow; 
  28.     } 
  29.     </style> 
  30.   
  31.     <script type='text/javascript'> 
  32.   
  33.     </script> 
  34. </head> 
  35. <body> 
  36.     <header> 
  37.     </header> 
  38.   
  39.     <article> 
  40.         <div><p>Un beau bloc avec des bords arrondis</p></div> 
  41.     </article> 
  42.   
  43.     <footer> 
  44.     </footer> 
  45. </body> 
  46. </html> 

Bon, ici, rien d'extraordinaire ; une petite page en HTML 5 avec un <title> « très recherché » et un bloc gris arrondi grâce à la propriété CSS3 border-radius avec du texte ombré par text-shadow.

Côté transition maintenant : vous avez remarqué que dans le :hover de la div je souhaite changer la couleur de fond et du texte, ainsi que le rayon du cercle du border-radius. Jusque-là, rien de nouveau. Sauf que si vous essayez, vous vous rendrez compte que tous ces changements se font progressivement.

Essayez, vous verrez !

Hop hop hop ! La couleur du texte elle, elle change instantanément ! C'est quoi ces histoires ?

Allez, on décortique pour que vous compreniez bien l'utilisation de ces propriétés.

Si le changement de la couleur du texte n'est pas progressif, c'est tout simplement parce que la propriété color n'est pas référencée dans cette déclaration :

 
Sélectionnez
  1. transition-property: background-color, border-radius; 

Si j'avais ajouté color dans cette déclaration, alors le changement aurait été gradué. Faites le test et vous en aurez la preuve. Si vous voulez que tout change avec une transition, il faut mettre : transition-property: all. À l'inverse, si vous ne souhaitez rien animer, remplacez all par none.

Ensuite, nous avons transition-duration: 1s. Rien de compliqué ici puisque nous voulons que le changement de couleur de fond et des bordures se fasse en une seconde. Je laisse votre curiosité faire le reste au sujet de cette propriété.

Attention quand même, par défaut, la durée de l'animation est à zéro. Et si c'est à zéro, bah y a pas d'animation ! Et ce n'est pas ce que l'on souhaite.

Voici la liste des propriétés pouvant être animées, donnée par le W3C (http://www.w3.org/TR/css3-transitions/):

II-B. Laissons le temps au temps

Comme vous le savez, parce que vous venez juste de le lire, il est possible de définir quand la transition va avoir lieu en utilisant transition-delay.

Le même exemple mais avec effet retardé :

 
Sélectionnez
  1. <!doctype html> 
  2. <html lang="fr"> 
  3. <head> 
  4.   <meta charset="utf-8"> 
  5.   <title>Les transitions ? C'est trop la classe !</title> 
  6.   <style type="text/css"> 
  7.   div { 
  8.     width: 300px; 
  9.     height: 200px; 
  10.     padding-top: 10px; 
  11.     text-align: center; 
  12.     background-color: silver; 
  13.     border-radius: 20px; 
  14.     color: white; 
  15.     font-weight: bold; 
  16.     text-shadow: 1px 1px 2px black; 
  17.     font-size: 30px; 
  18.   
  19.     /* Seuls la couleur de fond et les arrondis seront affectés par la transition */ 
  20.     transition-property: background, border-radius; 
  21.   
  22.           /* La transition se fera en une seconde */ 
  23.           transition-duration: 1s; 
  24.   
  25.     /* On retarde le lancement de la transition d'une seconde */ 
  26.     transition-delay: 1000ms; 
  27.   } 
  28.   
  29.   div:hover { 
  30.     background: #4282b4; 
  31.     border-radius: 60px; 
  32.     color: yellow; 
  33.   } 
  34.   </style> 
  35. </head> 
  36. <body> 
  37.   <header></header> 
  38.   <section> 
  39.     <div><p>Un beau bloc avec des bords arrondis</p></div> 
  40.   </section> 
  41.   <footer></footer> 
  42. </body> 
  43. </html> 

Ça se passe par ici pour essayer !

On se rend compte que l'animation se déclenche 1000 ms (oui j'ai eu le temps de compter, pas vous ?) après le survol de la div.

Cette propriété accepte deux unités de temps pour sa valeur : la seconde notée "s" et la milliseconde "ms".

II-C. C'est quand qu'on arrive ?

Passons maintenant à une des propriétés les plus intéressantes, j'ai nommé: transition-timing-function!
Je vais m'adresser un petit temps aux personnes utilisant jQuery UI. Je pense que vous avez déjà utilisé ou au moins entendu parler de Easing http://jqueryui.com/resources/demos/effect/easing.html ? Non ? Boh, ce n'est pas grave, on peut s'en passer maintenant !

Voici lesdites options :

  • linear : vitesse de transition constante ;
  • ease : vitesse rapide au début et décélère sur la fin. Valeur par défaut ;
  • ease-in : accélération constante ;
  • ease-out : décélération constante ;
  • ease-in-out : vitesse de départ et de fin lente ;
  • cubic-bezier(x, x, x, x) : pour les plus matheux d'entre vous, voici la courbe de Bézier. En gros, vous passez quatre paramètres acceptant des valeurs de 0 à 1. Un petit coup de pouce pour rédiger votre courbe de Bézier : http://matthewlein.com/ceaser/.

Mis en situation, cela donne :

 
Sélectionnez
  1. <!doctype html> 
  2. <head> 
  3.     <title>Les transitions ? C'est trop la classe !</title> 
  4.     <meta charset="utf-8" /> 
  5.     <style type="text/css"> 
  6.     div { 
  7.         float: left; 
  8.         width: 150px; 
  9.         height: 50px; 
  10.         line-height: 50px; 
  11.         text-align: center; 
  12.         background-color: silver; 
  13.         border-radius: 10px; 
  14.         color: white; 
  15.         font-size: 12px; 
  16.         font-weight: bold; 
  17.         text-shadow: 1px 1px 2px black; 
  18.         margin-bottom: 10px; 
  19.         margin-right: 20px; 
  20.         transition-property: height, line-height; 
  21.         transition-duration: 2s; 
  22.     } 
  23.   
  24.     #div1 { 
  25.         transition-timing-function: ease; 
  26.     } 
  27.     #div2 { 
  28.         transition-timing-function: ease-in; 
  29.     } 
  30.     #div3 { 
  31.         transition-timing-function: ease-out; 
  32.     } 
  33.     #div4 { 
  34.         transition-timing-function: ease-in-out; 
  35.     } 
  36.     #div5 { 
  37.         transition-timing-function: linear; 
  38.     } 
  39.     #div6 { 
  40.         transition-timing-function: cubic-bezier(0.680, 0.550, 0.265, 1.000); 
  41.     } 
  42.   
  43.     button { 
  44.         margin-bottom: 10px; 
  45.         margin-right: 10px; 
  46.     } 
  47.     </style> 
  48.   
  49.     <script type='text/javascript'> 
  50.     function go() { 
  51.         for ( var i = 1;  i < 7; i++ ){ 
  52.             document.getElementById('div' + i).style.height = "200px"; 
  53.             document.getElementById('div' + i).style.lineHeight = "200px"; 
  54.         } 
  55.     } 
  56.     function dego() { 
  57.         for ( var i = 1;  i < 7; i++ ){ 
  58.             document.getElementById('div' + i).style.height = "50px"; 
  59.             document.getElementById('div' + i).style.lineHeight = "50px"; 
  60.         } 
  61.     } 
  62.     </script> 
  63. </head> 
  64. <body> 
  65.     <header> 
  66.     </header> 
  67.   
  68.     <article> 
  69.         <p><button onclick="go();">Partez !</button><button onclick="dego();">Mais pas si vite !</button></p> 
  70.         <div id="div1">Fonction : EASE</div> 
  71.         <div id="div2">Fonction : EASE-IN</div> 
  72.         <div id="div3">Fonction : EASE-OUT</div> 
  73.         <div id="div4">Fonction : EASE-IN-OUT</div> 
  74.         <div id="div5">Fonction : LINEAR</div> 
  75.         <div id="div6">Fonction : CUBIC-BEZIER</div> 
  76.     </article> 
  77.   
  78.     <footer> 
  79.     </footer> 
  80. </body> 
  81. </html> 

3 2 1 Partez !

Alors comme vous pouvez le constater, il y a du JavaScript. Il n'est là que pour lancer les transitions et n'est pas du tout obligatoire.
Vous noterez au passage la puissance de la fonction cubic-bezier. Avec l'aide d'un générateur, les animations seront du plus bel effet (ou avec de la chance en mettant des valeurs aléatoires).

Bref, vous savez faire des transitions ! Ce n'est pas si sorcier et ça apporte un joli plus à votre page Web. Attention toutefois à ne pas tomber dans l'excès.

II-D. Prenons un raccourci

Comme la plupart du temps en CSS, il existe des propriétés raccourcies. Elles combinent plusieurs autres propriétés telles que font, border, background, transition…

Oh bah tiens ! Comme par hasard je parle de transition dans cet article ! Ça tombe bien ça dit donc !?

Reprenons notre exemple :

 
Sélectionnez
  1. <!doctype html> 
  2. <head> 
  3.     <title>Les transitions ? C'est trop la classe !</title> 
  4.     <meta charset="utf-8" /> 
  5.     <style type="text/css"> 
  6.     div { 
  7.         width: 300px; 
  8.         height: 200px; 
  9.         line-height: 200px; 
  10.         text-align: center; 
  11.         background-color: silver; 
  12.         border-radius: 20px; 
  13.         color: white; 
  14.         font-weight: bold; 
  15.         text-shadow: 1px 1px 2px black; 
  16.   
  17.         transition: border-radius 1s ease-in-out, background-color 500ms cubic-bezier(0.680, 0.550, 0.265, 1.000) 500ms; 
  18.     } 
  19.   
  20.     div:hover { 
  21.         background-color: #4282b4; 
  22.         border-radius: 60px; 
  23.         color: yellow; 
  24.     } 
  25.     </style> 
  26.   
  27.     <script type='text/javascript'> 
  28.   
  29.     </script> 
  30. </head> 
  31. <body> 
  32.     <header> 
  33.     </header> 
  34.   
  35.     <article> 
  36.         <div><p>Un beau bloc avec des bords arrondis</p></div> 
  37.     </article> 
  38.   
  39.     <footer> 
  40.     </footer> 
  41. </body> 
  42. </html> 

C'est par ici que ça se passe pour l'exemple.

On regroupe donc toutes les propriétés que l'on a vues jusqu'à maintenant en respectant la syntaxe donnée en début d'article.

Vous aurez également remarqué que j'ai séparé par une virgule les transitions par propriété à animer.

III. L'exemple en plus

Vous trouverez ici un exemple, basique, de menu avec un hover animé par une transition.

Ainsi qu'un avant-goût du prochain article à venir sur les transformations.

Par ici je vous prie.

IV. Conclusion et remerciements

Vous savez maintenant ce qu'est une transition et comment elle se déclare. Comme je l'ai évoqué et que vous l'avez certainement vu dans mon dernier exemple, nous verrons dans un prochain chapitre l'utilisation des transformations. En espérant que vous avez fait bonne lecture.

Je tiens à remercier zoom61 et FirePrawn pour leur relecture technique, ainsi que FirePrawn, encore, pour sa relecture orthographique.