Contenuto espandibile con details e summary
Racchiudi il contenuto in <details> e metti per primo un <summary>. Il summary resta visibile; tutto il resto è nascosto finché chi legge non lo clicca:
Clicca la domanda per aprirla, e di nuovo per chiuderla. Il browser aggiunge il triangolino, rende il summary raggiungibile con il focus, lo apre e chiude con Invio o la barra spaziatrice e dice ai lettori di schermo se è espanso o compresso. Non c'è JavaScript di mezzo.
Se lasci fuori <summary>, il browser mostra al suo posto un'etichetta predefinita ("Dettagli" in italiano).
Aperto di default
L'attributo booleano open mostra il contenuto fin dall'inizio. Il browser aggiunge e toglie open mentre chi legge apre e chiude, quindi è anche l'aggancio per lo stile:
Il riquadro aperto ha un bordo blu grazie a details[open]. Apri "Returns" e diventa blu anche lui; possono essere aperti entrambi nello stesso momento.
Fisarmonica: una sola sezione aperta alla volta
Dai a più elementi <details> lo stesso name e diventano un gruppo esclusivo: aprirne uno chiude gli altri. Prima serviva JavaScript, ora funziona con il solo attributo nelle versioni attuali di Chrome, Edge, Firefox e Safari:
Apri la seconda domanda e la prima si chiude. Togli gli attributi name e tornano ad aprirsi in modo indipendente. Una fisarmonica esclusiva nasconde contenuti che chi legge potrebbe voler confrontare, quindi usala quando le sezioni sono alternative, e dei semplici <details> quando le persone possono volerne aprire diversi.
Dare stile all'indicatore
Il triangolino è un indicatore di lista sul summary. list-style: none lo toglie (la regola ::-webkit-details-marker copre Safari), e uno pseudo-elemento può disegnare il tuo indicatore:
Il segno più ruota di 45 gradi e diventa una croce quando la sezione si apre. Mantieni uno stile di focus visibile come il contorno :focus-visible di questo esempio: una volta tolto l'indicatore predefinito, è sul contorno di focus che fa affidamento chi usa la tastiera.
L'evento toggle e la proprietà open
JavaScript può leggere e impostare details.open, e l'evento toggle scatta dopo ogni cambiamento, che l'abbia causato un clic, un tasto o uno script:
"Expand all" imposta open su entrambi, e il log mostra l'ultimo evento toggle. L'evento non risale ai genitori, quindi ascoltalo su ogni elemento <details> e non su un contenitore.
Cosa mettere in un summary
Un summary contiene testo, elementi inline o un titolo quando il titolo della sezione fa parte della struttura della pagina:
<details>
<summary><h3>Refund policy</h3></summary>
<p>...</p>
</details>
Evita link, pulsanti e campi di form dentro <summary>: il summary è già un controllo, quindi un controllo al suo interno è facile da non notare o da premere per sbaglio, e i lettori di schermo annunciano male i controlli annidati. Metti i contenuti interattivi nel corpo del <details>.
Errori comuni
- Creare un interruttore con un
<div>e JavaScript.<details>gestisce già clic, tasti e stato per i lettori di schermo. Quando ti serve davvero un interruttore personalizzato, usa un pulsante conaria-expanded. - Mettere
<summary>in una posizione diversa dalla prima. Deve essere il primo figlio di<details>. - Nascondere l'indicatore senza sostituirlo. Dai a chi legge un segnale che il summary si apre, come il segno più qui sopra.
- Usare
displayper nascondere il contenuto. Cambia inveceopen; un CSS che forza il contenuto visibile o nascosto va contro lo stato del browser. - Gruppi esclusivi per contenuti da confrontare. Usa
namesolo quando ha senso una sola sezione aperta alla volta.
Domande frequenti
Cosa fanno details e summary in HTML?
<details> crea un widget a comparsa: una sezione che si può aprire e chiudere. Il suo primo figlio, <summary>, è l'etichetta sempre visibile; cliccandolo (o premendo Invio o la barra spaziatrice quando ha il focus) si mostra o si nasconde tutto il resto dentro <details>.
Come faccio a far partire aperto un elemento details?
Aggiungi l'attributo booleano open: <details open>. Il browser aggiunge e toglie quell'attributo quando l'utente apre e chiude, quindi il CSS può dare stile a details[open].
Come creo una fisarmonica in cui è aperta una sola sezione?
Dai a ogni <details> del gruppo lo stesso attributo name, per esempio name="faq". Aprirne uno chiude gli altri di quel gruppo, senza JavaScript.
Come tolgo o cambio la freccia di un details summary?
Imposta list-style: none su summary e aggiungi summary::-webkit-details-marker { display: none; } per Safari. Poi disegna il tuo indicatore, per esempio con summary::after, e cambialo con details[open] summary::after.
Posso sapere quando si apre un elemento details?
Sì. Ascolta l'evento toggle sull'elemento <details> e leggi la sua proprietà open. Impostare details.open = true in JavaScript lo apre.