Zwijana treść z details i summary
Otocz treść elementem <details> i umieść na początku <summary>. Summary pozostaje widoczne; cała reszta jest ukryta, dopóki czytelnik go nie kliknie:
Kliknij pytanie, żeby je otworzyć, i jeszcze raz, żeby zamknąć. Przeglądarka dodaje trójkątny znacznik, pozwala ustawić fokus na summary, przełącza je klawiszem Enter lub Spacją i informuje czytniki ekranu, czy sekcja jest rozwinięta, czy zwinięta. Nie ma tu ani linijki JavaScriptu.
Jeśli pominiesz <summary>, przeglądarka pokaże zamiast niego domyślną etykietę ("Szczegóły" po polsku).
Domyślnie otwarte
Atrybut logiczny open pokazuje treść od początku. Przeglądarka dodaje i usuwa open, gdy czytelnik przełącza sekcję, więc służy on też jako zaczep do stylowania:
Otwarte pudełko ma niebieskie obramowanie z details[open]. Otwórz "Returns", a też zrobi się niebieskie; obie sekcje mogą być otwarte jednocześnie.
Akordeon: tylko jedna otwarta sekcja
Nadaj kilku elementom <details> tę samą name, a staną się grupą wyłączną: otwarcie jednego zamyka pozostałe. Kiedyś wymagało to JavaScriptu, a teraz w aktualnych Chrome, Edge, Firefoksie i Safari działa samym atrybutem:
Otwórz drugie pytanie, a pierwsze się zamknie. Usuń atrybuty name, a znowu będą się otwierać niezależnie. Wyłączny akordeon ukrywa treść, którą czytelnik mógłby chcieć porównać, więc używaj go, gdy sekcje są alternatywami, a zwykłego <details>, gdy ktoś może chcieć mieć otwartych kilka.
Stylowanie znacznika
Trójkąt to znacznik listy na summary. list-style: none go usuwa (reguła ::-webkit-details-marker obsługuje Safari), a pseudoelement może narysować własny wskaźnik:
Plus obraca się o 45 stopni w krzyżyk, gdy sekcja się otwiera. Zachowaj widoczny styl fokusu, jak tutaj obramowanie :focus-visible: po usunięciu domyślnego znacznika to na ramce fokusu polegają użytkownicy klawiatury.
Zdarzenie toggle i właściwość open
JavaScript może odczytywać i ustawiać details.open, a zdarzenie toggle odpala się po każdej zmianie, niezależnie od tego, czy wywołało ją kliknięcie, klawisz czy skrypt:
"Expand all" ustawia open na obu, a log pokazuje ostatnie zdarzenie toggle. Zdarzenie nie propaguje się w górę (nie bąbelkuje), więc nasłuchuj na każdym elemencie <details>, a nie na rodzicu.
Co umieścić w summary
Summary zawiera tekst, elementy liniowe albo nagłówek, gdy tytuł sekcji należy do konspektu strony:
<details>
<summary><h3>Refund policy</h3></summary>
<p>...</p>
</details>
Unikaj linków, przycisków i pól formularza wewnątrz <summary>: summary już jest kontrolką, więc kontrolkę w jego środku łatwo przeoczyć albo kliknąć przez pomyłkę, a czytniki ekranu słabo ogłaszają zagnieżdżone kontrolki. Treść interaktywną umieszczaj w ciele <details>.
Częste błędy
- Budowanie przełącznika z
<div>i JavaScriptu.<details>już obsługuje kliknięcia, klawisze i stan dla czytników ekranu. Gdy naprawdę potrzebujesz własnego przełącznika, użyj przycisku zaria-expanded. <summary>w innym miejscu niż na początku. Musi być pierwszym dzieckiem<details>.- Ukrycie znacznika bez zamiennika. Daj czytelnikom jakiś znak, że summary się otwiera, jak plus powyżej.
- Ukrywanie treści przez
display. Zamiast tego przełączajopen; CSS, który wymusza widoczność lub ukrycie treści, walczy ze stanem przeglądarki. - Grupy wyłączne dla treści, którą ludzie porównują. Używaj
nametylko wtedy, gdy jedna otwarta sekcja naraz ma sens.
Najczęściej zadawane pytania
Do czego służą details i summary w HTML?
<details> tworzy element rozwijany: sekcję, którą można otwierać i zamykać. Jego pierwsze dziecko, <summary>, to zawsze widoczna etykieta; kliknięcie jej (albo naciśnięcie Enter lub Spacji, gdy ma fokus) pokazuje lub ukrywa całą resztę wewnątrz <details>.
Jak sprawić, żeby element details był domyślnie otwarty?
Dodaj atrybut logiczny open: <details open>. Przeglądarka dodaje i usuwa ten atrybut, gdy użytkownik przełącza sekcję, więc CSS może stylizować details[open].
Jak zrobić akordeon, w którym otwarta jest tylko jedna sekcja?
Nadaj każdemu <details> w grupie ten sam atrybut name, na przykład name="faq". Otwarcie jednej sekcji zamyka pozostałe w tej grupie, bez JavaScriptu.
Jak usunąć lub zmienić strzałkę w summary elementu details?
Ustaw list-style: none na summary i dodaj summary::-webkit-details-marker { display: none; } dla Safari. Potem narysuj własny wskaźnik, na przykład przez summary::after, i zmieniaj go przez details[open] summary::after.
Czy da się wykryć otwarcie elementu details?
Tak. Nasłuchuj zdarzenia toggle na elemencie <details> i odczytuj jego właściwość open. Ustawienie details.open = true w JavaScripcie go otwiera.