Kurs HTML

Lekcja 7.4: Dostępność tabel (scope, headers)

Strona główna > Rozdział 7: Tabele > Dostępność tabel (scope, headers)

Dlaczego dostępność tabel jest ważna?

Tabele, zwłaszcza te bardziej złożone, mogą być trudne do zrozumienia dla osób korzystających z technologii wspomagających, takich jak czytniki ekranu. Bez odpowiednich wskazówek semantycznych, czytnik może odczytywać komórki wiersz po wierszu, bez jasnego powiązania danych z ich nagłówkami, co czyni tabelę bezużyteczną.

HTML dostarcza mechanizmów, które pozwalają jawnie określić relacje między komórkami nagłówkowymi (<th>) a komórkami danych (<td>), znacząco poprawiając dostępność tabel. Są to głównie atrybuty scope i headers.

Atrybut `scope`

Atrybut scope dodaje się do znacznika <th>, aby wskazać, jakiego zakresu komórek dotyczy dany nagłówek. Jest to prostszy i często wystarczający sposób na poprawę dostępności w standardowych tabelach.

Możliwe wartości atrybutu scope:

Przykład użycia `scope`:

<table class="basic-table">
  <thead>
    <tr>
      <th></th> <!-- Pusta komórka w rogu -->
      <th scope="col">Poniedziałek</th>
      <th scope="col">Wtorek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">8:00</th>
      <td>Matematyka</td>
      <td>J. Polski</td>
    </tr>
    <tr>
      <th scope="row">9:00</th>
      <td>Fizyka</td>
      <td>Historia</td>
    </tr>
  </tbody>
</table>
Poniedziałek Wtorek
8:00 Matematyka J. Polski
9:00 Fizyka Historia

W tym przykładzie:

Dzięki temu czytnik ekranu, napotykając np. komórkę "Matematyka", może poinformować użytkownika, że dotyczy ona godziny "8:00" w "Poniedziałek".

Atrybuty `id` i `headers`

W bardziej złożonych tabelach, zwłaszcza tych z połączonymi komórkami (colspan/rowspan) lub wielopoziomowymi nagłówkami, sam atrybut scope może nie wystarczyć do jednoznacznego określenia relacji. W takich przypadkach używa się kombinacji atrybutów id (w komórkach nagłówkowych <th>) i headers (w komórkach danych <td>).

  1. Nadanie id nagłówkom: Każdej komórce nagłówkowej <th>, która ma być powiązana z danymi, nadajemy unikalny atrybut id.
  2. Użycie headers w komórkach danych: W każdej komórce danych <td> (a czasem też w <th> niższego poziomu) dodajemy atrybut headers. Jego wartością jest lista identyfikatorów (id) odpowiednich komórek nagłówkowych, oddzielonych spacjami. Lista ta wskazuje, które nagłówki opisują daną komórkę.

Przykład użycia `id` i `headers`:

Rozważmy tabelę z dwupoziomowymi nagłówkami kolumn.

<table class="basic-table">
  <thead>
    <tr>
      <th rowspan="2" id="dzien">Dzień</th>
      <th colspan="2" id="dane">Dane pogodowe</th>
    </tr>
    <tr>
      <th id="temp" headers="dane">Temperatura (°C)</th>
      <th id="opady" headers="dane">Opady (mm)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td headers="dzien">Poniedziałek</td>
      <td headers="dane temp dzien">15</td>
      <td headers="dane opady dzien">2</td>
    </tr>
    <tr>
      <td headers="dzien">Wtorek</td>
      <td headers="dane temp dzien">17</td>
      <td headers="dane opady dzien">0</td>
    </tr>
  </tbody>
</table>
Dzień Dane pogodowe
Temperatura (°C) Opady (mm)
Poniedziałek 15 2
Wtorek 17 0

W tym przykładzie:

Dzięki temu czytnik ekranu, napotykając komórkę "15", może precyzyjnie poinformować: "Dzień: Poniedziałek, Dane pogodowe: Temperatura (°C): 15".

Kiedy używać `scope`, a kiedy `headers`?

Zawsze staraj się tworzyć możliwie najprostszą strukturę tabeli, która poprawnie prezentuje dane. Jeśli tabela staje się bardzo skomplikowana, rozważ jej podział na kilka prostszych tabel.

Zadanie praktyczne (z rozwiązaniem)

Zadanie: Weź tabelę z planem lekcji z poprzedniego zadania (z rowspan) i dodaj do niej atrybuty scope do wszystkich komórek <th>, aby poprawić jej dostępność.

Rozwiązanie:

<!DOCTYPE html>
<html lang="pl">
<head>
    <meta charset="UTF-8">
    <title>Plan Lekcji - Dostępność</title>
    <style>
        table, th, td {
            border: 1px solid #ccc;
            border-collapse: collapse;
            padding: 8px;
            text-align: center;
        }
        thead { background-color: #f2f2f2; }
    </style>
</head>
<body>
    <h1>Plan Lekcji</h1>
    <table>
        <thead>
            <tr>
                <th scope="col">Godzina</th>
                <th scope="col">Poniedziałek</th>
                <th scope="col">Wtorek</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <th scope="row">8:00 - 8:45</th>
                <td rowspan="2">Matematyka</td>
                <td>Język Polski</td>
            </tr>
            <tr>
                <th scope="row">9:00 - 9:45</th>
                <td>Historia</td>
            </tr>
             <tr>
                <td colspan="3">Przerwa</td>
            </tr>
        </tbody>
    </table>
</body>
</html>

(Uwaga: W tym przypadku dodanie scope do nagłówków kolumn i wierszy znacząco poprawia dostępność. Dla komórki "Matematyka" z rowspan, czytnik ekranu powinien być w stanie powiązać ją z nagłówkiem kolumny "Poniedziałek" oraz z nagłówkami wierszy "8:00" i "9:00". W bardzo skomplikowanych przypadkach z rowspan można by rozważyć użycie headers.)

Dodatkowe zadania do samodzielnego wykonania:

  1. Stwórz tabelę z wielopoziomowymi nagłówkami (np. rok podzielony na kwartały) i użyj atrybutów id i headers, aby poprawnie powiązać dane z nagłówkami.
  2. Przetestuj stworzone tabele za pomocą narzędzi do sprawdzania dostępności (np. WAVE, Lighthouse w narzędziach deweloperskich Chrome) lub, jeśli masz możliwość, za pomocą czytnika ekranu (NVDA, VoiceOver).
  3. Znajdź w internecie przykład złożonej tabeli i spróbuj dodać do niej atrybuty scope lub headers/id, aby poprawić jej dostępność.

Najczęściej zadawane pytania

Jak poprawić dostępność tabel HTML?

Używaj poprawnie nagłówków <th>. W prostych tabelach dodaj atrybut scope="col" lub scope="row" do <th>. W złożonych tabelach użyj kombinacji unikalnych id w <th> i atrybutu headers w <td>, aby jawnie powiązać dane z nagłówkami.

Do czego służy atrybut scope?

Atrybut scope, używany w <th>, wskazuje, czy nagłówek dotyczy kolumny (scope="col"), wiersza (scope="row"), grupy kolumn (scope="colgroup") czy grupy wierszy (scope="rowgroup"). Pomaga to technologiom wspomagającym zrozumieć strukturę tabeli.

Jak działają atrybuty id i headers?

Nadajesz unikalne id komórkom nagłówkowym (<th>). Następnie w komórkach danych (<td>) używasz atrybutu headers, podając listę id odpowiednich nagłówków oddzielonych spacjami. To jawnie wskazuje, które nagłówki opisują daną komórkę.

Kiedy używać scope, a kiedy headers?

Używaj scope dla prostych tabel, gdzie relacje nagłówek-dane są jednoznaczne. Używaj headers + id dla złożonych tabel, zwłaszcza tych z połączonymi komórkami (colspan/rowspan) lub wielopoziomowymi nagłówkami, gdzie scope może być niewystarczający.

Czy złożone tabele są zawsze problemem dla dostępności?

Złożone tabele stanowią większe wyzwanie, ale przy poprawnym użyciu semantycznych znaczników (<thead>, <tbody>, <tfoot>, <th>) oraz atrybutów scope lub headers/id, można je uczynić dostępnymi. Warto jednak rozważyć uproszczenie struktury, jeśli to możliwe.