Des animations performantes - Partie 2
vendredi 24 février 2017
Faire bouger sa page web, câest mettre des paillettes dans les yeux de ses utilisateurs.
La semaine derniĂšre, on a regardĂ© comment fonctionne un navigateur afin de mieux comprendre comment choisir les propriĂ©tĂ©s CSS que lâon doit animer. On a travaillĂ© sur le Layout. En fin dâarticle, jâavais prĂ©cisĂ© que ce nâĂ©tait pas le seul point sur lequel on peut avoir une influence. On peut aussi chercher Ă optimiser la phase de Painting. Câest donc cette partie que lâon va explorer cette semaine.
Pour rappel, cette série dédiée aux animations performantes est découpée en trois parties :
- Animer les bonnes propriétés CSS
- PrĂ©parer le navigateur aux animations (Vous ĂȘtes ici.)
- Faire les choses dans le bon ordre en JS
Ces trois parties sont assez thĂ©oriques et expliquent ce quâil faut Ă©viter et pourquoi. Il faudra attendre la deuxiĂšme sĂ©rie sur les animations pour parler dâimplĂ©mentations concrĂštes.
TL;DR
Si un objet est destiné à bouger, il faut prévenir le navigateur en utilisant la rÚgle CSS :
will-change: <propriete-animee>
Mais pourquoi utiliser will-change
 ? Quâest ce que ça change au niveau du rendu navigateur ? Et comment choisir quand est-ce quâil faut le mettre ?
Les layers
Pour comprendre pourquoi on utilise will-change
, il faut comprendre la notion de layer (ou calque).
Comment dâaprĂšs vous sont dessinĂ©es les choses Ă lâĂ©cran ? GĂ©nĂ©ralement, la premiĂšre solution qui vient Ă lâesprit est de dessiner les pixels un par un.
Ainsi, pour dessiner un bouton, on commence par dessiner le fond de celui-ci. On dit donc Ă lâordinateur de colorier, un par un, les pixels qui composent le fond. Puis, on ajoute le texte en prĂ©cisant Ă lâordinateur quels pixels doivent changer de couleur.
Câest ce que fait le navigateur au moment du Painting. Il dĂ©finit la couleur que doit avoir chaque pixel pour pouvoir les afficher Ă lâĂ©cran.
Si on reste sur cette approche, Ă chaque fois que quelque chose change, il faut redessiner lâensemble de lâĂ©cran. Pourtant, si le bouton doit uniquement se dĂ©caler de quelques pixels sur la droite, câest dommage de devoir recalculer lâensemble des pixels du bouton.
Câest ici quâintervient les layers. LâidĂ©e est de dire que lâon connaĂźt dĂ©jĂ la position des pixels, et quâil suffit de les dĂ©placer par blocs. Câest exactement la mĂȘme chose que ce que vous feriez avec du papier calque. En dessinant sur plusieurs feuilles et en les superposant, vous nâavez pas besoin de tout redessiner Ă chaque fois que vous voulez changer un Ă©lĂ©ment (ex : les celluloĂŻds).
Ce quâil y a de top dans tout ça, câest que dans lâensemble le navigateur sâen charge automatiquement pour vous. Mais quand il nâarrive pas Ă dĂ©terminer les bons calques, comment lâaiderâŻ?
Identifier ce qui est redessiné dans la page
Tout dâabord, avant de savoir comment lâaider, il faut savoir oĂč lâaider. Pour cela, il va falloir identifier quelles sont les parties de votre page qui sont repeintes inutilement.
On demande donc au navigateur dâafficher ce quâil repeint. Câest une option assez cachĂ©e sur les diffĂ©rents navigateurs. Cependant, elle permet de voir visuellement quelles sont les parties de la page qui posent problĂšme.
Sur Chrome, il faut ouvrir les dev tools, et tout en bas, il y a un onglet Console. Il faut cliquer sur le bouton Ă gauche de celle-ci et activer lâonglet Rendering. Dans celui-ci il faut alors cocher lâoption Paint Flashing.
Sur Firefox, dans les dev tools, en haut Ă droite, il faut ouvrir les Toolbox Options. Et dans la section Available Toolbox Buttons, il faut activer Highlight painted area. Le bouton apparaĂźt alors dans la liste des boutons en haut Ă droite des dev tools et il ne reste plus quâĂ lâactiver.
Une fois lâoption activĂ©e, vous pouvez scroller sur la page surlaquelle vous ĂȘtes et vous verrez des zones vertes apparaĂźtre (notamment la scrollbar).
Si lors de vos animations, quelque chose est repeint constamment, câest mauvais signe.
Voici un exemple qui lag (jây ai mis tout mon talent)Â :
Jâai utilisĂ© ces box-shadows
hiddeuses pour avoir quelque chose qui lag sur desktop. Cependant, dans la vraie vie, ce cas se prĂ©sente plutĂŽt lorsque vous avez beaucoup de contenu dans lâĂ©lĂ©ment animĂ©.
Eviter les repaints
Maintenant quâon sait identifier ce qui pose problĂšme, vous vous en doutez, le but va ĂȘtre de forcer la crĂ©ation de nouveaux layers.
Il y a une propriété faite exprÚs pour ça : will-change
. Celle-ci prĂ©vient le navigateur quâune propriĂ©tĂ© va changer durant lâanimation Ă venir. Le navigateur va alors crĂ©er un layer sĂ©parĂ© pour optimiser lâaffichage.
.class {
will-change: transform;
}
En détails
Il faut tout de mĂȘme retenir quelques point sur cette propriĂ©tĂ©, parce que tout de mĂȘme, tout nâest pas toujours magique !
-
Si vous en utilisez trop, cela consomme beaucoup de mĂ©moire et cela aura lâeffet inverse : le navigateur sera encore moins performant.
-
Ce nâest compatible quâavec les propriĂ©tĂ©s qui ne changent pas lâaffichage des Ă©lĂ©ments. Par exemple, si vous changez la couleur, le navigateur sera tout de mĂȘme obligĂ© de repeindre des pixels. Essayez donc de rester sur
transform
etopacity
. -
La propriété
will-change
est inutile si vous utilisez leskeyframes
en CSS en tandem avec les propriétéstransform
et/ouopacity
. Cela vient du fait quâen utilisant leskeyframes
, le navigateur sait dĂ©jĂ que lâĂ©lĂ©ment va bouger. -
(moins utile Ă savoir) Si vous utilisez
position: fixed
, un layer ne sera pas nécessairement créé automatiquement. Cela dépend de la denisté de votre écran. (source)
Conclusion
En bref, cette propriĂ©tĂ© est tout de mĂȘme assez magique. Mais elle corrobore surtout le fait quâil faut essayer de rester sur les animations basĂ©es sur transform
et opacity
si on veut Ă©viter dâavoir des problĂšmes.
En tout cas, avant de lâutilisez, pensez Ă vĂ©rifier quâelle est vraiment utile en passant par vos dev tools.
La semaine prochaine, on passera cĂŽtĂ© JS ! En effet, parfois, on ne peut pas se contenter du CSS pour animer ses pages. Mais de nouveaux challenges se prĂ©sentent si on change de langage. On parlera encore un petit peu de Layout, mais aussi dâorchestration dâĂ©vĂšnement.
En attendant, voici quelques sources pour vous permettre dâapprofondir le sujet :
Si vous voulez suivre mes publications, il paraĂźt que j'ai un feed RSS, Mastodon et un Twitter.
Si vous pensez à d'autres méthodes que vous voudriez que je mette en place (pigeon voyageur, avion en papier, etc.), n'hésitez pas à me les proposer :)