Contenu principal

Comment diagnostiquer et corriger du Cumulative Layout Shift (CLS) ?

lundi 21 août 2023

Dans le domaine de la Web Performance, il y a plusieurs aspects Ă  prendre en compte :

  • Est-ce que ma page s’affiche rapidement ?
  • Est-ce que la rapiditĂ© Ă  laquelle elle se charge permet Ă  une personne d’interagir facilement avec elle ?
  • Est-ce que les interactions sont rapides ?

Jusqu’à maintenant dans les articles que j’ai publiĂ© autour de la performance, j’ai beaucoup parlĂ© du premier point. Nous nous sommes surtout concentrĂ©s sur celui-ci parce que le Largest Contentful Paint est certainement la mĂ©trique la plus gĂ©nĂ©rique et la plus Ă©videmment impactante pour nos utilisateurices : s’il faut attendre 10 secondes pour voir le contenu, la page est Ă©videmment lente.

Cependant, aujourd’hui je vais vous parler du deuxiĂšme aspect : comment gĂ©rer le chargement de ma page pour amĂ©liorer la performance ressentie ? Notamment, avec l’avĂšnement des Core Web Vitals poussĂ©es par Google, la mĂ©trique qui va nous intĂ©resser est le Cumulative Layout Shift (CLS).

Si vous voulez en savoir plus sur la Web Performance, n’hĂ©sitez pas Ă  jeter un coup d’Ɠil aux autres articles suivants. Si vous n’avez pas le temps de vous former Ă  ces sujets ou que vous devez amĂ©liorer vos performances avant une date clĂ©, sachez aussi que je peux venir en renfort dans vos Ă©quipes afin de mener audit, correctifs ou formation.

Qu’est-ce que le CLS ?

Pour comprendre ce qu’est le CLS, je vous propose d’essayer de cliquer sur le bouton “Revenir Ă  l’article” de la vidĂ©o suivante ou en allant directement sur la dĂ©mo.

Video du chargement de la page d'exemple sur mobile

Si vous cliquez au mauvais moment, vous ne cliquerez pas sur le bouton, mais sur le titre. C’est dĂ©jĂ  frustrant en soit. Mais si le titre Ă©tait un autre lien, vous vous seriez retrouvĂ© brinquebalĂ© sur une autre page. C’est par exemple le cas sur l’application Webtoon oĂč je lis rĂ©guliĂšrement. Quand j’arrive sur la liste des chapitres d’une sĂ©rie, je m’apprĂȘte Ă  ouvrir le dernier chapitre (ici le 91), et Ă  chaque fois, l’encart “Daily Pass” apparaĂźt pile au moment oĂč je clique (cf. deuxiĂšme onglet). Je me retrouve alors Ă  cliquer sur “Read the latest 3 episodes” au lieu de cliquer sur l’épisode 91, ce qui m’ouvre une dropdown et m’oblige Ă  faire plein de clics supplĂ©mentaires pour arriver Ă  mon but. đŸ˜©

Premier affichage

C’est un exemple inoffensif, mais si c’était une action importante (ex : acheter, supprimer, etc.), ce serait beaucoup plus Ă©nervant.

Ainsi, si on devait dĂ©finir le Layout Shift sans utiliser de termes techniques, ce serait un changement de l’affichage de la page, qui ne vient pas d’une action de l’utilisateurice et donc qui peut entraĂźner un mauvais clic ou une perte de repĂšres au cours de la lecture.

Une subtilitĂ© Ă  noter : ce Layout Shift est calculĂ© uniquement sur ce qui est visible Ă  l’utilisateurice. En effet, si votre page bouge mais que ce n’est pas dans la partie visible de l’écran, ce n’est pas un problĂšme.

On a donc dĂ©finit le Layout Shift qui correspond au LS de CLS. Mais Ă  quoi correspond le C ? Cumulative : c’est une maniĂšre de dire qu’on va mesurer l’ensemble des mouvements qui y a eu sur la page. Par exemple, si vous avez plusieurs bandeaux qui apparaissent les uns aprĂšs les autres, ce sera d’autant plus gĂȘnant. Mais ça veut aussi dire que si vous scrollez plus loin dans votre page et que pendant le scroll il se passe des chargements, alors ces Layouts Shifts seront aussi comptabilisĂ©s dans le CLS.

Quels outils pour mesurer et diagnostiquer le CLS ?

Comme d’habitude, la rĂ©ponse est : ça dĂ©pend 😁

Obtenir une idée générale du CLS en un click : PageSpeed Insights

En renseignant l’URL que vous souhaitez tester, vous recevrez un audit Lighthouse. Vous pourrez ainsi voir si vous avez du Layout Shift ou non. Par exemple sur notre dĂ©mo, on peut voir que le CLS est de 0.328. (De maniĂšre trĂšs schĂ©matique on peut en comprendre que 1/3 de la page a Ă©tĂ© affectĂ©e par du Layout Shift – cf. Layout shift score pour plus de dĂ©tails)

Audit Lighthouse de la page de démo qui montre les différents scores des Core Web Vitals, dont le CLS à 0.328
Rapport d'audit pour la page d'exemple sur mobile

Pensez Ă  aussi bien vĂ©rifier sur desktop parce que les contraintes y sont trĂšs diffĂ©rentes et il est trĂšs courant d’avoir du CLS sur un device mais pas l’autre.

Lighthouse vous donnera aussi des premiĂšres pistes pour rĂ©gler les problĂšmes associĂ©s au CLS. Pour cela, il vous faut cliquer sur le petit tag “CLS” en bas Ă  droite des screenshots de votre page.

Affichage des conseils spécifiques au CLS dans la section 'Diagnostic' d'un audit Lighthouse
La section Diagnostic de l'audit Lighthouse ne contient maintenant que des conseils associés au CLS

L’autre intĂ©rĂȘt de PageSpeed Insights est que si votre site est suffisamment frĂ©quentĂ©, il vous prĂ©sentera les donnĂ©es du CrUX qui sont des donnĂ©es mises Ă  disposition par Google qui indiquent quelle a Ă©tĂ© la rapiditĂ© d’affichage de votre site pour les utilisateurices de Chrome. Cela inclut le CLS. L’intĂ©rĂȘt est que cela vous donnera une vision sur ce que ressentent rĂ©ellement vos utilisateurices plutĂŽt que de vous contenter de donnĂ©es dĂźtes de laboratoire. N’hĂ©sitez pas Ă  vous rĂ©fĂ©rer Ă  mon article d’introduction pour en savoir plus sur le CrUX.

Core Web Vitals
Exemples de chiffres du CrUX sur SINGULART, n'ayant pas assez de visites sur ma page de démo

Comprendre en dĂ©tail d’oĂč vient le CLS : WebPageTest

WebPageTest peut ĂȘtre considĂ©rĂ© comme une alternative Ă  une analyse de la page dans l’onglet Performance des DevTools de Chrome. Je le privilĂ©gie parce que je trouve qu’il est plus facile d’y faire la corrĂ©lation entre le chargement d’une ressource et l’origine du CLS.

Notamment, aprÚs avoir lancé un audit, si vous cliquez sur un Filmstrip, vous vous retrouverez avec une vue comme celle-ci :

Filmstrip représentant comme la page se charge : d'abord une page blanche, puis avec des couleurs, ensuite avec les fonts, et enfin avec le bandeau de notification
Filmstrip view de la page d'exemple

Si vous lisez l’article sur mobile, vous aurez du mal Ă  le constater, mais les frames avec du Layout Shift sont encadrĂ©es en pointillĂ© (orange ou rouge). Cela donne assez rapidement une comprĂ©hension de ce qui provoque du Layout Shift :

  • Le chargement des fonts
  • L’apparition du bandeau de notification

En ajustant les paramĂštres de Web Page Test vous pouvez aussi configurer le FilmStrip (“Adjust Filmstrip Settings”) pour raccourcir l’interval entre chaque frame (0.5s, 0.1s, 60FPS, etc.) et cocher “Highlight Layout Shift” pour comprendre prĂ©cisĂ©ment l’origine du Layout Shift.

Le mĂȘme screenshot que ci-dessus mais cette fois-ci avec les parties qui impactent le Layout Shift en rouge
Filmstrip view avec l'option "Highlight Layout Shift" activée

TrĂšs pratique pour mettre en Ă©vidence le cƓur du problĂšme et Ă  quel point est-ce que cela influence le CLS. Par exemple, sur le Layout Shift associĂ© au chargement des fonts, juste en dessous du screenshot, on voit que la valeur est de 0.001. C’est trĂšs faible et donc pas impactant pour le commun des mortels : inutile d’essayer de le corriger. Par contre, on va devoir se pencher sur la question du bandeau.

GĂ©nĂ©ralement je commence Ă  me pencher sur du CLS si on est au delĂ  de 0.01 mĂȘme si la recommendation de Google est de ne pas dĂ©passer 0.1. Ca ne veut pas dire qu’il y aura forcĂ©ment quelque chose Ă  corriger, simplement que cela vaut le coup de comprendre ce qui se passe pour savoir s’il y a un problĂšme plus large qui mĂ©rite d’ĂȘtre adressĂ©.

Analyse le comportement lors de l’interaction : DevTools Chrome, onglet Performance

WebPageTest est donc un trĂšs bon outil pour analyser le chargement de la page. Cependant, comme j’ai pu l’évoquer prĂ©cĂ©demment, le CLS ne concerne pas que le chargement initial : si vous scrollez tout en bas de votre page et que vous cherchez Ă  cliquer dans votre footer mais qu’un bandeau de Newsletter apparaĂźt juste au dessus au moment du clic, vous aurez aussi du Layout Shift.

Ainsi, vous pouvez vous retrouver avec Lighthouse, WebPageTest & co qui vous disent que votre CLS est Ă  0 et quand mĂȘme constater du CLS dans le CrUX. Pour cette raison, je vous conseille vivement de mettre en place des RUM afin de placer des sondes chez les vrais utilisateurices de votre site. GrĂące Ă  cela, vous aurez une vue beaucoup plus fine (et cross-browser) que ce que peut proposer le CrUX qui vous dira si vous avez du CLS Ă  rĂ©gler ou non.

Mais une fois que vous savez que vous avez des problĂšmes, comment savoir prĂ©cisĂ©ment d’oĂč ils viennent ?

Personnellement, j’utilise les DevTools de Chrome, notamment dans l’onglet Performance :

  1. Charger votre page web
  2. Cliquer sur le petit icone “Record” en haut à gauche
  3. Naviguer dans la page (dans mon cas, je survol une des images de la grille)
  4. Recliquer sur l’icone afin d’arrĂȘter l’enregistrement
Screenshot de l'onglet performance de Chrome aprÚs avoir réalisé un enregistrement
Démonstration d'un enregistrement de performance dans Chrome en faisant entrer puis sortir la souris d'une image sur la page d'exemple

En dessous de la timeline, vous pouvez voir plusieurs lignes diffĂ©rentes : Frames, Animation, Timings, Layout Shifts, Main, etc. Selon la page et l’interaction que vous avez rĂ©alisĂ©, le nombre de lignes affichĂ©es peut changer. Notamment, si vous n’avez pas du tout de CLS, la ligne Layout Shifts n’apparaĂźtra pas du tout.

Par contre, dans notre cas prĂ©sent, pendant la durĂ©e de l’animation (~1000-1200ms et ~1800ms-2000ms) nous pouvons constater qu’il y a bel et bien du Layout Shift. En cliquant sur les petites boĂźtes violettes, le navigateur va mettre en surbrillance l’élĂ©ment concernĂ© dans la page. De plus, en bougeant la souris sur la zone des screenshots, on va pouvoir faire le parallĂšle entre Layout Shift et ce qui s’est passĂ© Ă  l’écran.

Démonstration de comment voir le Layout Shift et faire le parallÚle avec les screenshots - j'y redis exactement ce que j'explique au dessus

Avec tout ça, on sait donc ce qui a bougĂ© Ă  l’écran et sur quel Ă©lĂ©ment du DOM il faut plus particuliĂšrement se concentrer.

Rendre le CLS visible pendant les développements

Les outils que je vous ai prĂ©sentĂ© ci-dessus sont pratiques quand vous ĂȘtes en phase de recherche ou d’audit. Cependant, il peut ĂȘtre intĂ©ressant d’ĂȘtre prĂ©venu pendant vos devs sans forcĂ©ment que cela vienne de vous.

Pour cela, l’extension Web Vitals vous permet Ă  tout moment de savoir si la page que vous ĂȘtes en train de visiter respecte les critĂšres de performance ou non. TrĂšs utile donc pendant les dĂ©veloppements.

L’inconvĂ©nient que je lui trouve est qu’elle ne reste pas active pendant toute la durĂ©e de la page mais uniquement sur le chargement initial. Le CLS qui surgit lors d’interactions n’est donc pas pris en considĂ©ration.

Ainsi, je prĂ©fĂšre utiliser le WebPerf Snippet CLS qui fait partie de toute une liste de snippets trĂšs utile Ă  l’analyse de la performance de vos pages webs.

Correction du CLS

Avec les outils mentionnĂ©s ci-dessus, on a donc tout ce qu’il faut pour comprendre d’oĂč vient le CLS. C’est Ă  mon sens la partie la plus complexe. Il nous reste maintenant plus qu’à corriger les Ă©lĂ©ments qui posent problĂšmes, un par un, petit Ă  petit.

Pour cet article, j’ai rassemblĂ© 3 cas (et demi) qui selon moi sont les plus frĂ©quents dans les dĂ©veloppements quotidiens. Vous tomberez certainement sur d’autres situations trĂšs spĂ©cifiques, mais en ayant bien compris ces cas, vous devriez avoir les bases nĂ©cessaires pour les adapter Ă  votre propre besoin.

Réserver la bonne place pour des images/iframes/videos

Si on revient au diagnostic Lighthouse, un conseil mis en avant était :

Les Ă©lĂ©ments d’image ne possĂšdent pas de width ni de height explicites

En effet, par dĂ©finition, le navigateur n’est pas capable de rĂ©server la bonne place dans la page s’il ne sait pas ce qu’il doit afficher. Est-ce que l’image tĂ©lĂ©chargĂ©e sera verticale ou horizontale ? Il ne le sait pas. Ainsi, par dĂ©faut, le navigateur allouera 0px Ă  l’image puis changera le layout une fois celle-ci tĂ©lĂ©chargĂ©e.

La mĂ©thode est donc de prĂ©venir le navigateur avant qu’il ait tĂ©lĂ©chargĂ© l’image. Pour ça il nous faut ajouter les attributs width et height:

 <img
 	alt="Un chat gris bronze dans les doux rayons de soleil matinaux"
	src="chat.png"
+	width="320"
+	height="240"
 >

cf. Commit qui corrige la page de démo

Cette mĂ©thode marchera pour la plupart des contenus que l’on peut mettre au milieu d’une page : img, iframe, video, etc.

AccĂ©der Ă  cette width et height n’est pas toujours Ă©vident selon la maniĂšre dont les images que vous manipulez sont gĂ©rĂ©es. Cela dit, si jamais vous ĂȘtes en train de concevoir un systĂšme d’upload d’image dans votre backend, je vous conseille vivement de rĂ©cupĂ©rer les dimensions des images au moment de l’enregistrement de l’image dans votre BDD. Elles ne vous seront peut-ĂȘtre pas utile immĂ©diatement, mais cela a toujours fini par payer sur les projets auxquels j’ai contribuĂ©.

Que faire quand width et height ne suffisent pas ?

Il reste des cas problĂ©matiques que je ne peux pas Ă©numĂ©rer tant ils sont spĂ©cifiques Ă  votre situation. Cependant, gĂ©nĂ©ralement, la solution est de passer par CSS pour le rĂ©soudre. Notamment, l’enjeu va ĂȘtre soit d’essayer de jouer avec les propriĂ©tĂ©s width et height en utilisant des valeurs spĂ©cifiques (100%, 100vh, etc.), soit en dĂ©finissant des ratios. La solution moderne pour cela est d’écrire :

img {
	width: 100%;
	height: auto;
	aspect-ratio: 3 / 4;
}

Ainsi, peu importe les attributs et votre image, vous ĂȘtes sĂ»rs que l’image prendra le plus de place possible mais que son ratio restera toujours 3:4. C’est d’ailleurs ce que fait votre navigateur quand vous dĂ©finissez les attributs width et height dans le HTML : il va gĂ©nĂ©rer automatiquement une propriĂ©tĂ© aspect-ratio: width / height.

A l’heure actuelle c’est supportĂ© par tous les navigateurs evergreen, mais c’est encore assez rĂ©cent pour Safari. Nous n’avons donc que 90% des navigateurs qui le supportent.

Cela peut toutefois parfaitement ĂȘtre utilisĂ© en tant que Progressive Enhancement, et a l’avantage d’ĂȘtre utilisable sur n’importe quel type de balise.

Réserver la bonne place pour du contenu asynchrone

Le second point Ă  amĂ©liorer, que l’on a vu grĂące Ă  notre audit WebPageTest, est le bandeau chargĂ© de maniĂšre asynchrone.

Dans la page d’exemple, j’ai fait une balise p qui apparaĂźt au bout de 3s avec un petit bout de JS. C’est un exemple faussĂ©, mais qui reprĂ©sente :

  • une hellobar ou tout bandeau qui apparaĂźt aprĂšs le premier affichage de votre page, tout en haut du site
  • ou un bandeau de pub

Dans cette situation, vous avez 2 types de solutions :

  1. vous faites en sorte que ce soit gĂ©rĂ© Ă  la gĂ©nĂ©ration de la page plutĂŽt que de le faire en JS : ainsi, le premier affichage pour l’utilisateurice est le bon. C’est souvent la meilleure solution d’un point de vue utilisateurice. L’inconvĂ©nient est que ça peut aussi ralentir le premier affichage de la page et donc n’est pas tout le temps dans le champ des possibles.
  2. vous rĂ©servez suffisamment de place dans la page pour qu’aprĂšs chargement, le nouvel Ă©lĂ©ment vienne remplacer une zone tampon. En UI, on parle souvent de Skeleton : prĂ©parer la page avec du contenu qui mimique l’état final, mais qui est vide.

Dans mon cas, j’ai dĂ©fini en dur la hauteur qu’est censĂ© prendre le bandeau final, et j’ai ajoutĂ© un lĂ©ger effet de scanner en CSS pour montrer qu’il s’agit d’un Ă©tat temporaire.

Démonstration de comment voir le Layout Shift et faire le parallÚle avec les screenshots - j'y redis exactement ce que j'explique au dessus
Exemple de code CSS qui pour afficher le placeholder (cf. Commit)
.hellobar {
	/* L'idée est d'indiquer la hauteur qu'est censé prendre la hellobar une fois terminée */
	/* Utiliser min-height plutÎt que height vous permettra d'éviter de casser les choses si
    finalement la hellobar finale est plus grande que prévue */
	min-height: 8rem;
}

/* Si la taille est différente sur desktop que sur mobile, utilisez des @media */
@media (min-width: 1059px) {
	.hellobar {
		min-height: 3.5rem;
	}
}

/* Partie qui concerne l'effet scanner */
.hellobar--placeholder {
	position: relative;
}
.hellobar--placeholder::before {
	content: '';
	position: absolute;
	inset: 0;
	background: #eee;
}
.hellobar--placeholder::after {
	content: '';
	position: absolute;
	inset: 0;
	background: #eee;
	background: linear-gradient(90deg, #eee, #fafafa, #eeeeee);
	background-size: 200px 100%;
	background-repeat: no-repeat;
	animation: placeholderAnimation 2s infinite;
}

@keyframes placeholderAnimation {
	0% {
		background-position: -200px 0;
	}
	100% {
		background-position: calc(200px + 100%) 0;
	}
}

C’est quand mĂȘme vachement mieux non ?

Eviter de déplacer du contenu par animation

Enfin, dans la section oĂč je vous prĂ©sentais l’onglet Performance des Chrome DevTools, nous avons vu qu’il y avait du Layout Shift sur l’animation de la description d’une image au moment ou l’utilisateurice passe sa souris dessus.

💡 DĂ©placer au survol du contenu qui doit ĂȘtre cliquable : c’est globalement mauvaise idĂ©e. Vous naviguez sur la page, vous essayez de viser un lien et surprise, quand vous vous en approchez, il se dĂ©place. Essayez donc d’éviter ce genre d’animations. Et c’est certainement la premiĂšre question que vous devriez vous poser quand vous adressez des sujets de CLS : est-ce qu’il est plus pertinent de supprimer le comportement qui posait problĂšme ou dois-je trouver une maniĂšre de le corriger techniquement ?

Dans le cadre de cet article, nous allons nous obstiner, notamment parce que la solution technique est intĂ©ressante et pourra vous servir. En effet, nous avons du Layout Shift parce que l’animation se passe en changeant la propriĂ©tĂ© CSS padding-bottom. Or, quand on change cette propriĂ©tĂ©, le navigateur est obligĂ© de refaire une phase de Layout : il doit recalculer les positions de vos Ă©lĂ©ments dans le DOM avant de s’assurer que rien ne dĂ©passe. Potentiellement cette Ă©tape est trĂšs coĂ»teuse et on veut absolument l’éviter afin de garder des animations performantes sur mobile. C’est donc ce que nous allons faire.

Tout d’abord, avant de procĂ©der au changement, je vous invite Ă  lire mon article sur les animations performantes oĂč j’explique en dĂ©tail le fonctionnement du navigateur et donc ce qu’il faut avoir en tĂȘte pour faire des animations performantes.

Ce qu’il faut en retenir c’est qu’il faut Ă  tout prix essayer de n’animer que les propriĂ©tĂ©s CSS transform et opacity, parce que ce sont celles qui demanderont le moins de travail au navigateur (il n’y aura pas de Layout).

L’astuce ici est d’imaginer le contenu lĂ©gĂšrement diffĂ©remment. PlutĂŽt que d’agrandir le padding-bottom, je vais dĂšs le dĂ©part prĂ©voir le padding-bottom: 3rem, et pendant l’animation je vais prĂ©fĂ©rer animer la propriĂ©tĂ© transform: translateY(-3rem).

Screenshot de l'onglet performance de Chrome aprÚs avoir réalisé un enregistrement

Et pour Ă©viter que le background dĂ©passe dans son Ă©tat initial, il ne nous reste plus qu’à ajouter un overflow: hidden. GrĂące Ă  cette mĂ©thode, je ne fait que dĂ©placer ma balise plutĂŽt que de changer sa taille.

cf. Commit qui corrige la page de démo

Screenshot de l'onglet performance de Chrome aprÚs avoir réalisé un enregistrement
Nouvel audit aprÚs avoir utilisé transform

Si on relance un record dans les DevTools, on a bien la ligne “Layout Shifts” qui a disparu. 🎉

Bonus : le piĂšge de l’unitĂ© ch

Un dernier point que je mentionne au passage est l’impact du chargement des fonts sur votre CLS. Je vous avais prĂ©sentĂ© il y a 3 semaines comment bien gĂ©rer le chargement de vos fonts, notamment en parlant de preload, de size-adjust et d’ascent-override qui sont autant de choses Ă  prendre compte pour amĂ©liorer la performance ressenti.

Cependant un point que je n’avais pas dĂ©taillĂ©, parce qu’il ne s’agit pas de l’utilisation de la font elle mĂȘme, est l’utilisation de l’unitĂ© CSS ch.

En effet, cette unitĂ© un peu particuliĂšre permet de prĂ©ciser une longueur Ă  partir de la taille du caractĂšre 0 dans votre police. Cette unitĂ© est gĂ©nĂ©ralement utilisĂ©e pour caractĂ©riser des largeur maximales dans vos textes. Notamment, en ergonomie on considĂšre que pour qu’un paragraphe soit lisible il faut qu’il soit entre 50 et 90 caractĂšres. Je prends une fourchette trĂšs grande parce que tout le monde n’est pas d’accord et que ça dĂ©pend de pleins de facteurs (un mobile ? un desktop ? quel genre de contenu ?). Mais dans l’idĂ©e on peut imaginer max-width: 70ch;

Or, ce que vous pouvez constater c’est que 0 ou 0 n’ont pas la mĂȘme largeur. A quelques pixels ou dixiĂšme de pixels prĂšs, mais cette diffĂ©rence existe. Et en multipliant cette diffĂ©rence par 70, on se retrouve avec d’assez grosses diffĂ©rences entre la largeur maximale de votre paragraphe selon si c’est la police de fallback (que ce soit FOUT ou FOIT) ou la police dĂ©finitive qui est affichĂ©e.

Ainsi pour Ă©viter au navigateur de recalculer la taille de vos colonnes et de vos textes, Ă©vitez d’utiliser l’unitĂ© ch.

Récapitulatif

Nous voilĂ  arrivĂ© au bout de cet article dĂ©diĂ© au CLS. La notion de Layout Shift est certainement moins Ă©vidente que d’autres mĂ©triques de performance. Mais avec les bons outils, c’est aussi la plus dĂ©finitive Ă  corriger. C’est pour cette raison qu’un bon score devrait ĂȘtre < 0.1.

Les outils à disposition sont multiples mais je vous conseille de :

  • Commencer par comprendre Ă  quel point est-ce que vos vrais utilisateurices sont impactĂ©s par le CLS ? Via des RUM ou a minima via le Chrome UX Report ;
  • Analyser le chargement de la page problĂ©matique avec WebPageTest pour mieux visualiser l’origine du problĂšmeproblĂšme ;
  • RĂ©cupĂ©rer quelques pistes gĂ©nĂ©riques grĂące Ă  un audit Lighthouse ;
  • Utiliser l’onglet Performance des DevTools si WebPageTest et Lighthouse indiquent 0 de CLS mais que vos utilisateurices en ont quand mĂȘme.

Les quelques bonnes pratiques Ă  garder en tĂȘte :

  • Toujours rĂ©fĂ©rencer la taille d’un Ă©lement pour que le navigateur puisse anticiper leur affichage
    • via des attributs width et height
    • ou en Ă©vitant des tailles dynamiques en CSS
  • PrivilĂ©gier des Skeletons pour tout chargement asynchrone de contenu
  • Faire attention aux animations afin de n’animer que des propriĂ©tĂ©s performantes (e.g. transform et opacity)
  • Si vous faites parti des rares Ă  utiliser ch, arrĂȘtez 😘 (moi aussi j’en fais toujours le deuil)

GrĂące Ă  ces diffĂ©rentes techniques, nous n’avons plus de CLS sur la page de dĂ©mo (dans sa version corrigĂ©e).

Enfin, si vous cherchez plus d’infos autour du CLS et que vous aimez les formats vidĂ©os, je vous conseille vivement la conf de RaphaĂ«l Goetter.

En tout cas, j’espĂšre que cet article vous aura Ă©tĂ© utile et que, grĂące Ă  celui-ci, vous allez rendre vos sites plus utilisables. Si vous ĂȘtes face Ă  un problĂšme Ă©pineux ou simplement que vous avez besoin de renfort sur ces sujets, n’hĂ©sitez pas Ă  me contacter.

En ce qui me concerne, je vais continuer Ă  Ă©crire rĂ©guliĂšrement des articles autour de la Web Performance. Il y en a au moins 2 dans les bacs, alors n’hĂ©sitez pas Ă  me suivre sur les rĂ©seaux sociaux (Mastodon, LinkedIn ou Twitter) et Ă  me dire ce que je devrais amĂ©liorer pour la suite.

đŸ˜¶â€đŸŒ«ïž


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 :)