DEV Community

Piotr Wisniewski
Piotr Wisniewski

Posted on

ARIA w tabelach danych a wymogi EAA: jak wdrożyć dostępność bez przekraczania budżetu MŚP?

ARIA w tabelach danych a wymogi EAA: jak wdrożyć dostępność bez przekraczania budżetu MŚP?

Meta: Dowiedz się, jak wdrożyć dostępność tabel danych zgodnie z EAA i WCAG 2.1, nie przepalając budżetu. Praktyczne przykłady ARIA dla programistów.

W świecie małych i średnich przedsiębiorstw (MŚP), gdzie zespół deweloperski liczy od 5 do 10 osób, "dostępność" (accessibility) często ląduje na samym dole listy priorytetów. Zazwyczaj traktujemy ją jako "nice-to-have", dopóki nie pojawia się widmo kar finansowych lub wymogi nowych regulacji. Jednak Europejski Akt o Dostępności (EAA), który wchodzi w życie w pełni w czerwcu 2025 roku, zmienia zasady gry. Dla wielu z nas, programistów w Warszawie, Krakowie czy Wrocławiu, oznacza to, że dostępność cyfrowa przestaje być kwestią etyki, a staje się wymogiem prawnym.

Największym problemem, z jakim mierzę się w moich konsultacjach, są tabele. Tabele danych – od prostych list cenników po zaawansowane dashboardy analityczne – to najczęstszy punkt zapalny podczas audytów WCAG. Dlaczego? Bo większość z nas buduje tabele "na oko", zapominając, że czytnik ekranu (screen reader) nie widzi layoutu, a jedynie strukturę DOM.

Jeśli Twoja tabela to w rzeczywistości zestaw div-ów udających tabelę, albo brak jej odpowiednich nagłówków, ryzykujesz nie tylko niezadowoleniem użytkowników, ale i problemami prawnymi. W tym artykule pokażę Wam, jak podejść do tematu ARIA w tabelach, aby spełnić wymogi EAA, nie poświęcając przy tym trzech miesięcy pracy zespołu.

EAA i polski kontekst prawny: Dlaczego to teraz ważne?

Zanim przejdziemy do kodu, wyjaśnijmy kwestię prawną. EAA (European Accessibility Act) to dyrektywa, która ma na celu ujednolicenie wymogów dostępności produktów i usług w całej UE. W Polsce implementacja tej dyrektywy oznacza, że wiele sektorów (handel elektroniczny, usługi bankowe, transport) będzie musiało spełniać standardy WCAG 2.1 na poziomie AA.

Jako konsultant compliance często widzę ten sam błąd: firmy czekają do ostatniej chwili, a potem panikują, próbując "dokleić" dostępność do gotowego produktu. To najdroższa możliwa metoda. Koszt refaktoryzacji całego UI w ostatnim kwartale przed deadline'em jest o rzędy wielkości wyższy niż wdrożenie prostych zasad semantyki na etapie developmentu.

Pamiętajmy o doświadczeniach z UODO. Choć Urząd Ochrony Danych Osobowych skupia się na RODO, trend jest jasny: organy nadzorcze w całej UE zaczynają rygorystycznie podchodzić do inkluzywności cyfrowej. Brak dostępności może być interpretowany jako dyskryminacja, co w połączeniu z nowymi przepisami EAA może prowadzić do konkretnych sankcji finansowych. W budżecie firmy zatrudniającej 8 deweloperów, kara rzędu kilkunastu tysięcy euro może zrujnować kwartalny plan inwestycyjny.

Anatomia dostępnej tabeli: Semantyka vs ARIA

Pierwsza zasada, którą powtarzam każdemu zespołowi: Najlepszy ARIA to brak ARIA.

Jeśli możesz użyć natywnego elementu HTML, zrób to. Natywne elementy mają wbudowaną dostępność, której nie musisz programować ręcznie. Jeśli użyjesz <table>, <thead>, <tbody>, <th> i <td>, większość czytników ekranu (takich jak NVDA czy JAWS) automatycznie zrozumie relację między nagłówkiem a komórką danych.

Błąd nr 1: Tabele z div-ów

Najgorszą rzeczą, jaką możesz zrobić, jest budowanie tabeli z div i span. Jeśli absolutnie musisz to zrobić (np. ze względu na ekstremalnie skomplikowany responsive design), musisz użyć ról ARIA, aby "powiedzieć" czytnikowi ekranu, co jest czym.

Zły przykład (Niedostępny):

<div class="table">
  <div class="row">
    <div class="cell">Produkt</div>
    <div class="cell">Cena</div>
  </div>
  <div class="row">
    <div class="cell">Klawiatura mechaniczna</div>
    <div class="cell">450 PLN</div>
  </div>
</div>
Enter fullscreen mode Exit fullscreen mode

Dla osoby niewidomej powyższy kod jest po prostu listą słów: "Produkt, Cena, Klawiatura mechaniczna, 450 PLN". Brak kontekstu. Nie wiadomo, co jest nagłówkiem, a co daną.

Poprawny przykład (z użyciem ARIA):

<div role="table" aria-label="Lista produktów i cen">
  <div role="rowgroup">
    <div role="row">
      <span role="columnheader">Produkt</span>
      <span role="columnheader">Cena</span>
    </div>
  </div>
  <div role="rowgroup">
    <div role="row">
      <span role="cell">Klawiatura mechaniczna</span>
      <span role="cell">450 PLN</span>
    </div>
  </div>
</div>
Enter fullscreen mode Exit fullscreen mode

Zauważcie, że tutaj używamy role="table", role="row", role="columnheader" i role="cell". To informuje technologie wspomagające o strukturze danych. Jednak, jeśli możecie, użyjcie po prostu tagu <table>.

Praktyczne wdrożenie: Zaawansowane tabele i dostępność

W rzeczywistych projektach tabele rzadko są tak proste. Często mamy do czynienia z sortowaniem, filtrowaniem i dynamiczną aktualizacją danych. Tutaj zaczynają się schody i tutaj ARIA staje się niezbędna.

1. Zarządzanie sortowaniem (aria-sort)

Kiedy użytkownik klika w nagłówek, aby posortować tabelę, osoba widząca widzi strzałkę w górę lub w dół. Osoba korzystająca z czytnika ekranu nie dowie się o tym, jeśli nie zasygnalizujemy tego w kodzie.

Używamy do tego atrybutu aria-sort. Może on przyjmować wartości: ascending (rosnąco), descending (malejąco) lub none.

<table>
  <thead>
    <tr>
      <th scope="col" aria-sort="ascending">
        <button>Nazwa produktu <span class="sort-icon"></span></button>
      </th>
      <th scope="col" aria-sort="none">
        <button>Cena</button>
      </th>
    </tr>
  </thead>
  <tbody>
    <!-- dane -->
  </tbody>
</table>
Enter fullscreen mode Exit fullscreen mode

Wskazówka dla dewelopera: Pamiętaj, aby aria-sort aktualizować za pomocą JavaScriptu w momencie zmiany sortowania. Nie wystarczy zmienić ikony CSS – musisz zmienić stan atrybutu.

2. Zakresy nagłówków: scope i id

W większych tabelach, szczególnie tych z wielopoziomowymi nagłówkami, samo <th> nie wystarczy. Atrybut scope jest kluczowy dla jasnego określenia, czy nagłówek dotyczy kolumny (col) czy wiersza (row).

<table>
  <thead>
    <tr>
      <th scope="col">Kategoria</th>
      <th scope="col">Produkt</th>
      <th scope="col">Liczba</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">Elektronika</th>
      <td>Laptop</td>
      <td>12</td>
    </tr>
    <tr>
      <th scope="row">Elektronika</th>
      <td>Myszka</td>
      <td>45</td>
    </tr>
  </tbody>
</table>
Enter fullscreen mode Exit fullscreen mode

Dzięki scope="row", gdy użytkownik nawiguje wewnątrz wiersza, czytnik ekranu przypomni mu, że znajduje się w sekcji "Elektronika", co drastycznie poprawia UX.

3. Dynamiczne dane i aria-live

W nowoczesnych aplikacjach (React, Vue, Angular) dane w tabelach często odświeżają się asynchronicznie. Jeśli tabela aktualizuje się bez przeładowania strony, użytkownik z czytnikiem ekranu może nawet nie zauważyć, że dane uległy zmianie.

Do rozwiązywania tego problemu służą regiony aria-live. Pozwalają one na ogłoszenie zmiany treści bez przenoszenia fokusu.

<div class="table-status" aria-live="polite">
  <!-- Tutaj wstawiamy tekst np. "Zaktualizowano wyniki wyszukiwania: znaleziono 15 produktów" -->
</div>
Enter fullscreen mode Exit fullscreen mode

Użycie polite sprawia, że czytnik ekranu poczeka, aż użytkownik skończy obecną czynność, zanim ogłosi zmianę. assertive przerwałby aktualną czynność (używajcie tego tylko przy krytycznych błędach).

Budżet MŚP a dostępność: Jak nie przepalić pieniędzy?

Jako programiści w małych zespołach często słyszymy: "Nie mamy czasu na WCAG, musimy dowozić feature'y". Moja odpowiedź jest zawsze taka sama: Koszt naprawy błędu dostępności na etapie produkcji jest 10-krotnie wyższy niż na etapie projektowania.

Oto strategia "Low Budget Compliance" dla Twojego zespołu:

  1. Standardy ponad custom: Nie budujcie własnych komponentów tabel od zera. Skorzystajcie z bibliotek, które mają wbudowaną dostępność (np. Headless UI, Radix UI, czy dobrze skonfigurowane DataTables).
  2. Automatyzacja na start: Wprowadźcie axe-core lub Lighthouse do swojego procesu CI/CD. Automatyczne testy wyłapią około 30-40% błędów (brakujące etykiety, brak kontrastu) zanim kod trafi do review.
  3. Szybkie testy "na żywo": Poświęćcie 15 minut raz w tygodniu. Wyłączcie monitor i spróbujcie przejść przez swoją tabelę danych za pomocą darmowego czytnika NVDA (Windows) lub VoiceOver (macOS). To otwiera oczy bardziej niż jakakolwiek dokumentacja.
  4. Priorytetyzacja: Jeśli macie ograniczony czas, skupcie się na:
    • Prawidłowej strukturze <table>/<th>/<td>.
    • Kontraście kolorów (WCAG AA).
    • Możliwości pełnej nawigacji za pomocą klawiatury (Tab, Enter, Space).

Implementacja w praktyce: Checklist dla Twojego Sprintu

Jeśli planujesz wdrożyć poprawki dostępności w najbliższym sprincie, użyj tej listy:

  • [ ] Czy każda tabela ma <caption> lub aria-label, który opisuje jej zawartość?
  • [ ] Czy nagłówki są zdefiniowane za pomocą <th> z odpowiednim scope?
  • [ ] Czy interaktywne elementy w tabeli (np. przyciski usuwania wiersza) mają opisowe etykiety? (Zamiast "Usuń", użyj "Usuń wiersz: [Nazwa Produktu]").
  • [ ] Czy sortowanie jest sygnalizowane przez aria-sort?
  • [ ] Czy tabela jest responsywna bez utraty struktury logicznej? (Unikajcie ukrywania kluczowych kolumn za pomocą display: none bez zapewnienia alternatywy).

Podsumowanie: Dostępność to inwestycja, a nie koszt

Wdrożenie zasad EAA i WCAG 2.1 nie wymaga zatrudniania armii konsultantów. Wymaga jedynie zmiany myślenia o strukturze dokumentu. Przejście z "div-tabeli" na semantyczny HTML to często zmiana kilku linii kodu, która jednak całkowicie zmienia doświadczenie użytkownika i zabezpiecza firmę przed ryzykiem prawnym.

Dla właściciela firmy MŚP dostępność to nie tylko unikanie kar, to także otwarcie produktu na nową grupę klientów i poprawa SEO (roboty Google kochają semantyczny kod tak samo jak czytniki ekranu).


Co sądzicie o nadchodzących wymogach EAA? Czy w Waszych projektach dostępność jest już częścią Definition of Done, czy wciąż traktujecie ją jako zadanie "na kiedyś"? Zapraszam do dyskusji w komentarzach!


O autorze:
Piotr Wiśniewski jest full-stack developerem i konsultantem compliance z Warszawy. Specjalizuje się w wdrażaniu standardów RODO i EAA w produktach cyfrowych dla sektora MŚP. Łączy wiedzę techniczną z praktycznym podejściem do regulacji prawnych, pomagając zespołom deweloperskim budować inkluzywne i zgodne z prawem aplikacje.


Zatroszcz się o dostępność swojego serwisu już teraz.
Sprawdź, czy Twoja strona spełnia wymogi WCAG i EAA, korzystając z narzędzia inspect-my-site.com. To szybki sposób, by dowiedzieć się, gdzie Twoje tabele danych i formularze wymagają poprawek przed wejściem w życie nowych regulacji.

javascript #webdev #accessibility #EAA

Top comments (0)