Cumulative Layout Shift (CLS) : guide complet

Comprendre le Cumulative Layout Shift : formule impact-distance, fenêtres de session, seuils, écarts entre terrain et laboratoire, causes et corrections.

Première publication : 26 juin 2026 · Dernière mise à jour : 13 août 2026 · Advanced
Langues

Le CLS mesure les mouvements inattendus du contenu visible. Il retient la plus grande fenêtre de déplacements, selon leur surface et leur distance. Au 75e percentile, 0,1 ou moins est bon. Réservez les dimensions des médias et intégrations, ajustez les polices et utilisez transform pour les animations. Vérifiez CrUX, car un test Lighthouse court peut manquer les mouvements tardifs.

En bref — Le CLS est le Core Web Vital de la stabilité visuelle. Chaque déplacement vaut impact fraction × distance fraction ; la métrique retient la plus grande fenêtre de session (au plus 1 s entre deux déplacements et 5 s au total), et non la somme sur toute la durée de la page comme avant juin 2021. Au 75e percentile des données de terrain, un score ≤ 0,1 est bon, jusqu’à 0,25 il faut l’améliorer, et au-delà il est mauvais. Seuls les mouvements visibles dans le viewport comptent ; ceux survenant dans les 500 ms après une interaction discrète sont exclus, contrairement au défilement. Les corrections consistent surtout à réserver l’espace, ajuster les polices et animer uniquement avec transform. Lighthouse peut afficher presque zéro parce qu’il ne reproduit ni les interactions ni toute la durée de vie ; Google utilise les données CrUX de terrain.

Ce que mesure le CLS

Google le définit ainsi : “Cumulative Layout Shift (CLS) is a stable Core Web Vital metric. It’s an important, user-centric metric for measuring visual stability because it helps quantify how often users experience unexpected layout shifts.” (traduction) « Le Cumulative Layout Shift est une métrique Core Web Vital stable, centrée sur l’utilisateur, qui mesure la stabilité visuelle en quantifiant la fréquence des déplacements inattendus. » Le mot décisif est inattendu : le contenu bouge seul, sans action de l’utilisateur.

Il complète le Largest Contentful Paint pour le chargement et l’Interaction to Next Paint pour la réactivité. LCP et INP sont exprimés en millisecondes ; le CLS est un rapport sans unité. Un CLS de 0,05 ne représente donc pas 50 ms.

La formule : impact × distance

Pour chaque déplacement, Google définit :

layout shift score = impact fraction × distance fraction
  • La fraction d’impact “measures how unstable elements impact the viewport area between two frames” (traduction) « mesure la surface du viewport affectée par les éléments instables entre deux images » : elle rapporte au viewport la zone visible combinée avant et après le mouvement.
  • La fraction de distance correspond à “the greatest horizontal or vertical distance any unstable element has moved in the frame divided by the viewport’s largest dimension (width or height, whichever is greater).” (traduction) « la plus grande distance horizontale ou verticale parcourue par un élément instable, divisée par la plus grande dimension du viewport. »

Les deux dimensions comptent séparément. Un petit objet traversant presque tout l’écran et un grand objet bougeant à peine peuvent obtenir des scores très différents. Dans l’exemple de web.dev, une fraction d’impact de 0.75 multipliée par une fraction de distance de 0.25 donne un score de 0.1875.

One shift scores the visible area affected multiplied by the farthest movement relative to the viewport. Source : web.dev

Three cards form the equation. Impact fraction is 0.75: the visible viewport area affected between two frames. Distance fraction is 0.25: the farthest movement divided by the viewport's largest dimension. Multiplying them produces a unitless individual layout-shift score of 0.1875. CLS ultimately keeps the largest session-window total, not a lifetime sum of every shift.

© Patrick Stox LLC · CC BY 4.0 ·

Fenêtres de session : la règle souvent mal comprise

Voici le point essentiel : le CLS n’est pas la somme de tous les déplacements pendant toute la durée de vie de la page. Cette ancienne définition a changé en juin 2021.

Aujourd’hui, “CLS measures the largest burst of layout shift scores for every unexpected layout shift that occurs during the entire lifecycle of a page.” (traduction) « le CLS mesure la plus grande rafale de scores parmi tous les déplacements inattendus pendant toute la durée de vie de la page. » Une fenêtre de session regroupe “one or more individual layout shifts occur in rapid succession with less than 1-second in between each shift and a maximum of 5 seconds for the total window duration.” (traduction) « un ou plusieurs déplacements rapprochés, espacés de moins d’une seconde, sur une durée totale maximale de cinq secondes. » Le CLS retient la plus grande fenêtre, ni la somme ni la moyenne.

Evidence for this claim CLS uses the largest session window of unexpected layout shifts, with gaps under one second and a maximum five-second window; recent discrete input can exclude a shift. Scope: Current CLS session-window and recent-input rules. Confidence: high · Verified: web.dev: Cumulative Layout Shift

L’ancienne somme pénalisait discrètement les pages longues. Une application monopage ou un fil infini accumulait du CLS simplement en restant ouvert, même avec de petits déplacements espacés. L’équipe Chrome a adopté la fenêtre maximale afin de ne plus pénaliser la durée et a préféré le maximum à la moyenne pour éviter qu’une petite correction secondaire augmente paradoxalement le score. Lors du déploiement, aucune origine n’a empiré, la plupart sont restées stables et certaines interfaces lentes ou infinies se sont améliorées. Les articles parlant encore de « somme de tous les déplacements » sont obsolètes.

Ce qui compte — et ce qui ne compte pas

Trois exclusions déterminent le score :

  • Sous la ligne de flottaison, aucun effet. Seuls les mouvements du contenu visible dans le viewport actuel sont comptés. Priorisez donc ceux qui affectent l’écran.
  • Une action utilisateur ouvre une fenêtre de 500 ms. “Layout shifts that occur within 500 milliseconds of user input will have the hadRecentInput flag set, so they can be excluded from calculations.” (traduction) « Les déplacements survenant dans les 500 millisecondes suivant une action utilisateur portent le drapeau hadRecentInput et peuvent être exclus. » Google juge acceptables les mouvements “that occur in response to user interactions… are generally fine, as long as the shift occurs close enough to the interaction that the relationship is clear to the user.” (traduction) « provoqués par une interaction, si leur proximité rend la relation évidente. »
  • Le défilement n’est pas exempté. L’exclusion vise seulement les événements discrets : toucher, cliquer ou presser une touche. Les gestes continus, défilement et pincement, ne déclenchent pas cette fenêtre.
Evidence for this claim A layout shift occurring within 500 milliseconds of a qualifying recent user input has hadRecentInput set and is excluded from CLS. Scope: field and lab Confidence: high · Verified: Cumulative Layout Shift (CLS)

Seuils et origine du score

“To provide a good user experience, sites should strive to have a CLS score of 0.1 or less,” (traduction) « Pour offrir une bonne expérience, les sites devraient viser un CLS inférieur ou égal à 0,1, » mesuré au “the 75th percentile of page loads, segmented across mobile and desktop devices.” (traduction) « 75e percentile des chargements, séparément sur mobile et ordinateur. »

Evidence for this claim CLS is good at 0.1 or less and poor above 0.25, assessed at the 75th percentile of page loads. Scope: Current web.dev CLS field thresholds. Confidence: high · Verified: web.dev: Cumulative Layout Shift
  • Bon : ≤ 0,1
  • Amélioration nécessaire : de 0,1 à 0,25
  • Mauvais : > 0,25
Evidence for this claim CLS is good at 0.1 or less and poor above 0.25, assessed at the 75th percentile of page loads. Scope: Current web.dev CLS field thresholds. Confidence: high · Verified: web.dev: Cumulative Layout Shift

Le seuil de 0,1 n’est pas arbitraire. Les études de Google ont constaté que “levels of shift from 0.15 and higher were consistently perceived as disruptive, while shifts of 0.1 and lower were noticeable but not excessively disruptive.” (traduction) « les déplacements de 0,15 ou plus étaient systématiquement perçus comme gênants, tandis que ceux de 0,1 ou moins restaient perceptibles sans être excessivement perturbants. » Un seuil plus strict aurait aussi été peu réaliste face aux intégrations tierces.

La mention du 75e percentile des données de terrain est essentielle et mène au principal piège de mesure.

Laboratoire et terrain : pourquoi les chiffres divergent

Lighthouse et les autres outils de laboratoire affichent souvent un CLS proche de 0 alors que les données de terrain sont bien pires. Ce n’est pas une tromperie, mais une différence de portée. Un test court et scénarisé ne défile pas, ne clique pas et ne reste pas longtemps ; il ne voit que les déplacements du chargement initial. CrUX agrège de vraies visites sur de nombreux appareils et toute la durée de vie de la page : menus, contenus différés et publicités tardives. Un test bref ne peut structurellement pas tout observer.

Règle pratique : utilisez le laboratoire pour diagnostiquer un déplacement et le terrain pour connaître le vrai score. Google s’appuie sur CrUX, visible dans PageSpeed Insights et Search Console. Si Lighthouse indique 0 mais PSI 0,18, reproduisez en laboratoire le parcours réel qui déclenche le mouvement. Autres angles morts : les outils de laboratoire ne propagent généralement pas les déplacements d’iframe au document parent, et le RUM fondé sur l’API Layout Instability partage cette limite.

Causes fréquentes

Dans l’ordre approximatif où je les rencontre :

  1. Images et vidéos sans dimensions. Aucun espace n’est réservé avant leur arrivée.
  2. Publicités, intégrations et iframe sans emplacement stable. Leurs dimensions sont souvent dynamiques.
  3. Contenu injecté au-dessus du contenu existant. Bannières, notifications, recommandations et promotions repoussent ce qui est déjà visible.
  4. Polices Web (FOIT/FOUT). Des métriques différentes redistribuent le texte au remplacement.
  5. Animations de propriétés de mise en page. Animer top, left, margin, box-shadow ou box-sizing force une nouvelle mise en page à chaque image.

Corrections

Chaque correction répond à sa cause :

  • Images et vidéos : réservez l’espace. Définissez width et height, conservez img { height: auto; width: 100%; } pour le responsive, ou utilisez aspect-ratio.
  • Publicités, iframe et intégrations : même principe. Utilisez min-height ou aspect-ratio. Google recommande : “Setting a fixed height and width directly on the ad slot div is the most effective way to do this.” (traduction) « Définir directement une hauteur et une largeur fixes sur le div publicitaire est la méthode la plus efficace. » Pour plusieurs formats, réservez le plus grand.
  • Contenu dynamique : ne l’insérez pas dans le flux. Réservez un emplacement aux dimensions finales ou superposez-le. Un squelette n’aide que s’il correspond exactement.
  • Polices : faites correspondre les métriques. La propriété font-display, notamment avec la valeur font-display: optional, limite le risque ; avec swap, employez size-adjust, ascent-override, descent-override et line-gap-override, puis préchargez les polices critiques.
  • Animations : uniquement transform. Les transformations compositées ne déclenchent pas de nouvelle mise en page.

Place du CLS dans le classement — gardez les proportions

Le CLS contribue au signal d’expérience sur la page. Google indique que ses systèmes utilisent les Core Web Vitals, sans publier de poids précis, de règle de départage ni de garantie. Traitez toute mécanique spécifique comme une approximation. Mon conseil : atteignez la zone « bonne », puis passez à autre chose. Réduire 0,08 à 0,02 produit rarement à lui seul un gain de classement ou de chiffre d’affaires. Le CLS est un prérequis, pas le centre d’une stratégie SEO au détriment de LCP, INP ou du contenu.

Deux remarques opérationnelles évitent beaucoup de confusion :

  • CrUX couvre une fenêtre glissante d’environ 28 jours. Une correction ne se reflète complètement dans PSI ou Search Console qu’après plusieurs semaines.
  • L’élément attribué n’est souvent pas la cause racine. L’API indique l’élément déplacé, mais web.dev précise : “it’s possible that these elements are only indirectly related to the ‘root cause’ of layout instability.” (traduction) « ces éléments peuvent n’être qu’indirectement liés à la cause racine de l’instabilité. » Le texte déplacé peut être victime d’une image sans dimensions située au-dessus. Notez l’horodatage, puis cherchez dans la même fenêtre une requête terminée, une image ou police arrivée, un redimensionnement ou un changement de classe.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.