Ćwiczenia

Laboratorium: responsywność i dostępność interfejsu

W tym serwisie wystarczy przycisk „Uruchom laboratorium” powyżej. Instrukcja uruchomienia przez terminal poniżej dotyczy osobnej pracy na źródłowych plikach ćwiczenia.

Porównaj dwie wersje panelu kontaktu. A ma cztery celowe defekty, B poprawia te konkretne elementy. Ćwiczenie uczy rozdzielenia wyglądu, obsługi klawiaturą, semantyki i odbioru przez czytnik. B nie jest deklaracją pełnej zgodności z WCAG.

Uruchomienie i bezpieczne dane

W katalogu projektu uruchom:

node tools/serwer-lekcji.cjs

Otwórz http://127.0.0.1:8787/content/cwiczenia/interfejs-demo/lab.html. Plik laboratorium jest samowystarczalnym HTML bez zewnętrznych usług. Lokalny serwer zapewnia wspólny adres ćwiczeń; formularz nie wywołuje API wysyłki, nie zapisuje danych i nie wysyła poczty. Użyj qa@example.com i tekstu „Wiadomość testowa”.

Zapisz system, wersję przeglądarki, wariant, viewport w pikselach CSS i zoom. „Resetuj ćwiczenie” przywraca A, puste pola, zamknięte menu i pusty wynik. Zmiana wariantu również przebudowuje panel, więc przed porównawczą próbą wpisz dane ponownie. To jawny mechanizm demo.

Wymagania

  1. Przy viewport 360 px główna treść ma być dostępna bez przewijania całej strony w poziomie.
  2. Menu ma być osiągalne i obsługiwalne klawiaturą; programowo dostępny stan odpowiada rozwinięciu.
  3. E-mail ma mieć trwałą, powiązaną programowo etykietę, która pozostaje po wpisaniu danych.
  4. Po wysłaniu poprawnych danych komunikat lokalnej symulacji ma być przygotowany do ogłoszenia bez przenoszenia fokusu.

Pola e-mail i wiadomości są wymagane. Natywna walidacja przeglądarki blokuje puste lub niepoprawne dane; szczegóły jej komunikatów mogą zależeć od środowiska. Prawidłowe wysłanie pokazuje: „Wiadomość wysłana — symulacja. Dane nie opuściły przeglądarki.”.

Zadania bez podglądania rozwiązania

1. Układ

Po resecie ustaw 360×800 w Responsive w DevTools. Obejrzyj stronę i spróbuj wykonać całe zadanie formularza. W Console odczytaj document.documentElement.scrollWidth i document.documentElement.clientWidth. Zapisz element powodujący problem oraz skutek. Następnie wybierz B przy tych samych wymiarach i porównaj. Sprawdź także 1280×900 oraz zaplanuj sąsiedztwo progu zmiany układu.

2. Klawiatura i menu

Zacznij w szerokim widoku. Bez myszy przejdź Tabem i Shift+Tabem przez kontrolki. Spróbuj otworzyć oraz zamknąć menu. Zapisz rzeczywistą kolejność i osiągalność. W B użyj Enter oraz Spacji na przycisku menu. Sprawdź jego stan przed otwarciem, po otwarciu i po zamknięciu.

3. Etykieta i wynik

Sprawdź HTML oraz informacje dostępności pola e-mail w A/B. Odróżnij widoczny placeholder od etykiety. Wyślij syntetyczne dane i zbadaj semantykę elementu z komunikatem. Podaj osobno, co wykazała inspekcja, a co rzeczywisty odbiór czytnikiem. Jeśli nie używałeś czytnika, oznacz ten test jako niewykonany.

4. Dalsze sprawdzenia

Wykonaj pełne zadanie przy 200% zoom strony; nie myl tego ze skalą podglądu Device Mode. Sprawdź małą wysokość, orientację poziomą oraz długą wiadomość. Test telefonu i ręczny czytnik są osobnymi pracami; wynik emulacji ich nie zastępuje. Niewykonane próby pozostają niewykonane.

Wykorzystaj checklistę responsywności i PDF oraz checklistę dostępności i PDF. Zapisz wynik i dowód, nie sam znacznik przy oczekiwaniu.

Rozwiązanie i uzasadnienie

ObszarWariant A — celowy defektWariant B — poprawa
Układ.surface.bad ma min-width: 760px, więc wychodzi poza 360 px.Brak tego minimum; przy szerokości do 700 px panel pomocy przechodzi pod formularz.
Menu#menu to klikany div, bez klawiatury i stanu rozwinięcia.Natywny button, aria-controls, aktualizowane aria-expanded; działa Enter i Spacja.
E-mailPlaceholder bez trwałego label powiązanego z polem.label for="email" wskazuje input id="email".
KomunikatDynamiczny tekst w zwykłym akapicie.Istniejący wcześniej region role="status" i aria-live="polite".

W automatycznym pomiarze przy 360×800 uzyskano A: clientWidth=360, scrollWidth=778; B: obie wartości 360. Liczba 778 wynika z całego układu, nie zastępuje wymagania minimalnej szerokości 760 px. Test projektu potwierdził menu B Enterem i Spacją, aktualizację stanu, etykietę, rolę komunikatu, pokazanie lokalnej symulacji oraz reset.

Pole wiadomości ma etykietę w obu wariantach. Nie zgłaszaj więc ogólnie „wszystkie pola bez etykiet”. Nie twierdź „czytnik nie odczytał” wyłącznie na podstawie braku regionu live w DOM. Zapisz rodzaj dowodu i wykonaj rzeczywistą próbę, jeśli taki wniosek ma znaleźć się w raporcie.

Przykładowy raport dla układu: „Wariant A wymaga poziomego przewijania przy 360×800 i 100% zoom; oczekiwanie to dostęp do głównej treści w szerokości viewportu”. Dla menu: „Po resecie A kontrolka otwarcia menu jest pomijana w nawigacji Tabem i nie ma równoważnej obsługi klawiaturą”. Załącz własną próbę i warunki, a nie jedynie rozwiązanie lekcji.

Weryfikacja i ograniczenia

2 października 2026 r. wykonano automatyczną weryfikację w Node v24.16.0 i Chromium 151.0.7922.34. Wyniki testu projektu zapisano w tmp/qa-interfejs/wyniki.json. Osobny odczyt potwierdził wymiary, tag menu, liczbę powiązanych etykiet i rolę komunikatu dla A/B. Nie wykonano ręcznego czytnika ekranu, testu fizycznego telefonu ani ręcznego zoom 200%. Nie przeprowadzono pełnego audytu WCAG, bezpieczeństwa lub doręczenia wiadomości.

Lekcje: responsywność oraz podstawy dostępności. Autor serwisu: Marcin Kozłowski.

Lokalną demonstrację, instrukcję i materiały dydaktyczne przygotowano z pomocą AI.