Kod i Frontend

Button czy div? Semantyczny HTML w praktyce

Klikalny div może wyglądać jak przycisk, ale nie zachowuje się jak przycisk. Dlaczego natywny HTML zwykle wygrywa z ARIA i dodatkowym JavaScriptem?

Przemek z AAA · · 3 min czytania

Porównanie poprawnego przycisku interfejsu z nieprawidłowo zbudowanym elementem klikalnym.

W kodzie można zrobić „przycisk” praktycznie ze wszystkiego. <div>, <span>, link bez adresu — wystarczy dodać JavaScript i kliknięcie zaczyna działać.

Problem w tym, że kliknięcie myszą to tylko jedna z metod obsługi interfejsu. Natywny element <button> ma już wbudowaną semantykę i zachowanie, które w przypadku zwykłego <div> trzeba odtworzyć samemu.

Co dostajesz za darmo z <button>?

Przeglądarka wie, że <button> jest elementem interaktywnym. Można do niego dojść klawiszem Tab, aktywować go klawiaturą, a technologia asystująca rozpoznaje jego rolę.

<button type="button">Otwórz filtry</button>

Jeżeli tę samą rzecz zrobisz jako div:

<div onclick="openFilters()">Otwórz filtry</div>

mysz zadziała, ale element nie staje się przez to automatycznie przyciskiem dla klawiatury ani czytnika ekranu.

ARIA nie dodaje zachowania

Można dopisać role="button". To jednak nadal tylko informacja o roli. W3C określa to bardzo trafnie: rola ARIA jest obietnicą, że komponent zachowuje się tak, jak oczekuje tego użytkownik.

Jeżeli budujesz przycisk z diva, musisz zadbać między innymi o możliwość otrzymania fokusu oraz obsługę klawiszy Enter i Space. Dochodzi więcej kodu, więcej miejsc na błąd i więcej testowania.

<div role="button" tabindex="0">Otwórz filtry</div>

To nadal nie jest kompletna implementacja. Sam tabindex i rola nie dodają automatycznie całego zachowania natywnego przycisku.

Pierwsza zasada ARIA: jeśli możesz użyć HTML, użyj HTML

Dokumentacja W3C dotycząca ARIA mówi wprost: jeżeli natywny element HTML ma potrzebną semantykę i zachowanie, należy użyć właśnie jego zamiast przebudowywać zwykły element za pomocą ról i właściwości ARIA.

Dotyczy to nie tylko przycisków. Link powinien być linkiem, pole formularza prawdziwym polem formularza, lista listą, a nagłówek nagłówkiem. Natywny HTML jest zwykle najprostszym punktem wyjścia do dostępnego interfejsu.

Kiedy użyć linku, a kiedy buttona?

Prosta zasada pomaga uniknąć wielu pomyłek:

  • link przenosi użytkownika do innego adresu lub miejsca,
  • button wykonuje akcję w interfejsie.

„Przejdź do kontaktu” może być linkiem. „Otwórz formularz”, „Pokaż filtry”, „Dodaj do koszyka” albo „Zapisz” to zazwyczaj przyciski.

Styl wizualny nie powinien decydować o semantyce. Link może wyglądać jak duży przycisk CTA, a button jak niewielka ikona. Liczy się funkcja elementu.

Semantyka upraszcza także audyt

W serwisach budowanych z własnych komponentów często spotykamy ten sam problem w wielu miejscach: klikane divy, niestandardowe selecty, własne checkboxy albo linki udające przyciski. Każdy taki komponent wymaga osobnego sprawdzenia obsługi klawiatury, nazwy dostępnej, stanów i komunikacji z technologiami asystującymi.

Dobry komponent oparty na natywnym HTML ogranicza liczbę rzeczy, które można zepsuć. Nie usuwa potrzeby testów, ale zdecydowanie zmniejsza ryzyko.

Jeśli w istniejącym serwisie masz dużo własnych komponentów i nie wiesz, które z nich wymagają przebudowy, możesz napisać na redakcja@dostepnoscwcag.pl. Możemy przejrzeć komponenty, wskazać problemy i wycenić poprawki bez przebudowywania strony w ciemno.

Źródła

O autorze: Przemek z AAA

Tworzę strony internetowe i zajmuję się ich dostępnością. Na Trzy razy A wyjaśniam WCAG i opisuję rozwiązania, które można wykorzystać we własnym projekcie.

Komentarze

Nie ma jeszcze komentarzy. Możesz być pierwszą osobą, która się wypowie.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola oznaczone jako „wymagane” trzeba wypełnić.

Adres zaczynający się od https://

Ustawienia cookies

Wybierz, na które cookies się zgadzasz. Niezbędne działają zawsze.

Niezbędne zawsze włączone

Bez nich serwis nie działa poprawnie: zapamiętują Twój wybór dotyczący cookies i obsługują logowanie do panelu WordPressa. Nie wymagają zgody, więc nie da się ich wyłączyć.

Lista cookies w tej grupie (6)
  • wcag_zgoda

    Zapamiętuje, czy zgadzasz się na cookies analityczne, żeby nie pytać przy każdej wizycie.

    Dostawca: Trzy razy A. Czas przechowywania: 180 dni.

  • wordpress_test_cookie

    Sprawdza, czy przeglądarka przyjmuje cookies. Powstaje na stronie logowania.

    Dostawca: Trzy razy A (WordPress). Czas przechowywania: do zamknięcia przeglądarki.

  • wordpress_[…], wordpress_sec_[…]

    Uwierzytelniają osobę zalogowaną do panelu administracyjnego. Dotyczą tylko osób, które się logują.

    Dostawca: Trzy razy A (WordPress). Czas przechowywania: do zamknięcia przeglądarki, a z opcją „Zapamiętaj mnie” 14 dni.

  • wordpress_logged_in_[…]

    Informuje serwis, że jesteś zalogowany i jako kto. Dotyczy tylko osób, które się logują.

    Dostawca: Trzy razy A (WordPress). Czas przechowywania: do zamknięcia przeglądarki, a z opcją „Zapamiętaj mnie” 14 dni.

  • wp-settings-[…], wp-settings-time-[…]

    Zapamiętują ustawienia widoku panelu administracyjnego. Dotyczą tylko osób, które się logują.

    Dostawca: Trzy razy A (WordPress). Czas przechowywania: 1 rok.

  • comment_author_[…], comment_author_email_[…], comment_author_url_[…]

    Zapamiętują imię, e-mail i adres strony z formularza komentarza. Powstają tylko wtedy, gdy zaznaczysz „Zapamiętaj moje dane w tej przeglądarce”.

    Dostawca: Trzy razy A (WordPress). Czas przechowywania: 1 rok.

Pomagają nam sprawdzić, które treści są czytane i skąd przychodzą odwiedzający. Włączamy je tylko za Twoją zgodą. Dostawcą usługi jest Google Ireland Limited; dane mogą trafiać do Google LLC w USA na podstawie decyzji Komisji Europejskiej w sprawie EU-US Data Privacy Framework.

Lista cookies w tej grupie (2)
  • _ga

    Rozróżnia odwiedzających, żeby policzyć wizyty.

    Dostawca: Google Ireland Limited. Czas przechowywania: 2 lata.

  • _ga_EX5JS27JRK

    Zapamiętuje stan bieżącej sesji w Google Analytics 4.

    Dostawca: Google Ireland Limited. Czas przechowywania: 2 lata.

Pamięć przeglądarki tylko Twoje ustawienia

Rozmiar tekstu i kolory, które sam wybierasz, zapisujemy w pamięci przeglądarki (localStorage). Te dane nie trafiają na serwer.

Lista zapisywanych ustawień (2)
  • nr-font

    Rozmiar tekstu wybrany przyciskami A−, A, A+.

  • nr-theme

    Motyw kolorów (jasny, ciemny, kontrast) wybrany na pasku u góry strony.

Więcej informacji: Polityka prywatności.