LCP: come ottimizzare il Largest Contentful Paint

L'LCP è la metrica principale di caricamento nei Core Web Vitals. Misura quanto velocemente gli utenti vedono il contenuto principale di una pagina. Vediamo cosa determina l'LCP, perché rallenta e come portarlo in soglia verde su progetti reali.

Il Largest Contentful Paint (LCP) è la metrica dei Core Web Vitals che influisce sul posizionamento Google dal 2021. Non è solo un numero tecnico — riflette la velocità con cui gli utenti percepiscono una pagina come caricata. Un LCP scadente significa che i visitatori vedono uno schermo vuoto o un'immagine hero non caricata e lasciano la pagina prima che compaia il contenuto.

Timeline di caricamento: l'LCP scatta nel momento in cui viene dipinto l'elemento più grande della viewport. L'obiettivo è atterrare in zona verde sotto i 2,5 secondi.
Secondo Google, migliorare l'LCP da «scadente» a «buono» riduce la frequenza di rimbalzo in media del 24%. Sui siti e-commerce incide direttamente sulla conversione.

Cos'è l'LCP e perché conta

L'LCP misura il tempo dall'inizio della navigazione al momento in cui l'elemento di contenuto più grande (testo o immagine) diventa visibile nella viewport. È la soglia che Google usa per considerare il caricamento «completato» dal punto di vista dell'esperienza utente.

A differenza dell'FCP (First Contentful Paint), che scatta al primo pixel, l'LCP traccia specificamente i contenuti significativi. Una pagina può mostrare uno spinner a 0,3 s, ma se l'immagine hero compare a 5 s — l'LCP è 5 s.

< 2,5 s

LCP buono

La soglia verde di Google. Il target per la maggior parte delle pagine

2,5–4 s

Da migliorare

Zona gialla — l'LCP è percepibile dagli utenti, serve ottimizzazione

> 4 s

LCP scadente

Zona rossa — danno significativo a UX e posizionamento

75°

Percentile CrUX

Google valuta l'LCP al 75° percentile degli utenti Chrome reali

Google usa i dati del Chrome User Experience Report (CrUX) — misurazioni reali di utenti Chrome reali. Il punteggio di lab di PageSpeed Insights può mostrare verde mentre CrUX mostra giallo. Usa i dati da campo CrUX: sono quelli che Google usa per le decisioni di posizionamento.

Quali elementi il browser considera candidati LCP

Il browser non traccia ogni elemento — osserva tipi specifici e seleziona il più grande per area dentro la viewport al momento del completamento del caricamento.

Elementi <img>
Immagini standard. Il candidato LCP più comune sulla maggior parte delle pagine. Tempo = momento in cui l'immagine decodificata compare nella viewport.
<image> dentro SVG
Immagini dentro elementi SVG. Trattate come le normali img ai fini dell'LCP.
CSS background-image
Immagini di sfondo via CSS. Nessola chiave: il browser non inizia a caricare una background-image finché non è costruito il CSSOM. È una delle fonti principali di ritardo LCP.
Blocchi di testo
<p>, <h1>–<h6>, <div> e altri elementi con contenuto testuale. Se un blocco di testo è più grande di qualsiasi immagine, diventa l'LCP.
<video> con poster
Il fotogramma poster di un elemento video (attributo poster). Se un video occupa la maggior parte dello schermo, il poster deve caricarsi il più in fretta possibile.
Gli elementi dentro <iframe> e gli elementi senza dimensione visiva (display: none, visibility: hidden, opacity: 0) non contano come LCP. Se il tuo banner hero è nascosto prima dell'inizializzazione JS, l'LCP potrebbe essere misurato su un elemento completamente diverso.

Come si scompone il tempo LCP

Google decompone l'LCP in 4 sotto-componenti. Capirli è la chiave per diagnosticare e prioritizzare correttamente le ottimizzazioni.

ComponenteCosa misuraQuota tipica
TTFB (Time to First Byte)Tempo fino all'arrivo del primo byte di HTML dal server10–40%
Resource Load DelayIntervallo fra TTFB e l'inizio del caricamento della risorsa LCP10–30%
Resource Load DurationTempo per scaricare la risorsa LCP stessa (immagine, font)30–60%
Element Render DelayIntervallo fra il termine del caricamento della risorsa e la sua comparsa nella viewport0–20%

Regola: attacca il componente con la quota maggiore. Se il TTFB assorbe 3 dei 5 secondi di LCP — ottimizzare le immagini avrà impatto minimo. Correggi prima il tempo di risposta del server.

Cause principali di un LCP lento

Il 90% degli LCP scadenti condivide le stesse cause radice. La diagnosi richiede 15 minuti in DevTools o PageSpeed Insights.

TTFB lento

Il server risponde in più di 600 ms. Cause: niente cache, hosting debole, query di database pesanti, niente CDN. Con TTFB > 800 ms, raggiungere LCP < 2,5 s è quasi impossibile senza altre ottimizzazioni.

Immagini non ottimizzate

L'immagine LCP pesa 500 KB+ in JPEG invece di 80 KB in WebP/AVIF. Niente attributo fetchpriority="high", niente preload. Il browser scopre l'immagine tardi e la carica lentamente.

Risorse render-blocking

CSS e JS in <head> senza async/defer bloccano il rendering. Finché il browser non li carica ed esegue, l'elemento LCP non può comparire. Ogni script extra in head aggiunge ritardo.

Caricamento font lento

Se l'LCP è un blocco di testo e il font impiega 2+ secondi a caricarsi, il browser mostra FOIT (testo invisibile) o FOUT (font di sistema). Il tempo fino alla comparsa del testo corretto equivale all'LCP.

Lazy load sull'elemento LCP

L'attributo loading="lazy" sull'immagine hero principale è fra gli errori più comuni. Il browser rinvia deliberatamente il caricamento — un colpo diretto all'LCP.

LCP nel rendering lato client

Nelle SPA (React, Vue, Angular) senza SSR, il contenuto viene generato nel browser via JavaScript. Il browser vede HTML vuoto → carica JS → renderizza il contenuto. L'intera catena si accumula nell'LCP.

Come ottimizzare l'LCP: piano passo per passo

L'ottimizzazione dell'LCP non è un trucco singolo — è un insieme di miglioramenti interconnessi. Lavora in sequenza, partendo dagli interventi a maggior impatto.

Passo 1: riduci il TTFB a 200–400 ms

Il TTFB è il fondamento. Se il server è lento, tutte le altre ottimizzazioni lavorano contro quel tetto.

  1. Configura la cache HTTP: Cache-Control: max-age=31536000 per gli asset statici, s-maxage per i proxy CDN.
  2. Abilita la compressione: Brotli (preferito) o gzip per HTML, CSS, JS. Brotli produce file più piccoli del 15–25% rispetto a gzip.
  3. Collega una CDN: Cloudflare, Fastly, BunnyCDN. Per i siti statici, l'edge caching riduce il TTFB a 20–50 ms.
  4. Ottimizza il database: indici sui campi interrogati di frequente, cache delle query via Redis o Memcached.
  5. Usa HTTP/2 o HTTP/3: richieste multiple su una singola connessione senza head-of-line blocking.
Target TTFB: < 200 ms con server + CDN. Se hai Nginx + HTML statico + CDN — è raggiungibile. Se hai PHP/Node senza cache e query live sul database — serve prima un'ottimizzazione a livello applicativo.

Passo 2: ottimizza l'immagine LCP

Se l'elemento LCP è un'immagine (hero, immagine prodotto), questo è un albero di ottimizzazione ad alto ROI.

  • Converti nei formati moderni: WebP (25–35% di risparmio vs JPEG) o AVIF (40–55% vs JPEG). Usa <picture> con fallback.
  • Aggiungi fetchpriority="high" all'immagine LCP — il browser la caricherà con priorità massima.
  • Rimuovi loading="lazy" dall'elemento LCP. Il lazy load è appropriato solo per le immagini sotto la prima viewport.
  • Aggiungi <link rel="preload" as="image"> in <head> per l'immagine LCP — il browser inizia a caricarla prima del parsing del body.
  • Specifica gli attributi width e height per prevenire il CLS. Il browser riserva lo spazio prima del caricamento.
  • Configura srcset e sizes per il caricamento responsive: il mobile riceve un'immagine da 400 px invece che da 1600 px.
La combinazione fetchpriority="high" + preload + WebP/AVIF + srcset corretto porta in media un miglioramento LCP di 1–2 secondi su progetti e-commerce reali.

Passo 3: elimina le risorse render-blocking

Ogni risorsa render-blocking aggiunge ritardo all'LCP. Obiettivo: zero risorse bloccanti nel critical path.

Tipo di risorsaProblemaSoluzione
JavaScript in <head>Il browser interrompe il parsing HTML ed esegue lo scriptdefer o async su tutti gli script non critici
CSS in <head>Il browser non renderizza nulla finché non è caricato tutto il CSSCritical CSS inline + loadCSS asincrono per gli stili non critici
Script di terze partiAnalytics, chat bot, pixel caricati in headSpostali nel body o caricali con ritardo (setTimeout 3000)
Font senza preloadIl browser scopre il font solo dopo il parsing del CSS<link rel="preload" as="font"> + font-display: swap

Passo 4: ottimizza i font (quando l'LCP è testo)

Quando l'elemento LCP è un blocco di testo (titolo, lead), il problema è spesso il ritardo di rendering del font.

  1. Aggiungi font-display: swap o optional a @font-face. Il browser mostra subito il font di sistema e sostituisce quello custom dopo il caricamento.
  2. Usa <link rel="preload" as="font" type="font/woff2" crossorigin> per i font critici in <head>.
  3. Limita il set di caratteri: usa il subsetting per caricare solo i glifi necessari (latino, cirillico).
  4. Self-hosta i font invece di caricarli da Google Fonts — elimina un DNS lookup e una connessione in più.
  5. Configura size-adjust, ascent-override, descent-override in @font-face per ridurre il CLS durante lo swap del font.

Passo 5: SSR/SSG per i framework JavaScript

Se il sito gira su React, Vue o Next.js senza SSR — l'LCP sarà alto per impostazione predefinita: il browser deve scaricare, eseguire JavaScript e solo dopo renderizzare il contenuto.

Server-Side Rendering (SSR)
L'HTML viene generato sul server a ogni richiesta. Il browser riceve HTML pronto, lo parsa e l'elemento LCP compare senza aspettare il JS. Opzione migliore per i contenuti dinamici.
Static Site Generation (SSG)
L'HTML viene generato alla build. Il server consegna un file pronto — massima velocità di TTFB e LCP. Ideale per blog, landing page e pagine non personalizzate.
Incremental Static Regeneration (ISR)
SSG con rigenerazione periodica (Next.js). Combina la velocità dei file statici con la freschezza dei dati. Ottimale per la maggior parte dei contenuti CMS.
Streaming SSR
Il server inizia a inviare HTML prima del completamento del rendering — il browser mostra i contenuti progressivamente. React 18 + Next.js 13+ lo supportano out of the box.
La Partial Hydration e l'Islands Architecture (Astro, Qwik) sono un approccio ancora più efficace: solo i componenti interattivi si idratano, i contenuti statici renderizzano all'istante. Per i siti ricchi di contenuti questo vale un guadagno LCP di 0,5–1 s.

Passo 6: CSS background-image come LCP

Se l'elemento LCP usa una CSS background-image, il browser non può iniziare a caricarla finché non è costruito il CSSOM. È una delle cause più insidiose di LCP lento.

  • Sostituisci la CSS background-image con <img fetchpriority="high"> — il browser la scopre durante il parsing HTML.
  • Se la sostituzione non è possibile — usa <link rel="preload" as="image"> per avviare manualmente il caricamento.
  • Per gli sfondi responsive usa imagesrcset e imagesizes nel tag preload.
  • Sposta il CSS che contiene la background-image LCP in uno <style> inline — elimina una richiesta di rete.

Strumenti per misurare e diagnosticare l'LCP

La diagnosi corretta conta più dell'ottimizzazione alla cieca. Usa entrambi i tipi di strumenti: Lab (test sintetici) e Field (utenti reali).

StrumentoTipo datiCosa fornisceQuando usarlo
PageSpeed InsightsLab + Field (CrUX)Punteggio LCP, scomposizione in sotto-componenti, raccomandazioni specificheAudit iniziale, verifica delle modifiche
Chrome DevTools PerformanceLabWaterfall di caricamento, causa esatta del ritardo LCP, flame chartDiagnosi approfondita di un problema specifico
Lighthouse CILabControlli automatici in CI/CD, storico LCP per releaseControllo delle regressioni
WebPageTestLabTest da più regioni, confronto video, filmstrip, waterfallVerifica CDN, LCP regionale
Google Search Console (CWV)Field (CrUX)LCP reale per gruppi di URL, pagine con problemiMonitoraggio in produzione
web-vitals.jsFieldAPI JavaScript per raccogliere l'LCP da utenti reali in analytics customMonitoraggio custom, RUM

Come diagnosticare l'LCP in Chrome DevTools

DevTools è lo strumento più preciso per capire esattamente cosa rallenta l'LCP su una pagina specifica.

  1. Apri DevTools → Performance → premi Record, ricarica la pagina, ferma la registrazione.
  2. In Timings trova il marker LCP — mostra il tempo esatto e l'elemento.
  3. Studia il waterfall: trova la risorsa dell'elemento LCP e controlla quando è iniziato il caricamento rispetto al TTFB.
  4. Cerca le barre rosse — sono le risorse render-blocking. Compaiono subito prima dell'LCP.
  5. Scheda Network → filtra per tipo Immagine — trova l'immagine LCP e controlla la sua priorità (deve essere High).
  6. Scheda Coverage — mostra CSS/JS inutilizzati. Grandi quantità di codice inutilizzato = ritardo LCP.
In DevTools Network, l'immagine LCP deve mostrare: Priority: High, Initiator: Preload o Parser (non uno script). Se Initiator è uno script o XHR — l'immagine viene scoperta troppo tardi.

FAQ

L'LCP è «verde» in PageSpeed Insights ma «rosso» in Search Console. Perché?
PageSpeed Insights mostra sia i dati di lab (Lighthouse) sia quelli da campo (CrUX). Se mostra verde, potresti star guardando il punteggio Lighthouse. Il CrUX in PSI e Search Console riflette gli utenti Chrome reali, che possono avere connessioni lente, dispositivi datati o geolocalizzazioni diverse. Usa sempre i dati CrUX/Field — sono quelli che Google usa per il posizionamento.
Si può migliorare l'LCP senza toccare il codice?
Parzialmente — sì. Collegare una CDN, configurare la cache HTTP, abilitare la compressione Brotli sono modifiche alla configurazione del server. Anche convertire le immagini in WebP/AVIF e comprimerle non richiede modifiche al codice del sito. Ma fetchpriority, preload, rimuovere il lazy load dall'hero e l'SSR richiedono tutti modifiche al codice.
E se l'LCP è testo, non un'immagine?
Concentrati su font e TTFB. Aggiungi il preload per il web font, usa font-display: swap, self-hosta i font. Se il testo è in un grande blocco privo di critical CSS, assicurati che il CSS che influenza quel blocco non sia render-blocking. Controlla anche il TTFB: anche senza immagini, un server lento significa LCP alto.
L'LCP influenza direttamente il posizionamento?
Sì. L'LCP fa parte dei Core Web Vitals — il segnale Page Experience che Google usa ufficialmente come fattore di posizionamento dal 2021. Un LCP scadente non fa crollare le posizioni dall'oggi al domani, ma a parità di condizioni un sito con buon LCP ha un vantaggio. L'effetto è più visibile su mobile.
Devo ottimizzare l'LCP su tutte le pagine o solo sulla homepage?
Da priorità alle pagine con alto traffico organico e alle landing del traffico a pagamento. Google Search Console mostra quali URL hanno LCP «Scadente» — parti da lì. Homepage, pagine categoria e schede prodotto nell'e-commerce sono in genere le prime. I miglioramenti tecnici (font, CDN, Brotli) si applicano globalmente.

Check it with SpiderHead

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

Try it