Kurs HTML

Lekcja 11.4: Dostępność (Web Accessibility, ARIA)

Strona główna > Rozdział 11: Zaawansowane funkcje HTML > Dostępność (Web Accessibility, ARIA)

Tworzenie stron dla wszystkich

Dostępność stron internetowych (Web Accessibility, często skracane do a11y - "a" + 11 liter + "y") oznacza projektowanie i tworzenie stron w taki sposób, aby mogły być używane przez jak najszersze grono odbiorców, w tym osoby z różnego rodzaju niepełnosprawnościami (wzroku, słuchu, ruchu, poznawczymi) oraz osoby starsze czy korzystające z urządzeń mobilnych w trudnych warunkach.

Dostępna strona to taka, która jest:

Te cztery zasady stanowią podstawę międzynarodowych wytycznych dotyczących dostępności treści internetowych - WCAG (Web Content Accessibility Guidelines).

Rola semantycznego HTML

Jak już wielokrotnie podkreślaliśmy w tym kursie, używanie semantycznych znaczników HTML (np. <nav>, <main>, <article>, <button>, <label>) jest fundamentem dostępności. Przeglądarki i technologie wspomagające (jak czytniki ekranu używane przez osoby niewidome) rozumieją znaczenie tych elementów i mogą przekazać je użytkownikowi w odpowiedni sposób (np. poinformować, że dany element to nawigacja, przycisk czy pole formularza).

Używanie <div> i <span> do wszystkiego i stylizowanie ich tak, by wyglądały jak przyciski czy linki, jest złą praktyką z punktu widzenia dostępności, ponieważ te elementy nie niosą ze sobą żadnego znaczenia semantycznego.

WAI-ARIA: Gdy HTML nie wystarcza

Czasami tworzymy bardziej złożone komponenty interfejsu użytkownika (np. niestandardowe menu rozwijane, suwaki, zakładki, okna modalne), dla których standardowe elementy HTML nie mają wystarczającej semantyki lub których zachowanie jest dynamicznie zmieniane przez JavaScript. W takich sytuacjach z pomocą przychodzi WAI-ARIA (Accessible Rich Internet Applications).

ARIA to zestaw specjalnych atrybutów, które można dodać do elementów HTML, aby uzupełnić lub zmodyfikować ich semantykę i przekazać dodatkowe informacje technologiom wspomagającym. ARIA nie zmienia wyglądu ani zachowania elementu dla użytkowników widzących, ale dostarcza kluczowych informacji dla czytników ekranu i innych narzędzi.

Kluczowe koncepcje ARIA:

Pierwsza zasada ARIA: Używaj natywnego HTML!

Najważniejszą zasadą przy stosowaniu ARIA jest: jeśli istnieje natywny element HTML lub atrybut, który ma potrzebną semantykę i zachowanie, użyj go zamiast dodawać ARIA.

Na przykład:

ARIA powinna być używana tylko wtedy, gdy natywne możliwości HTML są niewystarczające.

Przykłady popularnych atrybutów ARIA

Zadanie praktyczne (z rozwiązaniem)

Zadanie: Masz element <div>, który za pomocą JavaScript działa jak przycisk przełączający widoczność innego elementu (np. panelu z dodatkowymi informacjami). Dodaj odpowiednie atrybuty ARIA, aby poprawić jego dostępność.

Rozwiązanie:

<!DOCTYPE html>
<html lang="pl">
<head>
  <meta charset="UTF-8">
  <title>Przycisk ARIA</title>
  <style>
    #przycisk-toggle {
      padding: 10px 15px;
      border: 1px solid #007bff;
      background-color: #007bff;
      color: white;
      cursor: pointer;
      display: inline-block;
      border-radius: 4px;
    }
    #panel-info {
      border: 1px solid #ccc;
      padding: 15px;
      margin-top: 10px;
      /* display: none; */ /* Początkowo ukryty - obsługa w JS */
    }
  </style>
</head>
<body>

<h1>Przełącznik panelu z ARIA</h1>

<!-- Używamy DIV jako przycisku (zła praktyka, ale na potrzeby zadania) -->
<div id="przycisk-toggle" 
     role="button" 
     tabindex="0" 
     aria-expanded="false" 
     aria-controls="panel-info">
  Pokaż informacje
</div>

<div id="panel-info" style="display: none;">
  <p>Tutaj znajdują się dodatkowe, ważne informacje.</p>
</div>

<script>
  const przycisk = document.getElementById('przycisk-toggle');
  const panel = document.getElementById('panel-info');

  przycisk.addEventListener('click', togglePanel);
  // Dodajemy obsługę klawiatury (Enter lub Spacja)
  przycisk.addEventListener('keydown', function(event) {
    if (event.key === 'Enter' || event.key === ' ') {
      event.preventDefault(); // Zapobiegaj domyślnej akcji (np. scroll)
      togglePanel();
    }
  });

  function togglePanel() {
    const isExpanded = przycisk.getAttribute('aria-expanded') === 'true';
    
    // Zmień stan ARIA
    przycisk.setAttribute('aria-expanded', !isExpanded);
    
    // Zmień tekst przycisku
    przycisk.textContent = isExpanded ? 'Pokaż informacje' : 'Ukryj informacje';
    
    // Pokaż/ukryj panel
    panel.style.display = isExpanded ? 'none' : 'block';
  }
</script>

</body>
</html>

W tym przykładzie:

Pamiętaj: Lepszym rozwiązaniem byłoby użycie natywnego elementu <button>, który ma wbudowaną obsługę klawiatury i odpowiednią semantykę. Wtedy potrzebowalibyśmy tylko atrybutów aria-expanded i aria-controls.

Dodatkowe zadania do samodzielnego wykonania:

  1. Przebuduj powyższy przykład, używając elementu <button> zamiast <div>. Zobacz, jak upraszcza się kod (nie potrzeba role i tabindex, a obsługa klawiatury jest wbudowana).
  2. Dodaj do formularza pole tekstowe i przycisk z ikoną (np. lupą) służący do wyszukiwania. Użyj aria-label, aby nadać przyciskowi dostępną nazwę "Szukaj".
  3. Utwórz prosty system zakładek (tabs) używając ARIA roles (tablist, tab, tabpanel) i stanów (aria-selected).

Najczęściej zadawane pytania

Co to jest dostępność stron internetowych (a11y)?

To praktyka projektowania i tworzenia stron tak, aby mogły być używane przez wszystkich, w tym osoby z niepełnosprawnościami, zgodnie z zasadami postrzegalności, funkcjonalności, zrozumiałości i solidności (WCAG).

Co to jest ARIA?

ARIA (Accessible Rich Internet Applications) to zestaw atrybutów HTML (role, stany, właściwości), które dodają lub modyfikują semantykę elementów, czyniąc je bardziej dostępnymi dla technologii wspomagających, gdy natywny HTML nie wystarcza.

Kiedy powinienem używać ARIA?

Używaj ARIA tylko wtedy, gdy nie ma odpowiedniego natywnego elementu HTML lub atrybutu, który zapewniałby wymaganą semantykę i funkcjonalność. Zawsze preferuj natywne rozwiązania HTML.

Do czego służy `role` w ARIA?

Atrybut `role` definiuje typ lub przeznaczenie elementu dla technologii wspomagających, np. `role="button"`, `role="dialog"`, `role="navigation"`. Używany, gdy sam znacznik HTML nie niesie wystarczającej informacji.

Jak opisać przycisk z samą ikoną dla czytnika ekranu?

Użyj atrybutu `aria-label="Tekst opisujący funkcję przycisku"`, np. `<button aria-label="Zamknij">×</button>`. Tekst z `aria-label` zostanie odczytany zamiast zawartości przycisku.