đ©âđ« CSS 8 : Animations
- Comment utiliser la transition CSS
- Transformer les boßtes avec la propriété transform
- Comment utiliser les animations CSS
- Respecter les recommandations :def[A11Y]{value="Accessibility"}
Introduction
Dans le passé, faire des animations sur un site web nécessitait l'utilisation de JavaScript en utilisant la manipulation du DOM.
Aujourd'hui, il est possible de faire des animations en CSS, qui sont plus légÚres et plus faciles à réaliser.
Dans cette quĂȘte, tu apprendras ce que sont les animations en CSS et comment les utiliser.
Sais-tu que tu peux faire de l'animation en utilisant du CSS pur ? Sans avoir à utiliser JavaScript, tu peux rendre ton site web plus interactif et plus agréable !
Voyons les différentes méthodes que nous pouvons utiliser !
La premiĂšre est la plus facile et s'appelle CSS transition. Imaginons que tu aies une image et que tu veuilles l'animer au survol.
Prenons ce code, par exemple :
.dog-img{
width:200px;
}
.dog-img:hover{
width:500px;
}
!--- index.html
<!DOCTYPE html>
<html>
<head>
<title>Parcel Sandbox</title>
<meta charset="UTF-8" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
<h1>Animate the image on hover</h1>
<img src="images/004-introduction.jpg" alt="" class="dog-img" />
</body>
</html>
!--- style.css
.dog-img {
width: 500px;
}
.dog-img:hover {
width: 550px;
}
!--- index.js
import "./style.css";
Comme tu peux le voir quand tu survoles l'image, la transition n'est pas vraiment douce, n'est-ce pas ?
Pour donner de la fluidité d'une taille à l'autre, on peut utiliser la transition CSS. La transition CSS ressemble à ça :
element{
transition: <property> <duration> <curve>;
}
- Le premier paramÚtre est la propriété que tu veux animer. Dans notre exemple, il s'agit la
width, mais tu peux aussi utiliserallpour animer toutes les propriétés. - Le second est la durée de l'animation
- Et le dernier est la courbe de détente (ton élément pourrait accélérer ou décélérer ou se déplacer à vitesse constante)
Source: https://support.animaapp.com/en/articles/2601206-animation-easing-curve-explained
đŹ ExpĂ©rimente
Essaie d'ajouter une transition sur le code suivant
!--- index.html
<!DOCTYPE html>
<html>
<head>
<title>Parcel Sandbox</title>
<meta charset="UTF-8" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
<h1>Animate the image on hover</h1>
<img src="images/004-introduction.jpg" alt="" class="dog-img" />
</body>
</html>
!--- style.css
.dog-img {
width: 500px;
}
.dog-img:hover {
width: 550px;
}
!--- index.js
import "./style.css";
Montrer la solution|||css|||Des problĂšmes pour trouver la solution ? |||0|||Masquer
.dog-img {
width: 500px;
transition: width 1s ease-in;
}
La propriété transform permet de manipuler un élément en l'inclinant, en le faisant tourner, en le déplaçant ou en le mettant à l'échelle.
Source: https://www.htmldog.com/guides/css/advanced/transformations/
Rotation
Pour appliquer une rotation sur un élément tu peux utiliser la fonction rotate :
transform: rotate(10deg);
Mise à l'échelle
Tu peux changer l'échelle en utilisant la fonction scale dans une transformation CSS :
transform: scale(1.5);
Déplacer
Tu peux déplacer un élément horizontalement et verticalement en utilisant translate. C'est utile quand tu veux faire bouger tes éléments :
transform : translate(200px,200px) ;
Incliner
La fonction skew permet d'incliner l'élément :
transform: skew(20deg,10deg);
Combiner plusieurs transformations
Tu peux combiner plusieurs propriétés en une seule fois dans ta transformation :
transform: rotate(10deg) scale(1.5);
Pour une utilisation plus avancée, les transformations 3D existent aussi et peuvent permettre des animations plus complexes et esthétiques. Si tu as le temps, tu peux consulter ces deux ressources optionnelles :
đŹ ExpĂ©rimente
C'est ton tour maintenant ! Essaie de combiner les transitions CSS et les transformations CSS pour créer des animations au survol sur les éléments suivants :
!--- index.html
<!DOCTYPE html>
<html>
<head>
<title>Parcel Sandbox</title>
<meta charset="UTF-8" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
<h1>Animate the images on hover</h1>
<h2>Rotation 20 deg</h2>
<img
src="images/005-image.jpg"
alt=""
id="dog-img-1"
class="dog-img"
/>
<h2>Scale 2</h2>
<img
src="images/005-image.jpg"
alt=""
id="dog-img-2"
class="dog-img"
/>
<h2>Translate 200px 200px</h2>
<img
src="images/005-image.jpg"
alt=""
id="dog-img-3"
class="dog-img"
/>
<h2>skew 20deg 10deg</h2>
<img
src="images/005-image.jpg"
alt=""
id="dog-img-4"
class="dog-img"
/>
<h2>Rotate 20 deg translate 100px 50px</h2>
<img
src="images/005-image.jpg"
alt=""
id="dog-img-5"
class="dog-img"
/>
</body>
</html>
!--- style.css
/* TODO */
!--- index.js
import "./style.css";
Montrer la solution|||css|||Des problĂšmes pour trouver la solution ? |||0|||Masquer
.dog-img {
transition: all 1s ease-in-out;
}
#dog-img-1:hover {
transform: rotate(20deg);
}
#dog-img-2:hover {
transform: scale(2);
}
#dog-img-3:hover {
transform: translate(200px, 200px);
}
#dog-img-4:hover {
transform: skew(20deg, 10deg);
}
#dog-img-5:hover {
transform: rotate(20deg) translate(100px, 50px);
}
Les transitions CSS sont souvent utilisĂ©es avec :hover mais elles peuvent ĂȘtre utilisĂ©es avec d'autres pseudo-classes, comme :focus, :target, :checked, etc.
Les animations que nous avons créées en utilisant des transitions CSS sont assez simples, n'est-ce pas ?
Et si nous voulons crĂ©er des animations plus complexes ? Ou une animation qui peut ĂȘtre lancĂ©e sans interaction avec l'utilisateur. Et bien bonne nouvelle, c'est possible avec les animations CSS !
Pour créer une animation avec CSS, tu dois utiliser des @keyframes.
Animations simples
Un exemple vaut des milliers d'explications :
@keyframes slideIn {
from {
transform: translate(0px, 0px);
}
to {
transform: translate(200px, 0px);
}
}
From est l'état de départ de l'élément et to est l'état de l'élément souhaité à la fin de l'animation.
Ensuite, pour appliquer l'animation à un élément, tu dois utiliser les propriétés animation-name et animation-duration :
.my-div{
animation-name: slideIn;
animation-duration: 1s;
}
Tu peux aussi ajouter une propriété animation-iteration-count pour définir le nombre d'itérations souhaitées.
animation-iteration-count: infinite; /* boucle infinie */
animation-iteration-count: 3; /* animation jouée 3 fois */
Et bien d'autres rĂ©glages encoreâŠ
Animations complexes
!--- index.html
<!DOCTYPE html>
<html>
<head>
<title>Parcel Sandbox</title>
<meta charset="UTF-8" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
<h1>CSS animation demo</h1>
<img
src="images/005-image.jpg"
alt=""
id="dog-img-1"
class="dog-img"
/>
</body>
</html>
!--- style.css
#dog-img-1 {
animation-name: slideIn;
animation-duration: 4s;
animation-iteration-count: infinite;
}
@keyframes slideIn {
from {
transform: translate(0px, 0px);
}
to {
transform: translate(200px, 0px);
}
}
!--- index.js
import "./style.css";
Dans cet exemple, tu peux voir que lorsque l'animation est terminĂ©e, le chien revient Ă sa place d'origine sans ĂȘtre animĂ©.
C'est normal car l'animation démarre à nouveau.
Si nous voulons que le chien revienne Ă sa position d'origine de maniĂšre fluide, nous devons faire une animation plus complexe :
@keyframes slideIn {
0% {
transform: translate(0px, 0px);
}
50% {
transform: translate(200px, 0px);
}
100% {
transform: translate(0px, 0px);
}
}
Ici, nous utilisons des pourcentages qui représentent le % d'avancement de l'animation.
Dans cet exemple, l'image commencera à la position 0, se déplacera ensuite à la position 200px et reviendra à la position 0 à la fin de l'animation.
Voici le résultat final :
!--- index.html
<!DOCTYPE html>
<html>
<head>
<title>Parcel Sandbox</title>
<meta charset="UTF-8" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
<h1>CSS animation demo</h1>
<img
src="images/005-image.jpg"
alt=""
id="dog-img-1"
class="dog-img"
/>
</body>
</html>
!--- style.css
#dog-img-1 {
animation-name: slideIn;
animation-duration: 4s;
animation-iteration-count: infinite;
}
@keyframes slideIn {
0% {
transform: translate(0px, 0px);
}
50% {
transform: translate(200px, 0px);
}
100% {
transform: translate(0px, 0px);
}
}
!--- index.js
import "./style.css";
Tu peux utiliser les pourcentages que tu veux pour personnaliser ton animation :
@keyframes slideIn {
0% {
transform: translate(0px, 0px);
}
15% {
transform: translate(0px, 200px);
}
50% {
transform: translate(200px, 0px);
}
75% {
transform: translate(200px, 200px);
}
100% {
transform: translate(0px, 0px);
}
}
!--- index.html
<!DOCTYPE html>
<html>
<head>
<title>Parcel Sandbox</title>
<meta charset="UTF-8" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
<h1>CSS animation demo</h1>
<img
src="images/005-image.jpg"
alt=""
id="dog-img-1"
class="dog-img"
/>
</body>
</html>
!--- style.css
#dog-img-1 {
animation-name: slideIn;
animation-duration: 4s;
animation-iteration-count: infinite;
}
@keyframes slideIn {
0% {
transform: translate(0px, 0px);
}
15% {
transform: translate(0px, 200px);
}
50% {
transform: translate(200px, 0px);
}
75% {
transform: translate(200px, 200px);
}
100% {
transform: translate(0px, 0px);
}
}
!--- index.js
import "./style.css";
đŹ ExpĂ©rimente
Essaie de créer une animation en respectant ces consignes :
- Entre 0 et 50% de l'animation, faire rouler le disque vinyl vers la droite de sorte qu'il tourne d'un demi-tour.
- Puis revenir à l'état initial de 50 à 100%
- L'animation doit avoir un effet de balancier, c'est-à -dire une accélération au démarrage et un ralentissement en fin de séquence
- L'animation doit tourner en boucles de 5 secondes
Aide-toi de la documentation si tu es perdu.
!--- index.html
<!DOCTYPE html>
<html>
<head>
<title>Parcel Sandbox</title>
<meta charset="UTF-8" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
<img src="images/006-experimente.jpg" alt="" id="vinyl-img">
</body>
</html>
!--- style.css
#vinyl-img {
border-radius: 50%;
/* your code */
}
!--- index.js
import "./style.css";
Montrer la solution|||css|||Des problĂšmes pour trouver la solution ? |||0|||Masquer
#vinyl-img {
border-radius: 50%;
animation-name: vinylAnimation;
animation-duration: 5s;
animation-timing-function: ease-in-out;
animation-iteration-count: infinite;
}
@keyframes vinylAnimation {
0% {
transform: translate(0px, 0px);
}
50% {
transform: translate(100%, 0px) rotate(180deg);
}
100% {
transform: translate(0px, 0px) rotate(0deg);
}
}
Comme cela est prĂ©cisĂ© dans le :def[RGAA]{value="RĂ©fĂ©rentiel gĂ©nĂ©ral dâamĂ©lioration de lâaccessibilitĂ©"}, les transitions et animations doivent ĂȘtre manipulĂ©es avec beaucoup de prĂ©caution. Le risque Ă©tant de rendre une partie du contenu inaccessible aux utilisateurs souffrant de troubles de la vue ou de l'attention.
Voici ce qui est indiqué au critÚre 13.8 du RGAA :
Dans chaque page web, chaque contenu en mouvement déclenché automatiquement, vérifie-t-il une de ces conditions ?
- La durĂ©e du mouvement est infĂ©rieure ou Ă©gale Ă 5âŻsecondes ;
- Lâutilisateur peut arrĂȘter et relancer le mouvement ;
- Lâutilisateur peut afficher et masquer le contenu en mouvement ;
- Lâutilisateur peut afficher la totalitĂ© de lâinformation sans le mouvement.
Comme dans de nombreux cas concernant l'accessibilité numérique, une méthode pour répondre à ces critÚres de test repose sur une fonctionnalité native des navigateurs et des systÚmes d'exploitation.
Le media query prefers-reduced-motion va permettre d'activer ou non l'animation en fonction des réglages de l'utilisateur (via l'OS généralement).
Dans l'exemple prĂ©cĂ©dent, le balancement du vinyl pourra ĂȘtre dĂ©sactivĂ© selon les prĂ©fĂ©rences de l'utilisateur, le cas Ă©chĂ©ant, grĂące Ă ces quelques lignes de code :
@media (prefers-reduced-motion: reduce) {
#vinyl-img {
animation: none;
}
}
Tu trouveras plus d'explications sur la media query prefers-reduced-motion en lisant la documentation MDN : https://developer.mozilla.org/fr/docs/Web/CSS/@media/prefers-reduced-motion
Pour tester un tel réglage :
- Chromium (Chrome, Edge, BraveâŠ) : Dev tools > More tools > Rendering

- Firefox :
- Taper
about:configdans la barre d'adresse. - Chercher
ui.prefersReducedMotion. - Régler la valeur sur
1pour activer reduce.
- Taper
- Safari : Utiliser la configuration de macOS et iOS.
Résumé
- Tu peux utiliser les animations CSS pour animer les éléments de ton site
- Tu peux utiliser CSS transform pour changer la maniÚre dont est rendu un élément (modification de l'échelle, de l'inclinaison, etc)
- Il y a deux façons d'animer les éléments : Transition ou Animation
- Reste vigilant en évitant les animations ou effets de flash qui rendraient l'interface inaccessible et pense à prendre en compte les réglages de l'utilisateur avec le media query
prefers-reduced-motion
Ressources partagĂ©es sur cette quĂȘte
- Librairie animate.css, pas mal de contenu https://animate.style/
- Doc de la fonction skew qui déforme l'élément plutÎt qu'il ne l'incline (distorsion)https://developer.mozilla.org/fr/docs/Web/CSS/transform-function/skew
- Lorsque vous appliquez plusieurs transformations CSS Ă un mĂȘme Ă©lĂ©ment, lâordre de dĂ©claration des transformations dans `transform` a de lâimportance : en effet, selon lâordre de dĂ©claration des fonctions de transformation, le rĂ©sultat peut diffĂ©rer.https://www.youtube.com/watch?v=Ae2wJrFxJUY