Lazy loading e SEO

Come il caricamento differito di immagini e iframe migliora i Core Web Vitals, come usare l'attributo loading, quali rischi SEO crea sui contenuti subito visibili e come Googlebot renderizza i contenuti differiti.

Prima pubblicazione: 2 lug 2026 · Ultimo aggiornamento: 13 ago 2026 · Advanced
Lingue

Il caricamento differito rimanda immagini e iframe fuori schermo finché non stanno per entrare nella viewport, riducendo il peso iniziale della pagina e aiutando i Core Web Vitals. Il metodo nativo usa l'attributo loading="lazy" su <img> e <iframe>, senza richiedere JavaScript. L'errore più grave è applicarlo all'immagine principale o LCP, ritardando Largest Contentful Paint. Googlebot non scorre né fa clic, quindi potrebbe non vedere i contenuti subordinati a queste interazioni. Non è un fattore di ranking diretto: l'effetto passa attraverso Core Web Vitals e possibilità di scansione. Verifica il risultato con lo strumento Controllo URL di Search Console; gli URL delle immagini devono comparire nell'attributo src dell'HTML renderizzato.

TL;DR — Il caricamento differito rimanda immagini e iframe fuori schermo finché non si avvicinano alla viewport, riducendo il peso iniziale della pagina (aiuta LCP) e il lavoro sul thread principale all’avvio (aiuta INP). L’attributo nativo loading="lazy" su <img>/<iframe> ha sostituito la maggior parte delle librerie JS; solo lazy e eager sono valori significativi (auto è deprecato). Gli errori dannosi sono applicare il caricamento differito all’immagine LCP subito visibile (ritarda proprio la metrica che stai cercando di migliorare) e nascondere contenuti dietro scorrimento/clic — che Googlebot non attiva mai perché non interagisce con la pagina. Non è un fattore di ranking diretto; l’effetto passa attraverso Core Web Vitals e la possibilità di scansione. Verifica nello strumento Controllo URL di Search Console che gli URL delle immagini finiscano nell’attributo src dell’HTML renderizzato.

Cosa fa realmente il lazy loading

L’idea è semplice: caricare le risorse solo quando servono, invece di caricare tutto in una volta. Su una pagina ricca di media, scaricare ogni immagine e contenuto incorporato all’inizio mantiene il browser occupato a recuperare cose che il visitatore potrebbe non scorrere mai — bruciando larghezza di banda, memoria e batteria per nulla. Rimandare quelli fuori schermo permette al contenuto subito visibile di apparire prima. Martin Splitt ha spiegato proprio questo nel episodio “Lazy loading demystified” del podcast ufficiale di Google: l’obiettivo è evitare lavoro che non produce nulla, perché le immagini non critiche di cui la pagina potrebbe fare a meno tengono semplicemente occupato il browser.

Questo si collega alle Core Web Vitals che la maggior parte delle persone insegue. Meno byte in competizione per la rete all’inizio significa che l’elemento Largest Contentful Paint può essere renderizzato prima. Per gli iframe — annunci, widget social, sezioni commenti, mappe — rimandarli riduce anche il lavoro sul thread principale durante l’avvio, il che è un vantaggio per Interaction to Next Paint, non solo per LCP. La guida web.dev di Google presenta gli iframe caricati in modo differito come un miglioramento INP durante il caricamento della pagina.

Lazy loading nativo vs. guidato da JavaScript

Qualche anno fa, i browser hanno acquisito un attributo loading nativo per immagini e iframe, così puoi affidare l’intero compito al browser invece di configurare un’API JavaScript. In la mia guida SEO JavaScript su Ahrefs faccio la stessa osservazione: da quando ho scritto quel pezzo, il lazy loading si è spostato per lo più dall’essere guidato da JavaScript all’essere gestito dai browser. Incontrerai ancora configurazioni guidate da JS, e per le immagini di solito vanno bene — la cosa che controllo è se il contenuto effettivo (non solo le immagini) viene caricato in modo lazy, perché quelle configurazioni sono quelle che hanno causato il mancato recupero corretto del contenuto.

La versione nativa:

<!-- Below-the-fold image: defer it -->
<img src="gallery-07.jpg" loading="lazy" width="800" height="600" alt="…">

<!-- Off-screen embed: defer it -->
<iframe src="https://www.youtube.com/embed/…" loading="lazy" title="…"></iframe>

Imposta sempre width/height espliciti (o un rapporto d’aspetto) sulle immagini differite così il browser riserva lo spazio prima che l’immagine venga caricata — questo è il rischio più grande di layout shift con immagini differite. Le dimensioni riservate non sono una garanzia assoluta di CLS, però: se il layout circostante o un ritaglio adattivo cambia ancora dopo il caricamento dell’immagine, puoi osservare comunque uno spostamento; conferma quindi con una traccia reale degli spostamenti di layout invece di presumere che le dimensioni fisse da sole lo risolvano.

Il lazy loading e gli iframe richiedono un’ulteriore distinzione: loading="lazy" su un <iframe> differisce solo per il momento in cui avvengono il recupero e la creazione del contenuto incorporato. Non imposta il suo title, il comportamento del focus, sandbox, allow o la politica delle autorizzazioni, referrerpolicy, la gestione del consenso o le dimensioni: questi aspetti richiedono ancora attenzione, e un contenuto incorporato può continuare a fare lavoro (script, pixel di tracciamento, layout) una volta che diventa idoneo al caricamento. E non dare per scontato che un elemento fuori dalla prima schermata si comporti allo stesso modo ovunque: contenuti con display: none, diapositive di carosello fuori schermo, elementi trasformati e contenitori di scorrimento annidati possono intersecare la viewport in modo diverso rispetto a un semplice elemento più in basso nella pagina, quindi testa il layout effettivo e i controlli di navigazione piuttosto che assumere equivalenza.

I valori dell’attributo loading

Solo due valori contano oggi:

  • loading="lazy" — rimanda la risorsa finché non è vicina al viewport.
  • loading="eager" — caricala immediatamente, il comportamento predefinito. Usalo per essere esplicito sulle immagini nella prima schermata.
Evidence for this claim The native loading attribute supports lazy loading for images and iframes without a JavaScript lazy-loading library. Scope: Browser-level lazy loading behavior; browser heuristics decide the fetch distance. Confidence: high · Verified: web.dev: Browser-level image lazy loading

Potresti vedere loading="auto" in articoli più vecchi — è deprecato in Chrome, quindi non usarlo. Non ce n’è bisogno; omettere l’attributo ti dà già il comportamento predefinito, cioè immediato.

Quanto è vicino “vicino”? loading="lazy" è un suggerimento, non una garanzia controllata dall’autore — la specifica lascia la decisione effettiva sulla vicinanza al viewport al browser. Chromium cerca di recuperare una risorsa lazy abbastanza presto da essere pronta quando scorri fino ad essa, e la distanza di attivazione varia in base al browser, alla velocità di connessione e al tipo di risorsa; non è un valore fisso in pixel su cui puoi fare affidamento o riprodurre tra browser o versioni. Non pubblicare — o fidarti — di un numero specifico “carica N pixel prima del viewport”; tratta la finestra vicino al viewport come definita dall’implementazione e conferma il comportamento effettivo con una traccia di rete sul browser/connessione che ti interessa invece di assumere una costante.

Il lazy loading nativo funziona bene anche con le immagini responsive: si applica alla normale selezione di src e srcset/sizes, quindi non perdi il comportamento delle immagini responsive aggiungendo loading="lazy". Se invece nascondi l’URL reale solo in un attributo data-* per farlo sostituire da uno script in seguito, il caricamento ora dipende da quello script — verifica l’HTML renderizzato e cosa succede se lo script fallisce (ne parleremo nelle schede Script e Risoluzione dei problemi).

Evidence for this claim Native lazy loading works with ordinary src and responsive srcset/sizes selection; hiding the real URL only in data-* attributes makes loading dependent on script and should be tested in rendered HTML and under script failure. Scope: responsive image fetching and layout Confidence: high · Verified: HTML Standard: img

L’errore n. 1: caricamento differito dell’immagine LCP subito visibile

Questo è l’errore che vedo più spesso, e tutte le fonti concordano. Se carichi in modo differito l’immagine principale — o qualsiasi immagine che probabilmente è l’elemento LCP — hai detto al browser di aspettare il pixel più importante per la velocità di caricamento percepita. Inoltre, il browser non può differire un’immagine finché non sa dove si troverà nella pagina, quindi le immagini subito visibili caricate in questo modo tendono ad arrivare più lentamente di quelle caricate subito. Questo ritarda direttamente Largest Contentful Paint, la metrica che secondo Google dovrebbe completarsi entro i primi 2,5 secondi dal caricamento.

Do not lazy-load the observed or likely LCP image; confirm the actual request and paint timing in a trace. Fonte: Lazy Loading

The eager path discovers the likely LCP image in HTML and starts its request promptly. The lazy path waits for browser loading heuristics before request start. The comparison uses no fixed timing values and notes that actual LCP must be measured.

© Patrick Stox LLC · CC BY 4.0 ·

Splitt ha detto chiaramente il lato opposto nell’episodio SOTR: se non usi il lazy loading dove dovresti, probabilmente danneggerai qualche aspetto dei Core Web Vitals — molto probabilmente l’LCP. Quindi è un’arma a doppio taglio. La regola:

  • Candidato LCP probabile o osservato → carica subito (ometti loading="lazy", oppure imposta eager). Considera fetchpriority="high" sull’immagine LCP.
  • Sotto la piega → loading="lazy".

Non tutte le immagini nella prima schermata sono il candidato LCP: identifica quella effettiva (una traccia Performance o PageSpeed Insights la nominerà) e verifica i suoi tempi di richiesta invece di trattarle tutte allo stesso modo. Sono suggerimenti separati, non un’unica impostazione: loading="eager" (o l’assenza di loading) significa solo che il browser non rimanderà la scoperta della risorsa; non ne aumenta da solo la priorità di recupero. fetchpriority è un suggerimento distinto e aggiuntivo. Sovrapporre un <link rel="preload"> a loading="lazy" sulla stessa risorsa comunica al browser intenzioni contrastanti; controlla quindi la sequenza effettiva delle richieste invece di presumere che la combinazione funzioni come previsto.

L’anti-pattern generalizzato è attivare il lazy loading per ogni immagine a livello di sito — un’impostazione predefinita comune nei CMS. Come ha notato Splitt, se ogni immagine è in lazy loading, anche le immagini che sono (o dovrebbero essere) immediatamente visibili vengono caricate in lazy loading, che è esattamente il caso che vuoi evitare.

Come Googlebot renderizza i contenuti in lazy loading

Ecco la realtà della scansione che mette in difficoltà le persone: Googlebot non scorre e non clicca. Renderizza la tua pagina con un browser headless, ma non simula un utente che interagisce con essa. Google lo afferma direttamente — i suoi metodi consigliati per il lazy loading non si basano deliberatamente su azioni dell’utente come lo scorrimento o il clic, perché Google Search non interagisce con la tua pagina.

Evidence for this claim Google Search does not scroll or click to trigger lazy-loaded content, so implementations should not depend on user interaction and should expose resource URLs in rendered HTML. Scope: Google Search guidance for JavaScript-driven lazy loading. Confidence: high · Verified: Google Search Central: Lazy-load content

Ecco perché il come della tua implementazione conta. Il documento di Google elenca tre implementazioni che considera sicure: il lazy loading integrato del browser per immagini e iframe, l’API IntersectionObserver (con un polyfill) o una libreria JavaScript che carica i dati quando entrano nel viewport. Tutte e tre si basano sull’intersezione con il viewport — non su un evento di scorrimento o clic che Googlebot non attiverà mai.

Il pattern ad alto rischio è una libreria JS di lazy loading personalizzata o di terze parti. Se la libreria si comporta male e l’URL dell’immagine non arriva mai nell’attributo src, Google semplicemente non raccoglierà quell’immagine — Splitt ha descritto esattamente questa modalità di errore nell’episodio SOTR. Non c’è nulla da indicizzare se l’URL non è presente. Questo è lo stesso problema che segnalo nella mia guida SEO JavaScript: il lazy loading delle immagini di solito va bene, ma il contenuto caricato in lazy loading è dove si insinuano i problemi di indicizzazione, e la soluzione è controllare ciò che Google effettivamente renderizza.

Lo scroll infinito è un problema diverso

Non confondere il lazy loading di base di immagini/iframe con lo scroll infinito o il caricamento paginato. Rimandare le immagini è una cosa; caricare nuovi blocchi di contenuto mentre l’utente scorre è un’altra, e richiede una propria architettura. La guida di Google: assegna a ogni blocco un URL persistente e univoco, mantieni il contenuto stabile per URL (usa numeri di pagina assoluti come ?page=12, non valori relativi come ?date=yesterday), e aggiorna l’URL visualizzato con la History API man mano che ogni blocco diventa il contenuto visibile principale così può essere aggiornato, condiviso e collegato. Se salti questo passaggio, il contenuto più profondo dietro uno scroll infinito potrebbe non essere mai indicizzato o scansionato in modo affidabile.

Come testarlo

Il percorso di verifica è lo stesso nel documento di Google e nella mia metodologia: usa lo Strumento di controllo URL di Search Console e guarda l’HTML renderizzato. Se i tuoi URL di immagini (o video) compaiono nell’attributo src sugli elementi <img>/<video> in quell’HTML renderizzato, la tua configurazione funziona. Google lo dice chiaramente: “Check the rendered HTML to make sure your content is in the rendered HTML” (traduzione) «Controlla l’HTML renderizzato per assicurarti che il contenuto sia presente nell’HTML renderizzato». Consulta il passaggio originale. Se l’URL manca da src, questo è il tuo problema, e di solito riconduce a un evento di scorrimento o clic oppure a una libreria non funzionante.

Per una griglia di prodotti con lazy loading, vai oltre questo controllo di presenza. Esegui la matrice di test SEO per lo scroll infinito con viewport standard e alte, navigazione fresca e ridimensionamento dopo il caricamento, esecuzioni senza azione e con scroll incrementale, conteggi di link di prodotto univoci e ispezione dell’albero di accessibilità. Ridimensionare una pagina inizializzata non equivale a navigare alla dimensione finale della viewport perché observer e calcoli batch potrebbero essere registrati solo durante l’avvio. Evidence for this claim Google Search does not scroll or click to trigger lazy-loaded content, so implementations should not depend on user interaction and should expose resource URLs in rendered HTML. Scope: Google Search guidance for JavaScript-driven lazy loading. Confidence: high · Verified: Google Search Central: Lazy-load content

Puoi anche affidarti ai tuoi strumenti di performance web: PageSpeed Insights segnala le immagini fuori schermo che dovresti rimandare. Nella mia guida PageSpeed Insights su Ahrefs noto che l’audit “defer offscreen elements” ti sta dicendo di caricare le immagini in lazy loading — un modo pratico per collegare la diagnostica che già esegui alla soluzione.

Onestà sul segnale di ranking

Sii chiaro su cosa è e cosa non è il lazy loading. Usarlo non è un fattore di ranking diretto, e non usarlo non è una penalità. La connessione al ranking è indiretta: passa tramite i Core Web Vitals (principalmente LCP, a volte INP per gli iframe) e tramite la scansionabilità, se una cattiva implementazione nasconde contenuti. Splitt ha caratterizzato l’effetto sul ranking tramite i Core Web Vitals come un fattore minuscolo e minimo nella maggior parte dei casi. Quindi ottimizza il lazy loading per l’esperienza di caricamento dei tuoi utenti e per un’indicizzazione pulita — non perché ti aspetti un aumento del ranking dall’attributo stesso.

Dove si colloca

Il lazy loading è una leva nel più ampio toolkit di performance web. Si abbina a resource hints (preload/preconnect per le risorse che vuoi in anticipo), alla strategia di font-loading, alla caching e a una CDN — ed è giudicato, in definitiva, tramite i Core Web Vitals. Ottieni la giusta suddivisione sopra/sotto la piega ed è una delle vittorie più economiche disponibili.

Add an expert note

Pin an expert quote

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