Menu

details i summary w HTML: zwijane sekcje

Elementy <details> i <summary> tworzą zwijaną sekcję bez JavaScriptu: summary jest zawsze widoczne, a kliknięcie go pokazuje lub ukrywa resztę. Poznaj kod, atrybuty open i name, akordeony, stylowanie strzałki i zdarzenie toggle.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

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 z aria-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łączaj open; 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 name tylko 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.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ