W3docs

Tag HTML <details>

Il tag <details> mostra informazioni aggiuntive che l'utente può aprire e visualizzare. Attributi ed esempi.

Il tag <details> è uno degli elementi HTML5. Crea un widget di rivelazione: un controllo interattivo che l'utente può aprire per mostrare contenuto aggiuntivo e chiudere di nuovo per nasconderlo. Per impostazione predefinita il contenuto rimane nascosto e il browser disegna un piccolo triangolo (il marcatore di rivelazione) che ruota per indicare lo stato aperto o chiuso.

Il primo figlio di <details> dovrebbe essere un elemento <summary>, che definisce l'etichetta visibile su cui l'utente fa clic per attivare il widget. Il <summary> è il controllo vero e proprio — il resto del contenuto all'interno di <details> è ciò che viene mostrato o nascosto. Se ometti <summary>, il browser fornisce un'etichetta predefinita come "Details".

Perché usare <details>

Il grande vantaggio di <details> è che offre un widget mostra/nascondi completamente funzionante senza alcun JavaScript. Il browser gestisce il comportamento di apertura/chiusura, il supporto da tastiera e l'accessibilità al posto tuo.

Casi d'uso comuni:

  • Elenchi FAQ — ogni domanda è un <summary> e la risposta viene rivelata al clic.
  • Rivelazione progressiva — nascondi impostazioni avanzate, testi legali lunghi o sezioni "continua a leggere" così la pagina rimane scorrevole.
  • Accordion di fallback senza JS — poiché funziona senza scripting, <details> è una base solida per gli accordion. Anche se il JavaScript non si carica, il contenuto è comunque raggiungibile.

Rispetto a un accordion JavaScript costruito manualmente, <details> richiede meno codice, è accessibile da tastiera e con screen reader in modo automatico, e si degrada agevolmente. Ricorri a un widget JS personalizzato solo quando hai bisogno di comportamenti che l'elemento nativo non può offrirti (ad esempio transizioni animate dell'altezza sull'intero contenuto).

Sintassi

Il tag <details> va in coppia. Il contenuto è scritto tra i tag di apertura (<details>) e di chiusura (</details>).

Esempio del tag HTML <details>:

Tag HTML <details>

<!DOCTYPE html>
<html>
  <head>
    <title>Title of the document</title>
  </head>
  <body>
    <details>
      <summary>Click to see details</summary>
      <p>Detailed information is here.</p>
    </details>
  </body>
</html>

Risultato

details example

L'attributo open

Aggiungi l'attributo boolean open per far sì che il widget sia espanso al caricamento della pagina:

<details open>
  <summary>What is HTML?</summary>
  <p>HTML is the standard markup language for documents designed to be displayed in a web browser.</p>
</details>

L'attributo open riflette lo stato corrente in tempo reale. Quando l'utente attiva il widget, il browser aggiunge o rimuove open sull'elemento in modo automatico — non devi gestirlo tu. Puoi anche attivarlo direttamente da script:

const details = document.querySelector('details');
details.open = true;   // expand
details.open = false;  // collapse

Leggere details.open ti indica se il widget è attualmente aperto.

Esempio del tag HTML <details> inserito all'interno di un tag <form>:

Tag HTML <details>

<!DOCTYPE html>
<html>
  <head>
    <title>Title of the document</title>
  </head>
  <body>
    <form action="action_form.php" method="get">
      <details>
        <summary>Departure airport:</summary>
        <input type="text" list="airports" name="airports" />
        <datalist id="airports">
          <option value="Birmingham">
          <option value="Cambridge">
          <option value="Oxford">
          <option value="Bangor">
        </datalist>
        <input type="submit" value="confirm" />
      </details>
    </form>
  </body>
</html>

Attributi

AttributoValoreDescrizione
openopenIndica che le informazioni nel tag devono essere mostrate inizialmente in forma espansa.

Il tag <details> supporta anche gli Attributi Globali e gli Attributi Evento.

Come stilizzare un tag HTML <details>

details {
  border: 1px solid #ccc;
  border-radius: 4px;
  padding: 0.5em;
}
summary {
  font-weight: bold;
  cursor: pointer;
}

Stilizzare il marcatore di rivelazione

La maggior parte dei browser renderizza il triangolo di apertura/chiusura tramite lo pseudo-elemento ::marker sul <summary>. Per modificarlo o rimuoverlo, imposta list-style sul summary:

/* Remove the default triangle */
summary {
  list-style: none;
}

/* Replace it with your own characters */
summary::marker {
  content: "▶ ";
}
details[open] summary::marker {
  content: "▼ ";
}

I browser più vecchi basati su WebKit (versioni precedenti di Safari/Chrome) utilizzavano invece uno pseudo-elemento non standard summary::-webkit-details-marker. Per coprire quelli, nascondilo anch'esso:

summary::-webkit-details-marker {
  display: none;
}

L'evento toggle

L'elemento <details> genera un evento toggle ogni volta che si apre o si chiude. Questo è il punto di aggancio giusto per il caricamento lazy del contenuto, l'invio di analisi o la sincronizzazione dello stato dell'interfaccia:

const details = document.querySelector('details');

details.addEventListener('toggle', () => {
  if (details.open) {
    console.log('Opened');
  } else {
    console.log('Closed');
  }
});

L'evento si attiva dopo che lo stato è già cambiato, quindi details.open riflette il nuovo valore all'interno del gestore.

Accessibilità

L'accoppiamento nativo <details>/<summary> include l'accessibilità incorporata. I browser espongono il <summary> con un ruolo simile a quello di un pulsante e il <details> come group, comunicano lo stato espanso/compresso agli screen reader e rendono il summary focalizzabile e utilizzabile con Enter e Space. Questo è un motivo chiave per preferire l'elemento nativo rispetto a un accordion basato su script — si ottengono semantica corretta e supporto da tastiera gratuitamente, senza dover gestire aria-expanded manualmente.

Raggruppamento con l'attributo name

I browser moderni (Chrome 120+ e altri motori recenti) supportano un attributo name su <details>. Quando più elementi <details> condividono lo stesso name, si comportano come un gruppo esclusivo, come un accordion: aprirne uno chiude automaticamente gli altri.

<details name="faq" open>
  <summary>Question one</summary>
  <p>Answer one.</p>
</details>
<details name="faq">
  <summary>Question two</summary>
  <p>Answer two.</p>
</details>

Poiché questa è una funzionalità più recente, i browser che non supportano name lo ignorano semplicemente e lasciano che ogni widget si apra in modo indipendente — un miglioramento progressivo sicuro.

Tag correlati

  • <summary> — l'etichetta visibile e il controllo per un widget <details>.
  • <dialog> — una finestra di dialogo nativa modale o non modale, utile quando si ha bisogno di un overlay anziché di una rivelazione in linea.

Esercitazione

Pratica
Cosa è vero riguardo al tag HTML <details>?
Cosa è vero riguardo al tag HTML <details>?
Was this page helpful?