Menu

details e summary in HTML: sezioni espandibili

Gli elementi <details> e <summary> creano una sezione espandibile senza JavaScript: il summary è sempre visibile e cliccandolo si mostra o si nasconde il resto. Impara il markup, gli attributi open e name, le fisarmoniche, lo stile della freccia e l'evento toggle.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

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 con aria-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 display per nascondere il contenuto. Cambia invece open; un CSS che forza il contenuto visibile o nascosto va contro lo stato del browser.
  • Gruppi esclusivi per contenuti da confrontare. Usa name solo 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.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA