HTML Academy · Lezione

Implementare lo scorrimento infinito

Caricare automaticamente altri contenuti mentre l’utente scorre

Lezione 3 di 414 passaggi

Implementare lo scorrimento infinito è una lezione HTML Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento HTML Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso HTML Academy include 4 lezioni in totale.

Il pattern

Lo scorrimento infinito carica altro contenuto quando l'utente si avvicina alla fine della lista. L'implementazione più semplice utilizza IntersectionObserver: inserisca un elemento "sentinel" alla fine della lista e lo osservi. Quando il sentinel entra nel viewport, esegua fetch della pagina successiva.

Elemento sentinel

Aggiunga un <div> invisibile (oppure un segnaposto "loading...") dopo l'ultimo elemento della lista. Lo osservi con IntersectionObserver. Quando si verifica l'intersezione, significa che l'utente ha fatto scorrere la pagina vicino alla fine: è il momento di eseguire fetch di altri contenuti.

<ul id="feed">
  <li>Post 1</li>
  <li>Post 2</li>
</ul>
<div id="sentinel" aria-hidden="true"></div>

Ciclo dell'observer

Al verificarsi dell'intersezione, esegua fetch della pagina successiva, renderizzi i nuovi elementi e riposizioni il sentinel (rimane automaticamente alla fine della lista se gli elementi vengono aggiunti prima di esso). Non è necessario eseguire unobserve e poi observe di nuovo: il sentinel è ancora osservato.

const sentinel = document.getElementById("sentinel");
const feed = document.getElementById("feed");
let page = 1;
let loading = false;
const observer = new IntersectionObserver(async (entries) => {
  if (!entries[0].isIntersecting || loading) return;
  loading = true;
  const items = await fetchPage(page++);
  items.forEach((it) => feed.insertAdjacentHTML("beforeend", renderItem(it)));
  loading = false;
});
observer.observe(sentinel);

Protezione dello stato di caricamento

Un flag booleano loading impedisce di accumulare richieste se l'utente scorre rapidamente e provoca più intersezioni prima dell'arrivo della prima risposta. Senza questo flag, la stessa pagina viene scaricata ripetutamente e gli elementi compaiono duplicati.

Fine dei dati

Quando il server restituisce una pagina vuota (o segnala che "non ce ne sono altre"), rimuova l'osservazione del sentinel e lo sostituisca con un messaggio di fine lista. Le intersezioni successive non avviano richieste fetch e l'utente vede di aver raggiunto la fine.

Gestione degli errori

Racchiuda fetch in try/catch. In caso di errore, lasci loading = true in modo che i tentativi non vengano avviati automaticamente; mostri un pulsante "Riprova" che reimposta loading e riattiva il caricamento. In caso contrario, gli errori di rete possono causare una raffica di tentativi.

rootMargin per il caricamento anticipato

rootMargin: "500px" avvia la richiesta fetch successiva 500 px prima che l'utente raggiunga il sentinel. Lo regoli in base all'altezza degli elementi e alla velocità media di scorrimento: se è troppo piccolo, gli utenti raggiungeranno il messaggio "nessun contenuto disponibile"; se è troppo grande, verranno caricati dati in anticipo non necessari.

Ripristino della posizione di scorrimento

Quando l'utente si allontana dalla pagina e poi torna, la posizione di scorrimento dovrebbe essere preservata e gli elementi caricati in precedenza dovrebbero essere renderizzati nuovamente. Memorizzi gli elementi in sessionStorage o in uno store in stile Zustand; li ripristini al mount e utilizzi scrollTo per raggiungere l'offset memorizzato.

Considerazioni sulla memoria

Gli scorrimenti infiniti molto lunghi accumulano migliaia di nodi DOM. Per feed molto lunghi (Twitter, Facebook), combini questa tecnica con il windowing: rimuova dal DOM gli elementi sopra il viewport e li ripristini quando l'utente scorre verso l'alto. Librerie come react-virtual o @tanstack/virtual gestiscono questa operazione in modo efficiente.

Accessibilità

Lo scorrimento infinito è problematico per gli utenti che usano la tastiera o i lettori di schermo e che non possono raggiungere facilmente il piè di pagina. Fornisca un pulsante alternativo "Carica altro" come fallback e si assicuri che la pagina disponga di un vero piè di pagina accessibile tramite i tasti Home/End. È inoltre utile una regione aria-live che annunci i nuovi elementi.

Scorrimento con rimbalzo sui dispositivi mobili

Lo scorrimento con rimbalzo di iOS può provocare più intersezioni vicino alla fine della pagina. La protezione del caricamento gestisce la maggior parte dei casi; può anche applicare un debounce di 300 ms per filtrare la raffica di intersezioni durante il rimbalzo.

Alternativa: paginazione basata su cursore

Le API del server dovrebbero restituire un "next cursor" invece di affidarsi ai numeri di pagina tracciati dal client, perché questa soluzione è più robusta rispetto all'inserimento o all'eliminazione di elementi durante lo scorrimento. Il client passa il cursore a ogni richiesta e si ferma quando il server non restituisce alcun cursore.

Verifica delle conoscenze

Perché è necessario un flag "loading" nel callback di IntersectionObserver per lo scorrimento infinito?

Riepilogo

Lo scorrimento infinito utilizza un IntersectionObserver su un elemento sentinella alla fine dell'elenco. Quando si verifica l'intersezione, recuperi la pagina successiva, la renderizzi e continui a osservare l'elemento. Utilizzi un flag di caricamento come protezione, gestisca con attenzione la fine dei dati e gli errori e regoli rootMargin per definire la distanza di prefetch. Fornisca alternative accessibili da tastiera, come il pulsante Load more, e valuti il windowing per feed molto lunghi.

Gratis per iniziare

Impara HTML con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
40
Lezioni
159

Domande Frequenti

La lezione «Implementare lo scorrimento infinito» è gratuita?

Sì — il testo completo di «Implementare lo scorrimento infinito» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso HTML Academy, passa a CoddyKit PRO. Il corso HTML Academy include 4 lezioni in totale.

Cosa imparerò in «Implementare lo scorrimento infinito»?

Caricare automaticamente altri contenuti mentre l’utente scorre Eserciti HTML Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare HTML Academy?

Non è richiesta alcuna esperienza precedente. HTML Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Implementare lo scorrimento infinito»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione HTML Academy?

Sì. Ogni lezione HTML Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. IntersectionObserver API e soglie
  2. Caricamento differito con IntersectionObserver
  3. Implementare lo scorrimento infinito
  4. Configurare animazioni legate allo scorrimento
← Torna a HTML Academy