CSS3 : transformations et transitions
Jeudi 15 décembre 2016 13:34
Le CSS3 permet d'effectuer des transformations comme des translations ou des rotations de n'importe quel élément de la page. D'autre part avec les transitions la page peut devenir et s'animer selon les actions de l'utilisateur dont la plus fréquente est le passage du curseur de la souris. Je vous propose dans cet article d'explorer ces possibilités.
Les transformations
Pour les transformations on a la propriété transform. Ca ne fonctionne qu'avec les éléments de type boîte mais on peut facilement étendre l'action aux autres éléments avec inline-block.Translation
Une translation est un déplacement horizontal ou vertical ou selon une direction quelconque. On dispose de ces fonctions :- translateX(n) : translation de n sur l'axe x
- translateY(n) : translation de n sur l'axe y
- translate(x, y) : translation vers le point de coordonnées x et y
- translateZ(n) : translation de n sur l'axe z
- translate3d(x,y,z) : translation vers le point de coordonnées x, y, z
Perspective
Si on fait une translation sur l'axe z on ne va rien voir de spécial parce que la vue est en 2D. Pour avoir un effet il faut changer la perspective et il existe une propriété pour ça : perspective. C'est comme si on éloignait l'élément de la vue, du coup on acquiert une profondeur et alors une translation sur l'axe z devient visible (JSFiddle) : On pourrait éloigner l'objet avec une valeur négative. La perspective doit être précisée dans le parent ! Il est aussi possible de modifier l'origine de la vue avec perspective-origin. On doit préciser les valeurs de x et y (par défaut on a 50% et 50%) : Vous pouvez jouer avec ces éléments de perspective sur cette page : Comme ces notions ne sont pas faciles à visualiser je vous conseille les excellentes illustrations du W3C.Dimensionnement (scale)
Un dimensionnement est un changement de la taille d'un élément. On dispose de ces fonctions :- scaleX(n) : changement de la dimension de n sur l'axe x
- scaleY(n) : changement de la dimension de n sur l'axe y
- scale(x, y) : changement de la dimension de x et y
- scaleZ(n) : changement de la dimension de n sur l'axe z
- scale3d(x,y,z) : changement de la dimension de x, y et z
Rotation
Une rotation est une... rotation d'un certain angle autour d'un centre. On dispose de ces fonctions :- rotateZ(n) : changement de la dimension de n sur l'axe z
- rotate(n) : rotation de n sur l'axe z (équivalent à rotateZ)
- rotateX(n) : rotation de n sur l'axe x
- rotateY(n) : rotation de n sur l'axe y
- rotate3d(x,y,z, angle) : rotation 3D
Biais (skew)
Le biais (skew) est plus facile à montrer qu'à expliquer donc je ne m'y risque pas ! On dispose de ces fonctions :- skewX(angle) : déforme sur l'axe x de l'angle
- skewY(angle) : déforme sur l'axe y de l'angle
- skewY(angle x, angle y) : déforme sur les axes y et y
Ressources pour les transformations
On trouve des générateurs : Un avantage de ces générateurs est qu'ils donnent le code avec les préfixes pour les différents navigateurs. On trouve aussi des tutoriels et documentations :- les préconisations du W3C
- un superbe tutoriel très complet pour les transformations 3D (regardez les exemples !)
Les transitions
Les transformations c'est bien mais elles trouvent tout leur intérêt dès qu'on les anime. Il n'y a pas si longtemps que ça la seule façon de créer des animations était d'utiliser Javascript. Avec CSS3 ce temps est révolu et on peut faire beaucoup de choses avec seulement des règles CSS. En gros les transitions permettent de faire changer progressivement les valeurs des propriétés CSS. Par exemple on passe le curseur de la souris au-dessus d'un bouton et celui-ci change progressivement de couleur. Les transitions sont déclarées en même temps que les règles auxquelles elles se réfèrent. Le navigateur sait ensuite ce qu'il a à faire.Transition sur une propriété
Prenons un exemple simple de survol. On part d'une boite de 100px par 100px et on veut au survol que la hauteur passe progressivement à 120px. Comment réaliser cela ? On doit :- déclarer la propriété de départ de façon classique
- déclarer la propriété comme devant être transitionnée avec la durée de l'effet
- déclarer dans la règle finale la nouvelle valeur de la propriété
div { width: 100px; height: 100px; background: blue; transition: height 1s; } div:hover { height: 120px; }Au départ on a la boîte de 100px sur 100px, bleue et on déclare qu'on veut une transition sur la hauteur qui doit durer 1 seconde. Au survol (hover) on définit la hauteur finale de 120px. Vous avez l'exemple actif en JSFiddle.
Transition sur plusieurs propriétés
On n'est pas limité à une propriété, on pourrait changer par exemple la largeur en même temps que la hauteur :div { width: 100px; height: 100px; background: blue; transition: height 1s, width 2s; } div:hover { height: 120px; width: 80px; }Vous avez l'exemple actif en JSFiddle.
Progression de la transition
On peut modifier la transformation avec la propriété transition-timing-function et ces valeurs :- ease : début rapide, puis ça accélère, puis ça ralentit à la fin (c'est l'effet par défaut)
- linear : même vitesse du début à la fin
- ease-in : début lent
- ease-out : fin lente
- ease-in-out : début et fin lents
- cubic-bezier(n,n,n,n) : là on peut tout définir avec une courbe de Bezier
Les propriétés
La propriété transition est un raccourci pour les 4 propriétés suivantes :- transition-property : la ou les propriétés touchées par la transition
- transition-duration : durée de la transition
- transition-timing-function : progression de la transition (par défaut ease)
- transition-delay : délai pour le départ de la transition
Transition d'une transformation
On peut évidemment appliquer une transition sur les transformations qu'on a vues ci-dessus. On pourrait par exemple ajouter une rotation au changement de la largeur vu ci-dessus :div { width: 100px; height: 100px; background: blue; transition: width 2s, transform 2s; } div:hover { width: 200px; transform: rotate(180deg); }Vous avez ça en action ici.
Exemples intéressants de transitions
Il est toujours intéressant d'avoir des exemples de réalisations. Je me suis un peu amusé dans cet exemple. Je vous en propose d'autres qui me semblent valoir la visite :Ressources pour les transitions
Il y a une page MDN très bien faite. Pour la spécification W3C c'est par ici. Il y a un bon tutoriel sur Alsacreation. Et évidemment comme d'habitude il faut des préfixes pour certains navigateurs mais comme je vous l'ai déjà dit, automatisez cette tâche ! Par exemple avec gulp-autoprefixer.Par bestmomo
Aucun commentaire