LCP : comment optimiser le Largest Contentful Paint

Comment identifier l’élément LCP, sa ressource et son chemin de livraison, puis vérifier les améliorations sur l’URL concernée avec des données terrain et de laboratoire.

Le Largest Contentful Paint (LCP) est la métrique des Core Web Vitals qui influence le classement Google depuis 2021. Ce n’est pas un simple chiffre technique : il reflète la vitesse à laquelle l’utilisateur perçoit la page comme chargée. Un mauvais LCP signifie que les visiteurs voient un écran vide ou une image principale (hero) non chargée, et qu’ils quittent la page avant l’apparition du contenu.

Chronologie du chargement : le LCP se déclenche au moment où le plus grand élément de la fenêtre d’affichage est affiché à l’écran. L’objectif : rester dans la zone verte, sous 2,5 secondes.
Selon Google, faire passer le LCP de « mauvais » à « bon » réduit le taux de rebond de 24  % en moyenne. Sur les sites e-commerce, cela a un impact direct sur les conversions.

Qu’est-ce que le LCP et pourquoi il compte

Le LCP mesure le temps écoulé entre le début de la navigation et le moment où le plus grand élément de contenu (texte ou image) devient visible dans la fenêtre d’affichage. C’est le seuil que Google utilise pour considérer que le chargement est « terminé » du point de vue de l’expérience utilisateur.

Contrairement au FCP (First Contentful Paint), qui se déclenche au premier pixel, le LCP suit précisément le contenu utile. Une page peut afficher un spinner à 0,3 s, mais si l’image principale n’apparaît qu’à 5 s, le LCP vaut 5 s.

< 2,5 s

LCP bon

Seuil « bon » de Google. La cible pour la plupart des pages

2,5–4 s

À améliorer

Zone jaune : le LCP est perceptible par les utilisateurs, une optimisation est nécessaire

> 4 s

LCP mauvais

Zone rouge : dégradation importante de l’expérience utilisateur et du classement

75e

Percentile CrUX

Google évalue le LCP au 75e percentile des utilisateurs réels de Chrome

Google utilise les données du Chrome User Experience Report (CrUX), c’est-à-dire des mesures issues de vrais utilisateurs de Chrome. Votre score de laboratoire dans PageSpeed Insights peut être vert alors que CrUX affiche du jaune. Privilégiez les données terrain CrUX : ce sont elles que Google utilise pour ses décisions de classement.

Quels éléments le navigateur considère comme candidats au LCP

Le navigateur ne suit pas chaque élément : il surveille certains types précis et retient, au moment où le chargement se termine, le plus grand par surface dans la fenêtre d’affichage.

Éléments <img>
Images standard. Le candidat LCP le plus courant sur la plupart des pages. Le temps mesuré correspond au moment où l’image décodée apparaît dans la fenêtre d’affichage.
<image> dans un SVG
Images placées dans des éléments SVG. Elles sont traitées comme les éléments img pour le LCP.
background-image en CSS
Images de fond définies en CSS. Point clé : le navigateur ne lance pas le chargement d’une background-image tant que le CSSOM n’est pas construit. C’est l’une des principales sources de retard du LCP.
Blocs de texte
Paragraphes <p>, titres <h1> à <h6>, <div> et autres éléments contenant du texte. Si un bloc de texte est plus grand que n’importe quelle image, il devient le LCP.
<video> avec poster
L’image de poster d’un élément vidéo (attribut poster). Si la vidéo occupe la majeure partie de l’écran, le poster doit se charger le plus vite possible.
Les éléments placés dans une <iframe> et les éléments sans taille visuelle (display: none, visibility: hidden, opacity: 0) ne sont pas comptés comme LCP. Si votre bannière principale est masquée avant l’initialisation du JS, le LCP peut être mesuré sur un élément complètement différent.

Comment se décompose le temps LCP

Google décompose le LCP en 4 sous-composantes. Comprendre chacune d’elles est la clé pour bien diagnostiquer et hiérarchiser les optimisations.

ComposantCe qu’il mesurePart typique
TTFB (Time to First Byte)Temps jusqu’à l’arrivée du premier octet du HTML depuis le serveur10–40  %
Délai de chargement de la ressourceÉcart entre le TTFB et le début du chargement de la ressource LCP10–30  %
Durée de chargement de la ressourceTemps de téléchargement de la ressource LCP elle-même (image, police)30–60  %
Délai de rendu de l’élémentÉcart entre la fin du chargement de la ressource et son apparition dans la fenêtre d’affichage0–20  %

Règle : attaquez d’abord la composante la plus lourde. Si le TTFB représente 3 secondes sur les 5 du LCP, optimiser les images n’aura qu’un impact minime. Corrigez d’abord le temps de réponse du serveur.

Principales causes d’un LCP lent

90  % des mauvais scores LCP ont les mêmes causes profondes. Le diagnostic prend 15 minutes dans DevTools ou PageSpeed Insights.

TTFB élevé

Le serveur répond en plus de 600 ms. Causes : absence de cache, hébergement peu performant, requêtes de base de données lourdes, absence de CDN. Avec un TTFB supérieur à 800 ms, atteindre un LCP inférieur à 2,5 s est presque impossible sans autres optimisations.

Images non optimisées

L’image LCP pèse 500 Ko ou plus en JPEG, contre 80 Ko en WebP ou AVIF. Il n’y a pas d’attribut fetchpriority="high" ni de preload. Le navigateur découvre l’image tardivement et la charge lentement.

Ressources bloquant le rendu

Le CSS et le JS placés dans le <head> sans async ni defer bloquent le rendu. Tant que le navigateur ne les a pas chargés et exécutés, l’élément LCP ne peut pas apparaître. Chaque script supplémentaire dans le head ajoute du délai.

Chargement lent des polices

Si le LCP est un bloc de texte et que la police met plus de 2 secondes à charger, le navigateur affiche un texte invisible (FOIT) ou une police système (FOUT). Le délai avant l’affichage du texte correct correspond au LCP.

Lazy load sur l’élément LCP

L’attribut loading="lazy" sur l’image principale est l’une des erreurs les plus fréquentes. Le navigateur retarde volontairement le chargement, ce qui pénalise directement le LCP.

LCP en rendu côté client

Dans les SPA (React, Vue, Angular) sans SSR, le contenu est généré dans le navigateur par JavaScript. Le navigateur reçoit un HTML vide, charge le JS, puis affiche le contenu. Toute cette chaîne s’additionne dans le LCP.

Comment optimiser le LCP : un plan étape par étape

L’optimisation du LCP ne repose pas sur une astuce unique : c’est un ensemble d’améliorations liées entre elles. Travaillez dans l’ordre, en commençant par les actions au plus fort impact.

Étape 1 : ramener le TTFB à 200–400 ms

Le TTFB est la base. Si le serveur est lent, toutes les autres optimisations se heurtent à ce plafond.

  1. Configurez la mise en cache HTTP : Cache-Control: max-age=31536000 pour les ressources statiques, s-maxage pour les proxys CDN.
  2. Activez la compression : Brotli (à privilégier) ou gzip pour le HTML, le CSS et le JS. Brotli produit des fichiers 15–25  % plus légers que gzip.
  3. Branchez un CDN : Cloudflare, Fastly, BunnyCDN. Pour les sites statiques, la mise en cache en périphérie ramène le TTFB à 20–50 ms.
  4. Optimisez la base de données : index sur les champs fréquemment interrogés, mise en cache des requêtes avec Redis ou Memcached.
  5. Utilisez HTTP/2 ou HTTP/3 : plusieurs requêtes sur une seule connexion, sans blocage de tête de ligne.
Objectif de TTFB : moins de 200 ms avec serveur et CDN. Avec Nginx, du HTML statique et un CDN, c’est réalisable. Avec PHP ou Node sans cache et des requêtes en base à chaque appel, il faut d’abord optimiser le niveau applicatif.

Étape 2 : optimiser l’image LCP

Si l’élément LCP est une image (visuel principal, photo produit), cette série d’actions offre un très bon retour sur investissement.

  • Passez aux formats modernes : WebP (gain de 25 à 35  % par rapport au JPEG) ou AVIF (gain de 40 à 55  %). Utilisez <picture> avec une image de repli.
  • Ajoutez fetchpriority="high" à l’image LCP : le navigateur la chargera en priorité absolue.
  • Retirez loading="lazy" de l’élément LCP. Le lazy load ne convient qu’aux images situées sous la première fenêtre d’affichage.
  • Ajoutez <link rel="preload" as="image"> dans le <head> pour l’image LCP : le navigateur commence à la charger avant l’analyse du body.
  • Indiquez les attributs width et height pour éviter le CLS. Le navigateur réserve l’espace avant le chargement de l’image.
  • Configurez srcset et sizes pour un chargement adapté à l’écran : sur mobile, l’utilisateur reçoit une image de 400 px au lieu de 1600 px.
La combinaison fetchpriority="high" + preload + WebP/AVIF + srcset bien configuré permet de gagner en moyenne 1 à 2 secondes sur le LCP, sur des projets e-commerce réels.

Étape 3 : supprimer les ressources bloquant le rendu

Chaque ressource bloquant le rendu ajoute du délai au LCP. Objectif : aucune ressource bloquante sur le chemin critique.

Type de ressourceProblèmeSolution
JavaScript dans le <head>Le navigateur interrompt l’analyse du HTML et exécute le scriptdefer ou async sur tous les scripts non critiques
CSS dans le <head>Le navigateur n’affiche rien tant que tout le CSS n’est pas chargéCSS critique en ligne et loadCSS en async pour les styles non critiques
Scripts tiersAnalytics, chats et pixels chargés dans le headLes placer dans le body ou les charger avec un délai (setTimeout 3000)
Polices sans preloadLe navigateur ne découvre la police qu’après l’analyse du CSS<link rel="preload" as="font"> + font-display: swap

Étape 4 : optimiser les polices (quand le LCP est du texte)

Quand l’élément LCP est un bloc de texte (titre, chapeau), le problème vient souvent du délai d’affichage de la police.

  1. Ajoutez font-display: swap ou optional dans @font-face. Le navigateur affiche d’abord la police système, puis la remplace par la police personnalisée une fois chargée.
  2. Utilisez <link rel="preload" as="font" type="font/woff2" crossorigin> pour les polices critiques dans le <head>.
  3. Limitez le jeu de caractères : le subsetting ne charge que les glyphes utiles (latin, cyrillique).
  4. Hébergez vous-même les polices au lieu de les charger depuis Google Fonts : vous supprimez une résolution DNS et une connexion supplémentaires.
  5. Configurez size-adjust, ascent-override et descent-override dans @font-face pour réduire le CLS lors du remplacement de la police.

Étape 5 : SSR et SSG pour les frameworks JavaScript

Si le site tourne sous React, Vue ou Next.js sans SSR, le LCP sera élevé par défaut : le navigateur doit télécharger le JavaScript, l’exécuter, puis seulement afficher le contenu.

Server-Side Rendering (SSR)
Le HTML est généré sur le serveur à chaque requête. Le navigateur reçoit un HTML prêt à l’emploi, l’analyse, et l’élément LCP apparaît sans attendre le JS. La meilleure option pour les contenus dynamiques.
Static Site Generation (SSG)
Le HTML est généré au moment du build. Le serveur livre un fichier déjà prêt, ce qui offre la meilleure vitesse de TTFB et de LCP. Idéal pour les blogs, les pages de destination et les pages non personnalisées.
Incremental Static Regeneration (ISR)
SSG avec régénération périodique (Next.js). Combine la rapidité des fichiers statiques et la fraîcheur des données. Optimal pour la plupart des contenus CMS.
Streaming SSR
Le serveur commence à envoyer le HTML avant la fin du rendu : le navigateur affiche le contenu progressivement. React 18 et Next.js 13+ le prennent en charge nativement.
L’hydratation partielle et l’architecture en îlots (Astro, Qwik) vont encore plus loin : seuls les composants interactifs sont hydratés, le contenu statique s’affiche immédiatement. Pour les sites riches en contenu, le gain sur le LCP atteint 0,5 à 1 s.

Étape 6 : background-image en CSS comme LCP

Si l’élément LCP utilise une background-image en CSS, le navigateur ne peut pas commencer à la charger tant que le CSSOM n’est pas construit. C’est l’une des causes les plus insidieuses d’un LCP lent.

  • Remplacez la background-image CSS par <img fetchpriority="high"> : le navigateur la découvre dès l’analyse du HTML.
  • Si ce remplacement est impossible, utilisez <link rel="preload" as="image"> pour lancer le chargement manuellement.
  • Pour les fonds responsives, utilisez imagesrcset et imagesizes dans la balise preload.
  • Placez le CSS contenant la background-image LCP dans un <style> en ligne : vous supprimez une requête réseau.

Outils de mesure et de diagnostic du LCP

Un diagnostic précis compte plus qu’une optimisation à l’aveugle. Utilisez les deux types d’outils : le laboratoire (tests synthétiques) et le terrain (utilisateurs réels).

OutilType de donnéesCe qu’il fournitQuand l’utiliser
PageSpeed InsightsLaboratoire + terrain (CrUX)Score LCP, décomposition par sous-composante, recommandations précisesAudit initial, vérification des modifications
Chrome DevTools PerformanceLaboratoireCascade de chargement, cause exacte du retard LCP, flame chartDiagnostic approfondi d’un problème précis
Lighthouse CILaboratoireContrôles automatisés dans la CI/CD, historique du LCP par versionContrôle des régressions
WebPageTestLaboratoireTests depuis plusieurs régions, comparaison vidéo, filmstrip, waterfallVérification du CDN, LCP par région
Google Search Console (CWV)Terrain (CrUX)LCP réel par groupes d’URL, pages concernées par un problèmeSuivi en production
web-vitals.jsTerrainAPI JavaScript pour collecter le LCP des utilisateurs réels dans votre propre outil d’analyseMonitoring sur mesure, RUM

Comment diagnostiquer le LCP dans Chrome DevTools

DevTools est l’outil le plus précis pour comprendre exactement ce qui ralentit le LCP sur une page donnée.

  1. Ouvrez DevTools → Performances, lancez un enregistrement, rechargez la page, puis arrêtez l’enregistrement.
  2. Dans Timings, repérez le marqueur LCP : il indique l’heure exacte et l’élément concerné.
  3. Étudiez la cascade : repérez la ressource de l’élément LCP et vérifiez à quel moment son chargement a commencé par rapport au TTFB.
  4. Cherchez les barres rouges : ce sont les ressources bloquant le rendu. Elles apparaissent juste avant le LCP.
  5. Onglet Network, filtrez par type Image : repérez l’image LCP et vérifiez sa priorité (elle doit être Élevée).
  6. Onglet Coverage : il affiche le CSS et le JS inutilisés. Une grande quantité de code inutile entraîne un retard du LCP.
Dans l’onglet Network de DevTools, l’image LCP doit afficher : Priorité : Élevée, Initiateur : Preload ou Parser (et non un script). Si l’initiateur est un script ou une requête XHR, l’image est découverte trop tard.

FAQ

Le LCP est « vert » dans PageSpeed Insights mais « rouge » dans Search Console. Pourquoi ?
PageSpeed Insights affiche à la fois des données de laboratoire (Lighthouse) et des données terrain (CrUX). Si le résultat est vert, vous regardez peut-être le score Lighthouse. Les données CrUX, dans PSI comme dans Search Console, reflètent les utilisateurs réels de Chrome, qui peuvent avoir des connexions lentes, des appareils plus anciens ou une autre localisation géographique. Utilisez toujours les données CrUX ou terrain : ce sont elles que Google utilise pour le classement.
Peut-on améliorer le LCP sans modifier le code ?
En partie, oui. Brancher un CDN, configurer la mise en cache HTTP ou activer la compression Brotli, ce sont des modifications de configuration serveur. Convertir les images en WebP ou AVIF et les compresser ne demande pas non plus de toucher au code du site. En revanche, fetchpriority, preload, la suppression du lazy load sur le visuel principal et le SSR nécessitent des modifications de code.
Que faire si le LCP est un texte et non une image ?
Concentrez-vous sur les polices et le TTFB. Ajoutez un preload pour la police web, utilisez font-display: swap et hébergez les polices vous-même. Si le texte se trouve dans un grand bloc sans CSS critique en ligne, assurez-vous que le CSS qui s’applique à ce bloc ne bloque pas le rendu. Vérifiez aussi le TTFB : même sans image, un serveur lent entraîne un LCP élevé.
Le LCP influence-t-il directement le classement ?
Oui. Le LCP fait partie des Core Web Vitals, le signal Page Experience que Google utilise officiellement comme facteur de classement depuis 2021. Un mauvais LCP ne fera pas chuter un site du jour au lendemain, mais, toutes choses égales par ailleurs, un site avec un bon LCP dispose d’un avantage. L’effet est le plus visible sur mobile.
Faut-il optimiser le LCP sur toutes les pages ou seulement sur la page d’accueil ?
Commencez par les pages qui génèrent le plus de trafic organique et par les pages de destination du trafic payant. La Search Console indique les URL dont le LCP est « mauvais » : partez de là. Sur un site e-commerce, la page d’accueil, les pages de catégorie et les fiches produits viennent généralement en premier. Les améliorations techniques (polices, CDN, Brotli) s’appliquent à l’ensemble du site.

Check it with SpiderHead

Free and local: run the audit on your own machine.

Try it