devdev / in the loop

Lazyload JS: caricamento immagini progressivo on scroll

Lazyload JS (chiamato anche vanilla-lazyload) è uno script che permette il caricamento delle immagini allo scroll della pagina (effetto detto appunto “lazy load”). Perché lo facciamo? Innanzitutto per velocizzare il caricamento della pagine e poi per fornire una migliore User Experience: soltanto le immagini che effettivamente sono visibili nel viewport saranno richieste al server e mostrate all’utente.

Sembra banale ma.. perché richiedere risorse al server che non verranno mai usate? Questo porta anche ad un secondo vantaggio: risparmiare risorse e banda consumata. Se usiamo un servizio CDN risparmieremo decisamente molte richieste.

Lazyload è uno script di soli 3Kb che non ha dipendenze, cioè può essere usato senza includere jQuery o altre librerie. È scritto in javascript “liscio” (detto vanilla) e ha un moltissime di opzioni di configurazione che vedremo in questo articolo.

Includiamo lo script

Innanzitutto includiamo lo script nelle nostre pagine. Il consiglio è quello di farlo attraverso un CDN, in modo da non caricare nessun file sul nostro server e sfruttare l’ottimizzazione di Cloudflare:

<script src="https://cdnjs.cloudflare.com/ajax/libs/vanilla-lazyload/8.2.1/lazyload.min.js"></script>

 

A questo punto ci sono vari modi per sfruttare le sue potenzialità. Tutto dipende da come sono posizionate le immagini nel nostro codice e che obiettivo vogliamo raggiungere. Vediamo tre esempi pratici:

Caso 1: immagini in-line

Usiamo questo semplice esempio per il caso più diffuso, cioè un immagine da caricare una volta che è “nello schermo”:

HTML

<img alt="..." 
     data-original="../img/mare.jpg"
     width="400" height="300">

Javascript

var myLazyLoad = new LazyLoad();

Caso 2: immagini responsive con srcset

In questo caso usiamo la tecnica delle misure srcset , sostituendolo con l’attributo data-original-set :

HTML

<img data-original="/img/mare.jpg"
    data-original-set="/img/mare.jpg 200w, /img/mare@2x.jpg 400w"
    sizes="(min-width: 20em) 35vw, 100vw">

Javascript

var myLazyLoad = new LazyLoad();

Caso 3: con il tag <picture>

Se usiamo il tag <picture> per le immagini responsive, possiamo usare un codice analogo a questo:

HTML

<picture>
    <source media="(min-width: 1024px)" data-original-set="/img/mare1.jpg" />
    <source media="(min-width: 500px)" data-original-set="/img/mare2.jpg" />
    <img data-original="/img/mare.jpg">
</picture>

Javascript

var myLazyLoad = new LazyLoad();

Caso 4: immagini di sfondo CSS

Se volessimo applicare l’effetto lazyload a immagini posizionate come background-image  in CSS, possiamo farlo in questo modo:

HTML

<div class="lazy" data-original="../img/mare-sfondo.jpg"></div>

Javascript

var myLazyLoad = new LazyLoad({
    elements_selector: ".lazy"
});

Ulteriori vantaggi

È SEO-friendly perché non nasconde le immagini ai motori di ricerca.

Funziona anche in presenza di altri script, come jQuery, Angular, React o Vue.

È molto più veloce del famoso jQuery lazyload: si stima infatti che sia circa 6 volte più veloce.

Questo articolo ti è stato utile?
CSS – LETTURA 5 MINUTI Immagini responsive in CSS con background-image
Nella quasi totalità dei casi, quando parliamo di immagini responsive, ci riferiamo alle immagini inline in HTML. Questo perché prima…
UX – LETTURA 6 MINUTI Preparare le immagini per Lazyload JS in WordPress
<script> window.lazyLoadOptions = { /* your lazyload options */ }; </script> <script src="https://cdnjs.cloudflare.com/ajax/libs/vanilla-lazyload/8.2.0/lazyload.min.js"></script> In un precedente articolo, abbiamo visto come…
Server – LETTURA 5 MINUTI Aggiungere la compressione gzip ai file SVG su nginx
I file SVG sono un modo eccezionale per avere delle immagini vettoriali senza alcuna perdita di qualità. A differenza di…
Server – LETTURA 7 MINUTI Usare la compressione gzip in Apache e nginx per aumentare la velocità
La velocità di caricamento sembra essere sempre più il centro focale del web. Come vi abbiamo già raccontato, costruire un…
Roba figa da
if (weekend) {
    relax();
}
la nostra newsletter, ogni tanto.