Pagination
CSS-only Tailwind CSS pagination for numbered pages, prev/next arrows, ellipsis gaps, accessible radio inputs, and a page-jump select. No JavaScript required. WCAG AA accessible, works with Django, HTMX, Laravel, React, and any stack.
Les composants de pagination permettent aux utilisateurs de naviguer entre les pages de contenu : résultats de recherche, tableaux de données, archives d'articles et listes de produits. Construite en composant les composants Join et Button, la pagination Frutjam ne nécessite ni JavaScript ni CSS supplémentaire. Prend en charge les pages numérotées, les flèches précédent/suivant, les espaces de points de suspension, les entrées radio accessibles et une sélection de saut de page.
CSS uniquement, aucun JavaScript requis : créez une pagination accessible avec du HTMX pur et du CSS Tailwind. WCAG AA accessible et indépendant du framework – fonctionne avec Django, HTMX, Laravel, React, Next.js et n'importe quelle pile.
| Classe | Taper | Description |
|---|---|---|
| join | Base | Regroupe les boutons dans une bande de pagination connectée |
| join-item | Modificateur | Chaque bouton de page ou entrée à l'intérieur de la jointure |
| btn-active | State | Met en surbrillance la page actuelle |
| btn-disabled | State | Points de suspension non interactifs ou page indisponible |
Pagination de base
Une bande de pages numérotées avec une page active. Appliquez btn-active pour mettre en surbrillance la page actuelle. Utilisez des balises d'ancrage au lieu de boutons pour les liens de page rendus par le serveur.
1 2 3 4 5 6 7 | <div class="join"> <button class="join-item btn">1</button> <button class="join-item btn btn-active">2</button> <button class="join-item btn">3</button> <button class="join-item btn">4</button> <button class="join-item btn">5</button> </div> |
1 2 3 4 5 6 7 | <div className="join"> <button className="join-item btn">1</button> <button className="join-item btn btn-active">2</button> <button className="join-item btn">3</button> <button className="join-item btn">4</button> <button className="join-item btn">5</button> </div> |
Sizes
La pagination hérite de toutes les tailles de boutons. Utilisez btn-xs ou btn-sm pour les tables compactes et btn-lg pour les interfaces tactiles.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <div class="flex flex-col gap-3 items-start"> <div class="join"> <button class="join-item btn btn-xs">1</button> <button class="join-item btn btn-xs btn-active">2</button> <button class="join-item btn btn-xs">3</button> <button class="join-item btn btn-xs">4</button> </div> <div class="join"> <button class="join-item btn btn-sm">1</button> <button class="join-item btn btn-sm btn-active">2</button> <button class="join-item btn btn-sm">3</button> <button class="join-item btn btn-sm">4</button> </div> <div class="join"> <button class="join-item btn">1</button> <button class="join-item btn btn-active">2</button> <button class="join-item btn">3</button> <button class="join-item btn">4</button> </div> <div class="join"> <button class="join-item btn btn-lg">1</button> <button class="join-item btn btn-lg btn-active">2</button> <button class="join-item btn btn-lg">3</button> <button class="join-item btn btn-lg">4</button> </div> </div> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <div className="flex flex-col gap-3 items-start"> <div className="join"> <button className="join-item btn btn-xs">1</button> <button className="join-item btn btn-xs btn-active">2</button> <button className="join-item btn btn-xs">3</button> <button className="join-item btn btn-xs">4</button> </div> <div className="join"> <button className="join-item btn btn-sm">1</button> <button className="join-item btn btn-sm btn-active">2</button> <button className="join-item btn btn-sm">3</button> <button className="join-item btn btn-sm">4</button> </div> <div className="join"> <button className="join-item btn">1</button> <button className="join-item btn btn-active">2</button> <button className="join-item btn">3</button> <button className="join-item btn">4</button> </div> <div className="join"> <button className="join-item btn btn-lg">1</button> <button className="join-item btn btn-lg btn-active">2</button> <button className="join-item btn btn-lg">3</button> <button className="join-item btn btn-lg">4</button> </div> </div> |
Avec points de suspension
Utilisez btn-disabled pour les points de suspension entre une large gamme de pages. Les lecteurs d'écran ignorent les boutons désactivés, alors associez-les à aria-hidden="true" sur les points de suspension.
1 2 3 4 5 6 7 8 9 | <div class="join"> <button class="join-item btn">1</button> <button class="join-item btn">2</button> <button class="join-item btn btn-disabled" aria-hidden="true">...</button> <button class="join-item btn btn-active">12</button> <button class="join-item btn btn-disabled" aria-hidden="true">...</button> <button class="join-item btn">99</button> <button class="join-item btn">100</button> </div> |
1 2 3 4 5 6 7 8 9 | <div className="join"> <button className="join-item btn">1</button> <button className="join-item btn">2</button> <button className="join-item btn btn-disabled" aria-hidden="true">...</button> <button className="join-item btn btn-active">12</button> <button className="join-item btn btn-disabled" aria-hidden="true">...</button> <button className="join-item btn">99</button> <button className="join-item btn">100</button> </div> |
Navigation Précédent / Suivant
La pagination basée sur des flèches est le modèle le plus courant pour les blogs, les listes de produits et tout flux paginé pour lequel l'affichage des numéros de page exacts n'est pas pratique.
Avec des icônes de flèche
1 2 3 4 5 6 7 8 9 | <div class="join"> <button class="join-item btn" aria-label="Previous page"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 18l-6-6 6-6"/></svg> </button> <button class="join-item btn">Page 12</button> <button class="join-item btn" aria-label="Next page"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 18l6-6-6-6"/></svg> </button> </div> |
1 2 3 4 5 6 7 8 9 | <div className="join"> <button className="join-item btn" aria-label="Previous page"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M15 18l-6-6 6-6"/></svg> </button> <button className="join-item btn">Page 12</button> <button className="join-item btn" aria-label="Next page"> <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M9 18l6-6-6-6"/></svg> </button> </div> |
Précédent / Suivant à largeur égale
Utilisez un wrapper grid grid-cols-2 sur le conteneur de jointure pour donner aux deux boutons une largeur égale : idéal pour les mises en page destinées aux mobiles et les barres de pagination pleine largeur.
1 2 3 4 | <div class="join grid grid-cols-2 w-72"> <button class="join-item btn btn-outline">← Previous</button> <button class="join-item btn btn-outline">Next →</button> </div> |
1 2 3 4 | <div className="join grid grid-cols-2 w-72"> <button className="join-item btn btn-outline">← Previous</button> <button className="join-item btn btn-outline">Next →</button> </div> |
Avec premier/dernier
Ajoutez des boutons à double flèche pour permettre aux utilisateurs d'accéder directement à la première ou à la dernière page. Utile pour les tableaux de données comportant des centaines de pages.
1 2 3 4 5 6 7 8 9 | <div class="join"> <button class="join-item btn btn-ghost btn-sm" aria-label="First page">«</button> <button class="join-item btn btn-sm" aria-label="Previous page">‹</button> <button class="join-item btn btn-sm">4</button> <button class="join-item btn btn-sm btn-active">5</button> <button class="join-item btn btn-sm">6</button> <button class="join-item btn btn-sm" aria-label="Next page">›</button> <button class="join-item btn btn-ghost btn-sm" aria-label="Last page">»</button> </div> |
1 2 3 4 5 6 7 8 9 | <div className="join"> <button className="join-item btn btn-ghost btn-sm" aria-label="First page">«</button> <button className="join-item btn btn-sm" aria-label="Previous page">‹</button> <button className="join-item btn btn-sm">4</button> <button className="join-item btn btn-sm btn-active">5</button> <button className="join-item btn btn-sm">6</button> <button className="join-item btn btn-sm" aria-label="Next page">›</button> <button className="join-item btn btn-ghost btn-sm" aria-label="Last page">»</button> </div> |
Pagination radio accessible
Utilisez les entrées type="radio" comme éléments de jointure pour une sélection de page entièrement navigable au clavier, uniquement en CSS, sans JavaScript. Chaque entrée agit comme un bouton pressable tout en conservant l’état sélectionné dans son état natif.
1 2 3 4 5 6 7 | <div class="join"> <input class="join-item btn btn-square" type="radio" name="page" aria-label="1" /> <input class="join-item btn btn-square" type="radio" name="page" aria-label="2" checked /> <input class="join-item btn btn-square" type="radio" name="page" aria-label="3" /> <input class="join-item btn btn-square" type="radio" name="page" aria-label="4" /> <input class="join-item btn btn-square" type="radio" name="page" aria-label="5" /> </div> |
1 2 3 4 5 6 7 | <div className="join"> <input className="join-item btn btn-square" type="radio" name="page" aria-label="1" /> <input className="join-item btn btn-square" type="radio" name="page" aria-label="2" defaultChecked /> <input className="join-item btn btn-square" type="radio" name="page" aria-label="3" /> <input className="join-item btn btn-square" type="radio" name="page" aria-label="4" /> <input className="join-item btn btn-square" type="radio" name="page" aria-label="5" /> </div> |
Pagination avec saut de page
Combinez la jointure, les boutons et la sélection pour obtenir une barre de pagination compacte qui permet aux utilisateurs d'accéder directement à n'importe quelle page, ce qui est courant dans les tableaux de bord d'administration, les interfaces CMS et les applications gourmandes en données. Aucun JavaScript requis pour la sélection elle-même ; associez-le à HTMX ou à un formulaire soumis pour la navigation côté serveur.
1 2 3 4 5 6 7 8 9 10 11 | <div class="join"> <button class="join-item btn btn-sm" aria-label="Previous page">‹</button> <select class="join-item select select-sm" aria-label="Go to page"> <option>Page 1</option> <option>Page 2</option> <option selected>Page 3</option> <option>Page 4</option> <option>Page 5</option> </select> <button class="join-item btn btn-sm" aria-label="Next page">›</button> </div> |
1 2 3 4 5 6 7 8 9 10 11 | <div className="join"> <button className="join-item btn btn-sm" aria-label="Previous page">‹</button> <select className="join-item select select-sm" aria-label="Go to page"> <option>Page 1</option> <option>Page 2</option> <option>Page 3</option> <option>Page 4</option> <option>Page 5</option> </select> <button className="join-item btn btn-sm" aria-label="Next page">›</button> </div> |
Style de contour
Utilisez btn-outline sur tous les boutons pour un poids visuel plus léger qui convient aux sections de contenu secondaire et aux barres latérales.
1 2 3 4 5 6 7 | <div class="join"> <button class="join-item btn btn-outline btn-sm" aria-label="Previous page">‹</button> <button class="join-item btn btn-outline btn-sm">1</button> <button class="join-item btn btn-outline btn-sm btn-active">2</button> <button class="join-item btn btn-outline btn-sm">3</button> <button class="join-item btn btn-outline btn-sm" aria-label="Next page">›</button> </div> |
1 2 3 4 5 6 7 | <div className="join"> <button className="join-item btn btn-outline btn-sm" aria-label="Previous page">‹</button> <button className="join-item btn btn-outline btn-sm">1</button> <button className="join-item btn btn-outline btn-sm btn-active">2</button> <button className="join-item btn btn-outline btn-sm">3</button> <button className="join-item btn btn-outline btn-sm" aria-label="Next page">›</button> </div> |