Implémenter le défilement infini
Chargez automatiquement davantage de contenu lorsque l’utilisateur fait défiler la page.
Implémenter le défilement infini est une leçon HTML Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage HTML Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours HTML Academy comprend 4 leçons au total.
Le principe
Le défilement infini charge davantage de contenu lorsque l’utilisateur s’approche du bas de la liste. L’implémentation la plus propre utilise IntersectionObserver : placez un élément « sentinel » à la fin de la liste et observez-le. Lorsque le sentinel entre dans la fenêtre d’affichage, récupérez la page suivante.
Élément sentinel
Ajoutez un <div> invisible (ou un espace réservé « chargement… ») après le dernier élément de la liste. Observez-le avec IntersectionObserver. Lorsqu’il entre en intersection, cela indique que l’utilisateur a fait défiler la page près du bas : il est temps de récupérer davantage de contenu.
<ul id="feed">
<li>Post 1</li>
<li>Post 2</li>
</ul>
<div id="sentinel" aria-hidden="true"></div>La boucle de l’observateur
Lors de l’intersection : récupérez la page suivante, affichez les nouveaux éléments et repositionnez le sentinel (il reste automatiquement à la fin de la liste si vous ajoutez les éléments avant lui). Il n’est pas nécessaire d’utiliser unobserve puis observe à nouveau : le sentinel est toujours observé.
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);Garde de l’état de chargement
Un indicateur booléen loading empêche l’empilement des requêtes si l’utilisateur fait défiler la page rapidement et déclenche plusieurs intersections avant l’arrivée de la première réponse. Sans cet indicateur, la même page est récupérée plusieurs fois et les éléments apparaissent en double.
Fin des données
Lorsque le serveur renvoie une page vide (ou indique qu’il n’y a « plus rien »), utilisez unobserve sur le sentinel et remplacez-le par un message de fin de liste. Les intersections suivantes ne déclenchent plus de récupérations ; l’utilisateur voit qu’il est arrivé à la fin.
Gestion des erreurs
Placez la récupération dans un bloc try/catch. En cas d’erreur, laissez loading = true afin que les nouvelles tentatives ne se déclenchent pas automatiquement ; affichez un bouton « Réessayer » qui réinitialise loading et relance le chargement. Sans cela, les défaillances réseau provoquent des tentatives répétées en boucle.
rootMargin pour le chargement anticipé
rootMargin: "500px" démarre la récupération suivante 500 pixels avant que l’utilisateur n’atteigne le sentinel. Ajustez cette valeur en fonction de la hauteur des éléments et de la vitesse moyenne de défilement : si elle est trop petite, les utilisateurs rencontrent le message « aucun contenu pour le moment » ; si elle est trop grande, vous récupérez du contenu bien avant qu’il soit nécessaire.
Restauration de la position de défilement
Lorsque l’utilisateur navigue ailleurs puis revient, la position de défilement doit être conservée AND les éléments déjà chargés doivent être affichés à nouveau. Mettez les éléments en cache dans sessionStorage ou dans un store de type Zustand ; restaurez-les au montage et appelez scrollTo avec le décalage mémorisé.
Considérations relatives à la mémoire
Les défilements infinis longs accumulent des milliers de nœuds DOM. Pour les fils très longs (Twitter, Facebook), combinez cette approche avec un fenêtrage : retirez du DOM les éléments situés au-dessus de la fenêtre d’affichage et restaurez-les lors du défilement vers le haut. Des bibliothèques comme react-virtual ou @tanstack/virtual gèrent cela efficacement.
Accessibilité
Le défilement infini pénalise les utilisateurs du clavier et des lecteurs d’écran, qui ne peuvent pas atteindre facilement un pied de page. Prévoyez un bouton « Charger davantage » comme solution de repli et assurez-vous que la page possède un véritable pied de page accessible avec les touches Home et End. Une zone aria-live qui annonce les nouveaux éléments est également utile.
Rebond du défilement mobile
Le défilement avec rebond d’iOS peut déclencher plusieurs intersections près du bas de la page. La garde de chargement gère la plupart des cas ; vous pouvez également appliquer un anti-rebond de 300 ms pour filtrer la rafale d’intersections pendant le rebond.
Alternative : pagination par curseur
Les API serveur devraient renvoyer un « curseur suivant » plutôt que de dépendre de numéros de page suivis par le client, car cette approche résiste aux insertions et suppressions d’éléments pendant le défilement. Le client transmet le curseur à chaque requête et s’arrête lorsque le serveur ne renvoie plus de curseur.
Vérification des connaissances
Pourquoi un indicateur de chargement est-il nécessaire dans une fonction de rappel d’IntersectionObserver pour un défilement infini ?
Résumé
Le défilement infini utilise un IntersectionObserver sur un élément sentinelle placé à la fin de la liste. Lorsqu’il est intersecté, récupérez la page suivante, affichez-la et continuez à observer l’élément. Utilisez un indicateur de chargement, gérez correctement la fin des données et les erreurs, puis ajustez rootMargin pour définir la distance de préchargement. Prévoyez des alternatives accessibles au clavier, comme un bouton « Charger davantage », et envisagez le fenêtrage pour les flux très longs.
Questions Fréquemment Posées
La leçon « Implémenter le défilement infini » est-elle gratuite ?
Oui — le texte complet de « Implémenter le défilement infini » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours HTML Academy, passe à CoddyKit PRO. Le cours HTML Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Implémenter le défilement infini » ?
Chargez automatiquement davantage de contenu lorsque l’utilisateur fait défiler la page. Tu pratiques HTML Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer HTML Academy ?
Aucune expérience préalable n'est requise. HTML Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Implémenter le défilement infini » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon HTML Academy ?
Oui. Chaque leçon HTML Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- API `IntersectionObserver` et seuils
- Chargement différé avec `IntersectionObserver`
- Implémenter le défilement infini
- Configurer des animations liées au défilement