Nous avons passĂ© un temps considĂ©rable Ă apprendre comment optimiser nos animations, maisâŠ
Comment savoir si ça marche ?
Pour le moment, vous avez dû me croire sur parole concernant les propriétés à bannir.
Car toutes vos animations sont probablement parfaitement fluides sur votre machine⊠(oui oui, je dis "machine" pour "ordinateur" đ€) mais si vous apprenez Ă dĂ©velopper, c'est que vous ĂȘtes probablement sur un ordinateur puissant, Ă©quipĂ© dâune carte graphique moderne (sans vouloir vous juger sans vous connaĂźtre). Mais comment savoir si lâanimation sera bien fluide sur la tablette bas de gamme achetĂ©e en soldes par votre grand-pĂšre ?
Heureusement pour nous, Chrome propose toute une suite dâoutils intĂ©grĂ©s. Vous les avez peut-ĂȘtre dĂ©jĂ utilisĂ©s en inspectant le code source dâun site web, ou en ouvrant la console. Mais ce nâest qu'une toute petite partie de l'ensemble de ces outils, aussi appelĂ©s DevTools.
DevTools met à notre disposition de nombreux outils. Notamment un qui simule le fonctionnement de nos animations sur un vieux smartphone. Il permet également d'analyser en détail les performances de notre animation, afin d'identifier les problÚmes potentiels et de les corriger.
Dans ce chapitre, nous apprendrons Ă maĂźtriser l'outil de performance de Chrome DevTools pour que nos animations soient aussi fluides que possible.
Ici, nous avons une petite application. Elle reprĂ©sente une sĂ©rie de cartes, chaque carte munie dâune photo et de quelques blocs de texte. Il y a Ă©galement un bouton qui rĂ©vĂšle une troisiĂšme carte cachĂ©e :

Lâapparition de la carte cachĂ©e est constituĂ©e de plusieurs transitions : lâapparition de la carte elle-mĂȘme, et une deuxiĂšme transition qui pousse lâautre carte sur la droite.
$easing: cubic-bezier(.49,.18,.23,1);
$width: 33vh;
$height: 72vh;
$margin-right: 4vh;
$wid-marg: $width + $margin-right;
.card {
width: $width;
height: $height;
overflow: hidden;
&:not(:last-child){
margin-right: $margin-right;
}
&--anim {
transform: translateX($width-marg);
transition: transform 700ms $easing;
}
&__contents {
width: $width;
overflow: hidden;
&--anim {
transform: translateX($wid-marg*-1);
transition: transform 700ms $easing;
}
}
}
.btn {
&--reveal {
&:hover {
& + .card {
&--anim {
transform: translateX(0);
}
.card__contents--anim {
transform: translateX(0);
}
}
}
}
}On a aussi ajouté quelques mouvements secondaires (souvenez-vous des 12 principes) avec plusieurs transitions pour révéler les blocs de texte de la carte :
</>
$easing: cubic-bezier(.49,.18,.23,1);
$width: 33vh;
$height: 72vh;
$margin-right: 4vh;
$wid-marg: $width + $margin-right;
.card {
width: $width;
height: $height;
overflow: hidden;
&:not(:last-child){
margin-right: $margin-right;
}
&--anim {
transform: translateX($width-marg);
transition: transform 700ms $easing;
}
&__contents {
width: $width;
overflow: hidden;
&--anim {
transform: translateX($wid-marg*-1);
transition: transform 700ms $easing;
}
}
&__block {
overflow: hidden;
// une boucle créée avec sass qui itÚre de 1 à 3, en utilisant l'index
// comme suffixe pour le nom --anim mod
// ainsi que comme valeur pour multiplier la valeur de transition delay
@for $i from 1 through 3 {
&--anim-#{$i} {
transform: translateX(-108%);
transition: transform 500ms $easing 50ms*$i;
}
}
&:not(:first-child) {
margin-top: 1rem;
}
}
}
.btn {
&--reveal {
&:hover {
& + .card {
&--anim {
transform: translateX(0);
}
.card__contents--anim {
transform: translateX(0);
}
.card__block--anim {
transform: translateX(0);
}
}
}
}
}Toutes ces animations sont bien fluides sur notre ordinateur, mais ça ne suffit pas. Nous voulons quâelles soient fluides sur tous les Ă©crans, y compris sur des supports anciens ou bas de gamme. Au total, lâapparition de la carte est constituĂ©e de 5 transitions distinctes. Comment nous assurer quâelles fonctionneront bien de maniĂšre fluide chez tout le monde ?
Vous pouvez laisser un bon d'achat pour commander un appareil moderne sur votre site, mais ça risque peut-ĂȘtre d'ĂȘtre coĂ»teux đ€
Mais il existe un moyen plus facile et moins onéreux de tester et d'analyser nos animations.
Mesdames et Messieurs, permettez-moi de vous prĂ©senter Chrome Devtools ! đ„ł
Eh oui, je vous en parlais, câest ce qui apparaĂźt quand on clique sur âInspecterâ sur une page web. Il fait bien plus que nous aider Ă comprendre comment une page est organisĂ©e.
Au-delĂ de lâonglet Elements, DevTools comporte toute une sĂ©rie dâautres onglets pour inspecter, dĂ©boguer et analyser divers aspects de nos sites. Ici, c'est lâonglet Performance qui va nous intĂ©resser. Il nous permet dâenregistrer et dâanalyser comment une page se charge, rĂ©agit, et sâanime.
Ăa paraĂźt ĂȘtre pas mal pour Ă©valuer la performance de nos animations, non ? Alors ouvrons DevTools et voyons ça !
Avant de commencer lâexploration de lâonglet Performance, nous devons ouvrir DevTools. Vous avez probablement lâhabitude de faire un clic droit sur un Ă©lĂ©ment dâune page et de choisir âInspecterâ.
Mais il existe un moyen plus rapide pour le faire. DevTools peut ĂȘtre ouvert par le raccourci clavier Ctrl+Shift+I sous Windows, ou Cmd+Opt+I sur Mac.
Une fois DevTools ouvert, en haut de la fenĂȘtre, on peut trouver une sĂ©rie de boutons qui amĂšnent Ă diffĂ©rents onglets. Si lâonglet Performance nâest pas visible Ă droite de lâonglet ĂlĂ©ments, selon la taille de votre fenĂȘtre, vous pouvez lâouvrir en cliquant sur la double flĂšche Ă droite, et en sĂ©lectionnant âPerformanceâ dans le menu qui apparaĂźt :

Maintenant que lâonglet Performance est ouvert, nous arrivons sur une fenĂȘtre plutĂŽt spartiate en apparence. En effet, celle-ci contient juste quelques boutons et des instructions disant que nous pouvons cliquer sur le bouton âRecordâ pour enregistrer, ou cliquer sur le bouton du dessous pour enregistrer le chargement de la page :

Mais avant de cliquer sur lâun de ces boutons, ajustons un peu notre installation. En haut de la fenĂȘtre se trouve une case âScreenshotsâ. Si on coche la case, Chrome prendra une capture dâĂ©cran de chaque image de lâenregistrement, nous permettant ainsi de visionner le dĂ©roulement de lâanimation image par image. Cette option nâest pas toujours nĂ©cessaire pour analyser les performances dâun site, comme quand il sâagit de performances rĂ©seau, mais lâanimation est un domaine trĂšs visuel, lâoption screenshot peut donc s'avĂ©rer particuliĂšrement utile. Nous allons donc cocher cette case Screenshots :

Nous voilĂ presque prĂȘts Ă commencer lâenregistrement. Mais avant, il nous reste une derniĂšre chose Ă faire. Rappelez-vous que nous voulons voir nos animations telles quâelles apparaissent sur des appareils plus lents. Or, si on enregistre maintenant, on verra seulement lâanimation sâexĂ©cuter sur notre ordinateur. Pour remĂ©dier Ă cela, lâonglet Performance nous permet de brider la vitesse de notre processeur.
En cliquant sur la roue de paramĂ©trages dans le coin en haut Ă droite, quatre options apparaissent, dont lâoption âCPU throttlingâ. Simulons lâappareil le plus lent possible en choisissant 6X, qui limite notre processeur Ă une vitesse six fois plus lente que ses capacitĂ©s (n'oubliez surtout pas de dĂ©cocher cette case quand vous aurez terminĂ©, sinon votre navigateur pourrait trĂšs rapidement vous rendre complĂštement fou đ) :

Nous voilĂ fin prĂȘts Ă commencer lâinspection de nos animations ! Les performances de la page ne nous prĂ©occupent pas pour lâinstant, donc nous pouvons immĂ©diatement appuyer sur le bouton Record. Quand on clique sur ce bouton Record, une fenĂȘtre de dialogue apparaĂźt pour nous informer que lâenregistrement du site a commencĂ©. Nous pouvons donc maintenant interagir avec notre bouton pour lancer les transitions. Une fois que les animations sont terminĂ©es, on peut cliquer sur le bouton âStopâ dans la fenĂȘtre de progression :

Et câest tout ! DevTools prend un instant pour traiter les donnĂ©es recueillies, puis les affiche dans lâonglet Performance.
Décomposons maintenant tout cela étape par étape.

Tout en haut, on trouve lâavancement de lâenregistrement, en millisecondes. Sur cette ligne, des graphiques verts suivent les FPS de notre site ; les plateaux correspondent aux Ă©vĂ©nements dâanimation que nous allons dĂ©tailler dans un instant. Et juste sous cette ligne dâavancement se trouve une succession des images que DevTools a enregistrĂ©es.
Quand on passe la souris sur un des aperçus, il sâagrandit et nous montre exactement Ă quoi ressemblait le site Ă ce moment prĂ©cis :
 
Regardons notre animation de plus prÚs en zoomant sur une des zones vertes. Pour cela, cliquez puis faites glisser votre souris sur la zone qui vous intéresse, ou bien utilisez la molette de la souris :

Maintenant que nous sommes entrĂ©s dans les dĂ©tails de la partie animation de lâenregistrement, concentrons-nous sur les cases vertes plus bas. Elles correspondent aux images de notre animation. En passant la souris dessus, nous pouvons voir le temps de calcul de chaque image, et le nombre de FPS :
 
On peut constater des changements assez faibles entre chaque image, ce qui est normal, mais globalement, chaque image est proche de notre objectif de 60Â FPS : c'est parfait ! Nous pouvons donc affirmer avec certitude que nos transitions seront bien fluides, mĂȘme sur un appareil six fois plus lent que notre ordinateur.
Allons voir ce qui se passe lorsque le navigateur calcule une image dans une animation. Pour cela, choisissez une image et zoomez au maximum.

Maintenant que nous avons isolĂ© une image dans lâanimation, intĂ©ressons-nous Ă la section âMainâ de lâonglet Performance. Cette section permet de voir tous les calculs qui ont transformĂ© notre code en une page web animĂ©e. Les calculs sont rĂ©partis en catĂ©gories identifiĂ©es par des codes couleurs.
Les blocs violets reprĂ©sentent les calculs de base qui permettent lâaffichage dâune page web, comme lâanalyse du CSS et le calcul des styles.

Les blocs jaunes indiquent des calculs de l'Ă©tape layout, mais⊠hourra, il nây en a pas ici ! Qu'est-ce que je vous avais dit ? đ GrĂące Ă la propriĂ©tĂ©  transform, nous avons Ă©vitĂ© tout calcul de layout, bien trop gourmand en calcul, ce qui aurait dĂ©gradĂ© notre FPS.
Mais si notre image ne comporte pas de calculs de layout, elle comprend bien une case verte, qui reprĂ©sente un calcul de paint ou de composition. En passant la souris dessus, nous voyons quâil sâagit bien dâun calcul de composition. Notre animation nâa pas non plus besoin de calculs de paint :

Plus besoin de me croire sur parole maintenant : vous le constatez par vous-mĂȘme ! La propriĂ©tĂ© transform nous permet de crĂ©er des animations abouties en Ă©vitant des calculs complexes pour notre navigateur. Et moins de calculs signifie plus dâimages par seconde, donc une meilleure fluiditĂ© ! đ
Chrome DevTools est l'outil de prĂ©dilection des dĂ©veloppeurs. Il permet d'inspecter le code source d'une page, d'analyser les performances de notre page, de brider la performance de notre machine pour simuler un appareil plus lent. Pour cette derniĂšre option, activez lâoption âCPU throttlingâ ;
l'outil Performance permet d'analyser les performances dâune page, notamment le taux dâimages par seconde dâune animation ;
on peut utiliser lâonglet Performance pour analyser nos animations, ce qui permet de repĂ©rer les problĂšmes dans notre code qui pourraient causer des problĂšmes de fluiditĂ© sur certains supports ;
zoomer sur une image prĂ©cise dâune animation permet de dĂ©tailler les calculs effectuĂ©s par le navigateur, que nous avions vus dans le chapitre sur le fonctionnement du navigateur.
Dans le chapitre suivant, nous aborderons enfin l'autre propriété dont nous disposons pour assurer un FPS optimal : opacity. Nous apprendrons à maßtriser cette propriété pour créer des animations en couleur sans déclencher de calcul de type paint dans le navigateur. Alors, à tout de suite !