Przejdź do treści

Pagination

Stabilny

Dzieli długi zbiór wyników na strony i pozwala się między nimi poruszać — przewidywalnie, z linkami, które można udostępnić, i z poczuciem, jak duży jest cały zbiór.

Anatomia

  1. 1PoprzedniaCofa o jedną stronę. Na małych ekranach zwija się do samej strzałki.
  2. 2Link do stronyPrawdziwy link do strony — najlepiej z numerem strony w adresie URL.
  3. 3Bieżąca stronaWyróżniona obrysem i odczytywana jako bieżąca strona.
  4. 4WielokropekZastępuje pominięte strony.
  5. 5NastępnaPrzechodzi o jedną stronę dalej.

Instalacja

$ pnpm dlx shadcn@latest add https://www.prfct.dev/r/pagination.json

Użycie

import {
  Pagination,
  PaginationContent,
  PaginationEllipsis,
  PaginationItem,
  PaginationLink,
  PaginationNext,
  PaginationPrevious,
} from "@/components/ui/pagination"
<Pagination>
  <PaginationContent>
    <PaginationItem>
      <PaginationPrevious href="?page=1" />
    </PaginationItem>
    <PaginationItem>
      <PaginationLink href="?page=2" isActive>
        2
      </PaginationLink>
    </PaginationItem>
    <PaginationItem>
      <PaginationNext href="?page=3" />
    </PaginationItem>
  </PaginationContent>
</Pagination>

Strony to prawdziwe linki. Umieść numer strony w adresie URL (?page=3), aby wyniki dało się udostępnić, dodać do zakładek, przywrócić przyciskiem Wstecz i zaindeksować w wyszukiwarkach.

Przykłady

Domyślna

Bieżąca strona dostaje isActive, który przełącza ją na styl z obrysem i ustawia aria-current="page". Poniżej breakpointu sm linki PoprzedniaNastępna zwijają się do samych strzałek.

Kontrolowana z zakresem stron

Gdy stron jest dużo, pokaż pierwszą, ostatnią i bieżącą wraz z sąsiednimi; luki zastąp komponentem PaginationEllipsis. Liczba elementów nie zmienia się podczas przechodzenia między stronami, więc kontrolki nie przesuwają się pod kursorem.

Strona 7 z 20

Kompaktowa

Gdy brakuje miejsca albo konkretna strona jest mniej ważna niż kierunek, pokaż pozycję jako tekst między dwoma linkami z ikonami. Każdemu z tych linków nadaj aria-label.

W tabelach danych paginacji towarzyszy wybór liczby wierszy na stronie i podsumowanie zakresu (26–50 z 237). Po zmianie tej liczby wróć do pierwszej strony.

Wierszy na stronę

Wytyczne

Kiedy używać

  • Dla zbiorów wyników, które się przeszukuje i filtruje, i do których się wraca: tabel, list w panelach administracyjnych, wyników wyszukiwania, archiwów.
  • Gdy liczy się pozycja w zbiorze albo trzeba dotrzeć do końca bez wczytywania wszystkiego, co jest przed nim.

Kiedy nie używać

  • Dla strumieni treści, które się przegląda, a nie przeszukuje — lepiej sprawdzi się nieskończone przewijanie lub przycisk Wczytaj więcej.
  • Gdy elementów jest mniej niż około 25 — pokaż wszystkie na jednej stronie.
  • Dla kroków procesu — użyj wskaźnika kroków; strony sugerują równorzędne, niezależne od siebie części.

Paginacja, „Wczytaj więcej” czy nieskończone przewijanie

WzorzecWybierz, gdy
PaginacjaUżytkownicy porównują konkretne wyniki, wracają do nich lub je udostępniają; stopka musi pozostać osiągalna; zbiór jest duży i skończony.
„Wczytaj więcej”Przeglądanie jest swobodne, ale użytkownicy nadal potrzebują stopki i kontroli nad tym, ile treści się wczytuje.
Nieskończone przewijanieTreść to strumień bez wyraźnego końca (jak w mediach społecznościowych). Unikaj go wszędzie tam, gdzie użytkownik ma coś do załatwienia.

Zachowanie

Trzymaj kontrolkę w tym samym miejscu na każdej stronie — pod wynikami, a przy długich listach opcjonalnie także nad nimi. Po zmianie strony przewiń do początku wyników i zachowaj filtry oraz sortowanie. Pokaż łączną liczbę wyników, jeśli ją znasz — ułatwia decyzję, czy zawęzić wyszukiwanie.

26–50 z 237
Dobrze.Stabilna kontrolka z oznaczoną bieżącą pozycją i jasno podaną liczbą wszystkich wyników.
Źle.Dziesiątki linków do stron przytłaczają i zawijają się do kolejnych wierszy; nic nie wskazuje, gdzie jesteś.

Dostępność

  • Punkt orientacyjny. Pagination renderuje <nav> z etykietą Paginacja — w języku ustawionym przez LocaleProvider. Jeśli na stronie są dwie paginacje (nad wynikami i pod nimi), nadaj im różne etykiety, np. Paginacja, góraPaginacja, dół.
  • Bieżąca strona. isActive ustawia aria-current="page", więc bieżąca strona jest odczytywana przez czytniki ekranu, a nie tylko wyróżniona wizualnie.
  • Linki kierunkowe mają etykiety Przejdź do poprzedniej stronyPrzejdź do następnej strony — także wtedy, gdy widać tylko strzałki.
  • Wielokropki są ukryte przed technologiami wspomagającymi; znaczenie niosą otaczające je numery stron.
  • Wyłączone skrajne linki. Na pierwszej i ostatniej stronie ustaw aria-disabled na linku Poprzednia lub Następna i zostaw go na miejscu, aby układ nie przeskakiwał.
KlawiszDziałanie
Tab
Przenosi fokus kolejno po linkach do stron.
Enter
Otwiera link z fokusem.

Dokumentacja API

Pagination

Punkt orientacyjny <nav>. Przyjmuje wszystkie propsy elementu <nav>.

PaginationContent i PaginationItem

PaginationContent to element <ul>, który rozmieszcza pozycje; PaginationItem to każdy pojedynczy <li>.

Renderuje element <a> ostylowany jak Button z prfct.

PropTypDomyślnie
href

Adres strony — najlepiej URL z numerem strony.

stringBrak wartości domyślnej
isActive

Oznacza bieżącą stronę: styl z obrysem i aria-current="page".

booleanfalse
size

Rozmiar przycisku; numery stron używają kwadratowych rozmiarów przeznaczonych dla przycisków z ikoną.

"xs" | "sm" | "default" | "lg" | "xl" | "icon" | "icon-xs" | "icon-sm" | "icon-lg""icon"

PaginationPrevious i PaginationNext

PropTypDomyślnie
href

Adres poprzedniej lub następnej strony.

stringBrak wartości domyślnej
text

Widoczna etykieta, wyświetlana od breakpointu sm wzwyż. Domyślnie komunikaty bieżącego języka.

stringmessages.previous | messages.next

PaginationEllipsis

Czysto prezentacyjny znak , który zastępuje pominięte strony.