Contenu principal

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 :

  1. Animer les bonnes propriétés CSS
  2. PrĂ©parer le navigateur aux animations (Vous ĂȘtes ici.)
  3. 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 et opacity.

  • La propriĂ©tĂ© will-change est inutile si vous utilisez les keyframes en CSS en tandem avec les propriĂ©tĂ©s transform et/ou opacity. Cela vient du fait qu’en utilisant les keyframes, 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 :)