Przejdź do treści

Table

Stabilny

Semantyczne tabele HTML do danych ustrukturyzowanych — z cyframi tabelarycznymi, stanami wierszy i częściami do budowy tabel z sortowaniem i zaznaczaniem.

WdrożenieStatusCzas
#1284Budowanie31 s
#1283Gotowe48 s
#1282Błąd12 s

Anatomia

Ostatnie wdrożenia
WdrożenieGałąźCzas trwania
#1284main31 s
#1283fix/focus1 min 48 s
  1. 1KontenerPrzewija tabelę w poziomie, gdy jest szersza od strony, zamiast ściskać kolumny.
  2. 2PodpisNazywa tabelę dla czytników ekranu. Pokaż go pod tabelą albo ukryj wizualnie.
  3. 3Komórka nagłówkaEtykieta kolumny, zapisana małym, stonowanym tekstem. Kolumny z sortowaniem mają tu przycisk i ustawiają aria-sort.
  4. 4Komórka liczbowaLiczby są wyrównane do prawej i zapisane cyframi tabelarycznymi, więc w całej kolumnie cyfry stoją równo jedna pod drugą.
  5. 5WierszW treści tabeli ma 48 px wysokości, a od sąsiednich wierszy oddziela go cienka linia. Wiersze treści zabarwiają się po najechaniu, a po zaznaczeniu przyjmują kolor marki.

Instalacja

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

Użycie

import {
  Table,
  TableBody,
  TableCaption,
  TableCell,
  TableFooter,
  TableHead,
  TableHeader,
  TableRow,
} from "@/components/ui/table"
<Table>
  <TableCaption>Usage for September 2026.</TableCaption>
  <TableHeader>
    <TableRow>
      <TableHead scope="col">Resource</TableHead>
      <TableHead scope="col" className="text-right">Cost</TableHead>
    </TableRow>
  </TableHeader>
  <TableBody>
    <TableRow>
      <TableCell>Compute</TableCell>
      <TableCell className="text-right">$186.20</TableCell>
    </TableRow>
  </TableBody>
</Table>

Table otacza element <table> kontenerem przewijanym w poziomie, dzięki czemu szeroka tabela nigdy nie rozbija układu strony na małych ekranach. Liczby domyślnie korzystają z cyfr tabelarycznych, więc cyfry układają się w równe kolumny.

Przykłady

Podpis nazywa tabelę dla wszystkich — to pierwsza rzecz, którą odczytuje czytnik ekranu. TableFooter mieści sumy w zabarwionym wierszu.

Zużycie we wrześniu 2026 r. Ceny nie zawierają podatku.
ZasóbJednostkaIlośćKoszt
Moc obliczeniowaGB-godziny12 480186,20 $
TransferGB3 90258,53 $
Miejsce na daneGB-miesiące81216,24 $
Minuty kompilacjiminuty6 14030,70 $
Razem291,67 $

Tabela danych

Zaznaczanie, sortowanie i akcje wierszy to kwestia kompozycji, a nie konfiguracji: kolumna pól wyboru, przyciski w nagłówkach, które przełączają kolejne kierunki sortowania, i menu w każdym wierszu. Pole wyboru w nagłówku przechodzi w stan pośredni, gdy zaznaczono część wierszy — ale nie wszystkie — a zaznaczone wiersze przyjmują odcień marki.

Zaznaczono: 1 z 6

StatusAkcje
Kestrel Healthaccounts@kestrel.health
Zrealizowana9750,00 USD
Northwind Tradersbilling@northwind.dev
Zrealizowana4820,00 USD
Pinecone Labsbilling@pinecone.dev
Zrealizowana2190,75 USD
Lumen Studiofinance@lumen.studio
Oczekująca1260,00 USD
Oakline Banktreasury@oakline.com
Zwrócona640,00 USD
Atlas Roboticsap@atlasrobotics.io
Nieudana312,50 USD
<TableHead aria-sort={sort?.key === "amount" ? sort.direction : "none"}>
  <Button variant="ghost" size="xs" onClick={() => toggleSort("amount")}>
    Amount
    <ArrowUpDownIcon data-icon="inline-end" />
  </Button>
</TableHead>
Duże zbiory danych
Przykład przechowuje stan w Reakcie. Do sortowania po stronie serwera, paginacji i wirtualizacji połącz te części z biblioteką typu headless, taką jak TanStack Table — znaczniki pozostają bez zmian.

Stan pusty

Gdy zapytanie nic nie zwraca, zostaw nagłówek — dzięki niemu wiadomo, co mogłoby się tu znaleźć — a w jednej komórce na całą szerokość tabeli umieść stan Empty, który wskazuje wyjście z sytuacji.

WdrożenieGałąźAutorCzas trwania
Brak wdrożeń pasujących do „hotfix/*”

Ładowanie

Podczas ładowania danych pokaż wiersze szkieletowe w kształcie prawdziwej treści i oznacz tabelę atrybutem aria-busy, żeby technologie wspomagające na nią zaczekały.

KlientPlanMRR
Ładowanie klientów…

Wytyczne

Kiedy używać

  • Do porównywania wielu obiektów według tego samego zestawu atrybutów.
  • Gdy trzeba przeglądać, sortować lub filtrować wiersze albo wykonywać na nich akcje.

Kiedy nie używać

  • Do budowania układu. Tabele służą do danych; do rozmieszczania elementów na stronie używaj grid lub flex.
  • Do kilku obiektów z rozbudowaną treścią — sięgnij po Card albo listę elementów Item.
  • Do pól pojedynczego rekordu — użyj listy opisów.

Wyrównanie

  • Tekst do lewej, liczby do prawej. Liczby wyrównane do prawej ustawiają jedności, dziesiątki i setki w tych samych kolumnach — w połączeniu z cyframi tabelarycznymi rzędy wielkości da się porównać jednym spojrzeniem.
  • Wyrównuj nagłówek tak samo jak zawartość jego kolumny — łącznie z przyciskiem sortowania.
  • Jednostki podawaj w nagłówku (Koszt (USD), Czas (s)), zamiast powtarzać je w każdej komórce.
PlanMRR
Pro1 240,00 $
Team86,50 $
Enterprise12 900,00 $
Dobrze.Liczby wyrównane do prawej, zapisane cyframi tabelarycznymi: rzędy wielkości stoją w jednej linii.
PlanMRR
Pro1 240,00 $
Team86,50 $
Enterprise12 900,00 $
Źle.Liczby wyrównane do lewej ukrywają rząd wielkości, dopóki nie przeczytasz każdej cyfry.

Gęstość

Wiersze mają 48 px wysokości — to wygodna wartość dla mieszanej treści z odznakami i akcjami. W tabelach tylko do odczytu, zawierających same liczby, zmniejsz wysokość komórek przez className="h-10"; nie schodź poniżej 32 px — to najmniejszy cel, w który wygodnie trafić wskaźnikiem.

Akcje wierszy

Akcje dotyczące jednego wiersza umieść w menu z dodatkowymi opcjami na końcu wiersza, a akcje dla wielu wierszy — na pasku narzędzi, który pojawia się po zaznaczeniu wierszy. Wiersz może być klikalny w całości albo zawierać przyciski — nigdy jedno i drugie naraz.

Dostępność

Tabele prfct to prawdziwe elementy <table>, więc wiersze, kolumny i nagłówki są odczytywane bez dodatkowych atrybutów ARIA.

KlawiszDziałanie
Tab
Przenosi fokus między elementami interaktywnymi w tabeli: polami wyboru, przyciskami sortowania, menu wierszy.
Spacja
Zaznacza lub odznacza pole wyboru wiersza, na którym jest fokus.
EnterSpacja
Aktywuje przycisk sortowania, na którym jest fokus, albo otwiera menu wiersza.
  • Nazwij tabelę. Użyj TableCaption albo aria-label, jeśli tabelę nazywa już widoczny nagłówek nad nią.
  • Określ zakres nagłówków. Dodaj scope="col" do nagłówków kolumn (a scope="row" do nagłówków wierszy), żeby każda komórka była odczytywana razem ze swoim nagłówkiem.
  • Informuj o sortowaniu. Ustaw aria-sort na posortowanym TableHead (ascending, descending lub none). Sama ikona nie zostanie odczytana.
  • Nadaj etykietę każdej kontrolce. Pola wyboru i menu w wierszach potrzebują etykiet, które nazywają wiersz — „Zaznacz płatność od Northwind Traders”, a nie „Zaznacz”.
  • Zaznaczenie to nie tylko kolor. Odcień zaznaczenia zawsze idzie w parze z zaznaczonym polem wyboru — nie polegaj na samym odcieniu.

Dokumentacja API

Każda część renderuje odpowiadający jej element HTML i przyjmuje wszystkie jego propsy.

KomponentElementUwagi
Table<table>Otoczony elementem <div data-slot="table-container">, który przewija się w poziomie. Cyfry tabelaryczne włączone.
TableHeader<thead>Dolne obramowanie; wiersze nagłówka nie mają stanu najechania.
TableBody<tbody>Usuwa obramowanie z ostatniego wiersza.
TableFooter<tfoot>Zabarwiona powierzchnia i średnia grubość pisma, z myślą o sumach.
TableRow<tr>Odcień po najechaniu; data-state="selected" nadaje odcień zaznaczenia.
TableHead<th>Wysokość 40 px, mały stonowany tekst. Kolumny z polami wyboru zwężają się do zawartości.
TableCell<td>Wysokość 48 px. Pierwsza i ostatnia komórka mają 16 px odstępu od krawędzi tabeli.
TableCaption<caption>Wyświetlany pod tabelą stonowanym tekstem.