Infinite scroll, pagination & SEO : comment les combiner sans tuer votre trafic ?

Découvrez pourquoi une pagination accessible, indexable et bien structurée est essentielle. Apprenez à mixer scroll infini, "charger plus" et liens profonds HTML pour allier UX moderne et référencement efficace.

Pagination, infinite scroll, bouton charger plus

Le scroll infini, c'est beau. Fluide. Moderne. Mais si c'est mal foutu, c'est surtout un trou noir pour Google.

Une seule URL. Aucun lien profond. Pas de crawl. Pas d'indexation. Et donc : zéro trafic sur vos contenus paginés.

Et pourtant, la solution est simple : mixer scroll infini, pagination HTML et accessibilité. Une stratégie hybride, propre et éprouvée, que je recommande depuis des années. Google ne la documente pas. Mais elle fonctionne. Et je vous montre comment.

Pourquoi c'est crucial : SEO, accessibilité, exigences 2025

Google ne scroll pas, il clique

Oui, votre script JS qui charge des blocs au scroll est génial. Mais Google ne scrolle pas comme vos users.
Et non, il n'utilise plus les balises <link rel="next"> et <link rel="prev"> depuis 2019.

Ce que Google attend ?
Des liens HTML clairs vers chaque page, accessibles sans JavaScript.

Est-ce qu'on utilise quand même les <link rel="next"> et <link rel="prev"> ? Oui, il n'y a pas que Google dans la vie.

Le scroll infini n'est pas conforme si vous oubliez l'accessibilité

Depuis le European Accessibility Act 2025, vous avez l'obligation d'offrir une navigation :

  • utilisable au clavier
  • avec repères clairs et structurés
  • accessible sans deviner "qu'il faut scroller pour charger plus"
  • Pas de pagination = pas de repères = non conforme.

Pagination vs scroll infini vs "Afficher plus" : que choisir ?

Méthode UX SEO Accessibilité
Pagination classique ✅ Stable, claire ✅ Crawlable + indexable
Bouton "Afficher plus" ✅ Moderne, sans surprise ⚠️ OK si fallback HTML
Infinite scroll ✅ Fluide ❌ Invisible sans stratégie ⚠️ Complexe

Et c'est là qu'intervient la stratégie combinée.

La stratégie hybride recommandée

1. Commencez par une pagination HTML

<nav class="pagination" aria-label="Pagination">
  <ul>
    <li><a href="/blog/page/1" aria-label="Aller à la page 1">1</a></li>
    <li><a href="/blog/page/2" aria-label="Aller à la page 2">2</a></li>
    <li><a href="/blog/page/3" aria-current="page" aria-label="Page 3">3</a></li>
    <li><a href="/blog/page/4" aria-label="Aller à la page 4">4</a></li>
    <!-- ... -->
  </ul>
</nav>

Navigable sans JS, accessible clavier, et crawlable, tout est ok.

2. Ajoutez un bouton "Charger plus"

<button id="load-more" aria-label="Charger plus d'articles">
  Charger plus
</button>

Ce bouton déclenche ensuite le passage en infinite scroll, après action explicite.

3. Activez l'infinite scroll après ce clic

const loadMoreButton = document.getElementById('load-more');
let page = 4;
let scrollEnabled = false;

loadMoreButton.addEventListener('click', (e) => {
  e.preventDefault()
  scrollEnabled = true;
  loadPage(page++);
});

const observer = new IntersectionObserver((entries) => {
  const entry = entries[0];
  if (entry.isIntersecting && scrollEnabled) {
    loadPage(page);
    history.pushState(null, "", `/blog/page/${page}`);
    page++;
  }
}, {
  root: null,
  rootMargin: '0px',
  threshold: 1.0
});

observer.observe(loadMoreButton);

Important : le changement d'URL (pushState) permet aux utilisateurs de partager un lien profond, et à Google de suivre la structure, s'il y a une vraie page derrière.

4. Test sans JS

Coupez JavaScript dans votre navigateur. Est-ce que vous pouvez aller à /blog/page/7 ?
Si non : votre contenu profond est invisible.

5. Balise canonical sur la page courante

Sur /blog/page/3 et surtout pas vers /page/1

<link rel="canonical" href="https://votre-site.com/blog/page/3">

Doit-on indexer les pages suivantes ?

La règle est simple :
On indexe les pages paginées, sauf si elles sont liées à des paramètres de tri ou de filtre.
Pourquoi ?
Parce qu'une URL comme /produits?page=2&sort=prix-desc génère une version alternative d'un contenu déjà existant.
Si vous laissez Google indexer toutes ces variations, vous dupliquez le contenu pour rien.

Ce que l'on veut :
/articles/page/2 : indexable
/articles/page/2?sort=popularity : noindex

Et surtout :
La balise canonical doit pointer vers la page courante.
Jamais vers la page 1. Jamais vers une URL filtrée.

Besoin de pagination profonde propre ? Utilisez deep-pagination

Quand vous avez 1 000, 10 000 voire 1 000 000 de pages, afficher tous les numéros est absurde. Mais vous devez permettre à Google et à l'utilisateur d'accéder à des pages lointaines intelligemment.

En SEO, plus une page est éloignée de la page d’accueil, moins elle bénéficie de jus de lien. Pour un contenu situé en page 1337, par exemple, il est essentiel de construire une pagination intelligente permettant d’y accéder avec un minimum de clics depuis la page d’accueil.

C’est pour ça que j’ai open-sourcé une petite lib à l'occasion de cet article : deep-pagination.
Je l'ai conçue pour gérer la pagination profonde avec un bon équilibre entre SEO, accessibilité et lisibilité, je l'utilise en prod depuis des années.

Exemple d'utilisation :

npm install deep-pagination
import { deepPagination } from 'deep-pagination';

const result = deepPagination({
  current: 1250,
  max: 50000
});

console.log(result.pages);
// [1, 250, 500, 1000, "…", 1248, 1249, 1250, 1251, 1252, "…", 5000, 10000, 25000, 50000]

Parfait pour générer des <li><a> dans une pagination sémantique :

<nav aria-label="Pagination">
  <ul>
    <!-- ... -->
    <li><a href="/page/1000" aria-label="Aller à la page 1000">1000</a></li>
    <li><span aria-hidden="true"></span></li>
    <li><a href="/page/1249" aria-label="Aller à la page 1249">1249</a></li>
    <li><a href="/page/1250" aria-current="page" aria-label="Page 1250">1250</a></li>
    <li><a href="/page/1251" aria-label="Aller à la page 1251">1251</a></li>
    <li><span aria-hidden="true"></span></li>
    <!-- ... -->
  </ul>
</nav>

Résumé : les règles d'or

  • Chaque page paginée a une URL propre et indexable
  • La canonical pointe vers la page courante, jamais vers la page 1
  • On indexe la pagination, sauf si elle contient des paramètres de tri ou de filtre
  • Le scroll infini n'est activé qu'après une action utilisateur
  • L'URL change dynamiquement (pushState) pour les pages chargées
  • On teste sans JavaScript pour s'assurer que tout est crawlable
  • On peut utiliser deep-pagination pour générer intelligemment des liens vers des pages profondes
  • SEO
  • UX
  • Accessibilité
  • Bonnes pratiques
  • Développement Web
  • Link Building
  • Structure HTML
  • Code Quality
Jérôme Musialak

Jérôme Musialak

CEO @ Enodo

Développeur passionné depuis l'âge de 11 ans, Jérôme a fait ses armes chez MinuteBuzz puis en tant que CTO de MeltyGroup, où il a piloté l'infrastructure technique d'une trentaine de sites à fort trafic incluant Virgin Radio, L'Étudiant, ... et les médias du groupe. Fort de cette expérience et conscient des défis récurrents rencontrés par les entreprises pour créer et diffuser efficacement leur contenu, il fonde Enodo (du latin "dénouer les nœuds") avec pour mission de simplifier l'écosystème digital. Expert en optimisation de performance et en architecture haute disponibilité, il met son obsession du détail technique au service des enjeux business pour construire des systèmes fiables qui permettent à chacun de dormir tranquille.

Sur le même thème