Ottimizzazione delle immagini nel 2026: AVIF, WebP e Lazy Loading

Guida pratica all'ottimizzazione moderna delle immagini: AVIF vs WebP, srcset responsivo, strategie di lazy loading. Raccomandazioni DigiForge per siti più veloci.

DFDigiForge TeamJul 20, 202610 min di lettura
Cubo astratto luminoso che rappresenta la compressione delle immagini circondato da frame responsivi su sfondo scuro

Le immagini rimangono le risorse più pesanti nella maggior parte delle pagine web. Nei nostri progetti in DigiForge, vediamo regolarmente che le immagini costituiscono una parte sostanziale del peso totale di una pagina. Entro il 2026, il panorama si è stabilizzato: AVIF e WebP sono i due formati moderni da utilizzare, le immagini responsive tramite srcset sono il minimo indispensabile, e il lazy loading è così standard che sbagliarlo può effettivamente danneggiare le prestazioni. Questo articolo sintetizza la nostra esperienza pratica in un flusso di lavoro chiaro e autorevole che puoi applicare a qualsiasi progetto.

Scegliere il formato giusto: AVIF vs WebP

Per anni, WebP è stato il formato di nuova generazione di riferimento. AVIF è arrivato dopo, promettendo una migliore compressione e supporto HDR, ma con un costo di codifica più elevato e un supporto browser ancora non universale (Safari è stato l'ultimo a resistere). Ecco lo stato dell'arte nel 2026:

  • AVIF offre in genere dimensioni file inferiori rispetto a WebP a parità di qualità percettiva. Supporta colore a 10 bit, HDR, alpha lossless e persino animazioni. La codifica è significativamente più lenta di WebP, rendendolo meno adatto per la generazione in tempo reale, ma va bene per risorse statiche generate in fase di build.
  • WebP è supportato universalmente in tutti i browser moderni. Offre qualità prevedibile, codifica veloce e ottimi strumenti (cwebp, sharp, imagemin). Per i siti con molti contenuti dove la velocità di codifica è importante, WebP rimane la scelta pragmatica predefinita.
  • JPEG XL (JXL) ha mostrato potenziale iniziale ma non ha mai guadagnato trazione nei browser. Chromium ha rimosso il suo flag e Safari non lo ha mai implementato. Non perdere tempo finché il panorama non cambia.

La nostra raccomandazione: Servi AVIF con un fallback WebP. Usa <picture> per permettere ai browser di scegliere prima AVIF, poi WebP, poi il JPEG/PNG originale. Questo massimizza la compressione per chi può usufruirne senza mai lasciare nessuno senza immagine. La maggior parte dei browser moderni supporta AVIF, quindi il fallback è importante ma non è il percorso principale.

<picture>
  <source srcset="image.avif" type="image/avif">
  <source srcset="image.webp" type="image/webp">
  <img src="image.jpg" alt="...">
</picture>

Suggerimento DigiForge: Non codificare ogni immagine con la stessa qualità. Per le foto, un'impostazione di qualità inferiore spesso risulta visivamente senza perdite, riducendo drasticamente le dimensioni del file. Per screenshot o elementi UI con testo nitido e colori solidi, aumenta la qualità o usa WebP lossless. Prova con strumenti come Squoosh per trovare il punto di equilibrio per ogni tipo di immagine.

Dimensioni Reattive: Non Solo srcset

L'attributo srcset con sizes è ben compreso, ma molte implementazioni che analizziamo sbagliano sizes. Il browser usa sizes per determinare quale candidato di srcset scaricare – non è solo un suggerimento. Se sizes è assente, il valore predefinito è 100vw, il che significa che il browser potrebbe scegliere l'immagine più grande anche su uno schermo piccolo, sprecando larghezza di banda.

Per immagini reattive semplici in cui l'immagine si adatta alla larghezza del viewport, scrivi:

<img src="image-800.jpg" 
     srcset="image-400.jpg 400w, image-800.jpg 800w, image-1200.jpg 1200w"
     sizes="(max-width: 600px) 100vw, (max-width: 1200px) 50vw, 33vw"
     alt="...">

Ma c'è una sfumatura. sizes dovrebbe riflettere l'effettiva larghezza CSS occupata dall'immagine a ogni breakpoint, non la frazione del viewport. Per un'immagine hero sempre a larghezza intera, sizes="100vw" è corretto. Per una galleria in cui ogni immagine occupa un terzo della riga, usa 33vw. Se l'immagine ha padding o è contenuta in un contenitore con larghezza massima, devi calcolare la larghezza effettiva renderizzata — a volte è necessario usare calc() in sizes.

Descrittori di larghezza vs densità di pixel

Usa i descrittori w (es. 400w) e sizes per immagini flessibili la cui dimensione di visualizzazione cambia con il layout. I descrittori di densità (1x, 2x) sono adatti solo per immagini a dimensione fissa come loghi o icone, dove conosci le dimensioni fisiche esatte. Per le immagini di contenuto, usa sempre w – offre al browser la vera flessibilità di scegliere la migliore candidata in base alla larghezza del viewport e al rapporto pixel del dispositivo.

Quando usi <picture> per la selezione del formato, ogni <source> deve avere il proprio srcset e opzionalmente sizes. Puoi condividere gli stessi sizes tra le fonti se il layout è identico, ma evita di duplicarli inutilmente.

Lazy Loading: Nativo, Intersection Observer o Entrambi?

Il lazy loading nativo (loading="lazy") è supportato in tutti i browser principali dal 2020. È zero JavaScript, funziona con immagini e iframe, ed è la via più semplice. Ma ha delle stranezze che contano nella pratica:

  • Il lazy loading nativo rimanda il caricamento finché il browser non ritiene l'elemento vicino al viewport. La soglia è definita dal browser – Chrome usa un margine generoso per iniziare il caricamento presto; Firefox usa un margine più piccolo. Questo significa che le immagini potrebbero caricarsi più tardi del previsto su Firefox.
  • Non funziona perfettamente con srcset in alcune implementazioni iniziali. Le vecchie versioni di Safari (pre-16.4) avevano bug. Nel 2026, questi sono rari ma vale ancora la pena testarli.
  • Per gli elementi <picture>, loading="lazy" va sul tag <img>, non sui tag <source>.

Noi usiamo un approccio ibrido: lazy loading nativo come base, più un leggero polyfill Intersection Observer (IO) per browser più vecchi (anche se nel 2026 è un caso di nicchia). L'IO può anche attivare animazioni di dissolvenza o caricare placeholder di bassa qualità. La nostra implementazione:

const lazyImages = document.querySelectorAll('img[loading="lazy"]');

if ('loading' in HTMLImageElement.prototype) {
  // Native lazy loading works – do nothing extra
} else {
  const observer = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
      if (entry.isIntersecting) {
        const img = entry.target;
        img.src = img.dataset.src;
        observer.unobserve(img);
      }
    });
  });
  lazyImages.forEach(img => observer.observe(img));
}

Non caricare in lazy loading la prima immagine visibile. L'immagine hero iniziale sopra la piega dovrebbe essere caricata con loading="eager" o semplicemente omettendo l'attributo. Il lazy loading sopra la piega danneggia effettivamente l'LCP (Largest Contentful Paint) perché il browser ritarda il recupero della risorsa critica. Contrassegniamo sempre almeno la prima immagine significativa come eager.

Mettere Tutto Insieme: Un Flusso di Lavoro Pratico

In DigiForge, seguiamo questa pipeline per ogni progetto, che si tratti di un sito statico, un sito basato su CMS o un'app web:

  1. Immagini sorgente: I designer forniscono file in alta risoluzione PNG o TIFF. Conserviamo gli originali in una cartella _originals per future ricompressioni se emergono nuovi formati.
  2. Generazione dei formati: Utilizziamo uno script Node.js con sharp o un Makefile con ImageMagick per produrre AVIF, WebP e JPEG/PNG di fallback a 3–5 larghezze (es. 480, 800, 1200, 1920). Per progetti grandi, eseguiamo questa operazione in parallelo usando worker thread per accelerare la build.
  3. Ottimizzazione della qualità: Eseguiamo controlli CI che confrontano la dimensione del file con una metrica percettiva (SSIM o Butteraugli). Blocchiamo le pull request se il peso totale delle immagini per una pagina tipica supera una soglia ragionevole basata sul tipo di contenuto.
  4. Markup: Generiamo <picture> con ordinamento per type (AVIF, WebP, fallback) e <img> con loading="lazy" (tranne per la prima hero). Per le dimensioni responsive, generiamo sizes basati sul CSS effettivo – questo spesso proviene da un file di design tokens condiviso tra design e sviluppo.
  5. Servire da CDN: Per i siti statici, serviamo asset pre-codificati da una CDN con intestazioni di cache lunghe (es. Cache-Control: public, max-age=31536000, immutable). Se si utilizza una CDN di immagini come Cloudinary o imgix, molti passaggi sono automatizzati tramite trasformazioni URL, ma pre-codifichiamo comunque le immagini critiche per evitare costi di avvio a freddo.

Siti come Unsplash [3] e Pixabay [1] forniscono immagini ad alta risoluzione che spesso pesano diversi megabyte al grezzo. La nostra pipeline le riduce drasticamente con perdita percettiva zero. Allo stesso modo, le immagini generate dall'IA da strumenti come ChatGPT Images [4] spesso escono ad alta risoluzione senza ottimizzazione, quindi è fondamentale farle passare attraverso lo stesso flusso di compressione. Le immagini stock da Shutterstock [5] o Bing Images [2] hanno caratteristiche simili – file grandi che possono danneggiare le prestazioni se non ottimizzati.

Errori comuni che vediamo (e risolviamo)

  • Mancanza totale di sizes: Il browser scarica il candidato srcset più grande perché assume 100vw. Fornisci sempre sizes – anche un semplice 100vw è meglio di niente.
  • Usare JPEG per tutto: Molti team servono ancora JPEG come unico formato. Nel 2026 non ci sono scuse – WebP e AVIF sono maturi e lo sforzo per aggiungerli è minimo.
  • Lazy-loading eccessivo: Ogni immagine con loading="lazy" ritarda la prima pittura significativa. Usa loading="eager" per le immagini critiche e considera di precaricare l'immagine hero con <link rel="preload" as="image" href="..."> per massimizzare la velocità LCP.
  • Nessun fallback per formati animati: Se usi AVIF animato (con supporto discontinuo), fornisci un fallback WebP o GIF tramite <picture>.
  • Codificare immagini al volo in funzioni serverless: La codifica AVIF è intensiva per la CPU. Un picco di richieste può causare timeout o aumentare i costi. Genera sempre gli asset durante la build, tranne per immagini caricate dagli utenti che non possono essere pre-elaborate.

Abbiamo anche visto team affidarsi a una singola fonte immagine senza versioning. Quando un designer aggiorna un banner hero, il vecchio file viene sovrascritto, rompendo la cache CDN. Usa hash del contenuto nei nomi dei file (es. hero-a1b2c3.avif) in modo che le nuove versioni ottengano un nuovo URL e quelle vecchie possano essere memorizzate nella cache indefinitamente.

Raccomandazioni sugli strumenti

Per gli sviluppatori che preferiscono la riga di comando, cwebp (da libwebp) e avifenc (da libavif) sono solidi e scriptabili. Per pipeline Node.js, sharp è imbattibile – è veloce, gestisce tutti i formati e può produrre AVIF (richiede libvips compilato con supporto AVIF). Per confronti ad hoc, usiamo Squoosh o strumenti di confronto come icdif (Image Compare Diff).

Per progetti su larga scala, considera una CDN per immagini come Cloudinary, imgix o Fastly Image Optimizer. Queste automatizzano il ridimensionamento e la negoziazione del formato tramite parametri URL, e spesso gestiscono la codifica AVIF nel proprio livello di cache, evitando il costo CPU sul tuo origin. Tuttavia, fai attenzione al vendor lock-in e ai costi – per un sito con molte immagini, la fattura mensile può essere significativa. Spesso consigliamo un approccio ibrido: pre-genera le dimensioni e i formati più comuni, e lascia che la CDN gestisca i breakpoint rari o i caricamenti utente.

Se utilizzi un CMS o un generatore di siti statici, esistono plugin per la maggior parte dei framework (es. @next/image per Next.js, gatsby-plugin-sharp per Gatsby, eleventy-img per Eleventy). Questi gestiscono automaticamente la generazione e il markup, ma ti consigliamo comunque di rivedere le impostazioni di qualità predefinite – tendono a essere conservative (lossless o quasi) per evitare reclami, il che può sprecare byte.

Il punto fondamentale

L'ottimizzazione delle immagini nel 2026 riguarda i compromessi: AVIF risparmia più byte ma costa CPU; WebP è il compromesso affidabile. Le dimensioni responsive devono essere precise, non approssimative. Il lazy loading è quasi automatico, ma richiede un'applicazione attenta per non danneggiare l'LCP. Una pipeline di immagini ben ottimizzata può ridurre drasticamente il peso della pagina – un vantaggio diretto per l'esperienza utente, i Core Web Vitals e i tassi di conversione.

Abbiamo costruito pipeline per siti che servono decine di milioni di immagini ottimizzate al mese. I principi sono gli stessi indipendentemente dalla scala: codifica in fase di build, fallback graduale, dimensionamento responsive e caricamento lazy ma non avido. Se vuoi fare un audit della tua attuale strategia per le immagini o hai bisogno di aiuto per implementare una pipeline, contatta DigiForge – di solito riusciamo a ridurre sostanzialmente il peso della pagina già al primo passaggio.

#ottimizzazione-immagini#avif#webp#immagini-responsivi#lazy-loading#core-web-vitals
DF

DigiForge Team

Il team di engineering di DigiForge — realizza siti web moderni, modules e automazione, e scrive sull&rsquo;arte di rilasciare prodotti web veloci e duraturi.

Parliamone

Hai un progetto
in mente?

Raccontaci cosa stai realizzando — definiremo un piano chiaro e l&rsquo;approccio giusto per il tuo prodotto.

Inizia il tuo progetto