W3docs

Tag HTML <details>

A tag <details> exibe informações adicionais que o utilizador pode abrir e ver. Atributos da tag e exemplos práticos.

A tag <details> é um dos elementos HTML5. Ela cria um widget de revelação: um controlo interativo que o utilizador pode abrir para revelar conteúdo extra e fechar novamente para o ocultar. Por padrão, o conteúdo permanece oculto e o navegador desenha um pequeno triângulo (o marcador de revelação) que roda para indicar o estado aberto ou fechado.

O primeiro filho de <details> deve ser um elemento <summary>, que define o rótulo visível no qual o utilizador clica para alternar o widget. O <summary> é o controlo em si — o restante conteúdo dentro de <details> é o que é mostrado ou ocultado. Se omitir o <summary>, o navegador fornece um rótulo padrão como "Details".

Por que usar <details>

A grande vantagem de <details> é que proporciona um widget de mostrar/ocultar totalmente funcional sem qualquer JavaScript. O navegador trata do comportamento de abrir/fechar, do suporte ao teclado e da acessibilidade por si.

Casos de uso comuns:

  • Listas de FAQ — cada pergunta é um <summary> e a resposta é revelada ao clicar.
  • Revelação progressiva — oculte definições avançadas, textos legais extensos ou secções "ler mais" para que a página permaneça escaneável.
  • Fallback de acordeão sem JS — como funciona sem scripting, <details> é uma base robusta para acordeões. Mesmo que o JavaScript não carregue, o conteúdo continua acessível.

Comparado com um acordeão JavaScript construído manualmente, <details> requer menos código, é automaticamente acessível por teclado e leitor de ecrã, e degrada de forma graciosa. Recorra a um widget JS personalizado apenas quando precisar de comportamento que o elemento nativo não suporta (por exemplo, transições de altura animadas em todo o conteúdo).

Sintaxe

A tag <details> vem em pares. O conteúdo é escrito entre as tags de abertura (<details>) e de fechamento (</details>).

Exemplo da 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>

Resultado

exemplo de details

O atributo open

Adicione o atributo boolean open para que o widget apareça expandido quando a página é carregada:

<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>

O atributo open reflete o estado atual em tempo real. Quando o utilizador alterna o widget, o navegador adiciona ou remove open no elemento automaticamente — não é necessário geri-lo manualmente. Também pode alterná-lo por script:

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

Ler details.open informa se o widget está atualmente aberto.

Exemplo da tag HTML <details> colocada dentro de uma 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>

Atributos

AtributoValorDescrição
openopenIndica que as informações na tag devem ser exibidas inicialmente de forma expandida.

A tag <details> também suporta os Atributos Globais e os Atributos de Evento.

Como estilizar uma tag HTML <details>

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

Estilizar o marcador de revelação

A maioria dos navegadores renderiza o triângulo de abrir/fechar através do pseudo-elemento ::marker no <summary>. Para alterá-lo ou removê-lo, defina list-style no summary:

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

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

Navegadores mais antigos baseados em WebKit (Safari/Chrome antigos) usavam um pseudo-elemento não padrão summary::-webkit-details-marker. Para cobri-los, ocultá-lo também:

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

O evento toggle

O elemento <details> dispara um evento toggle sempre que é aberto ou fechado. Este é o ponto de ancoragem correto para carregar conteúdo de forma lazy, enviar analytics ou sincronizar o estado da interface:

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

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

O evento é executado após o estado já ter sido alterado, pelo que details.open reflete o novo valor dentro do handler.

Acessibilidade

O par nativo <details>/<summary> vem com acessibilidade incorporada. Os navegadores expõem o <summary> com um papel semelhante a um botão e o <details> como um group, anunciam o estado expandido/recolhido aos leitores de ecrã, e tornam o summary focável e operável com Enter e Space. Esta é uma razão fundamental para preferir o elemento nativo a um acordeão com script — obtém semântica correta e suporte a teclado gratuitamente, sem gerir aria-expanded manualmente.

Agrupamento com o atributo name

Navegadores modernos (Chrome 120+ e outros motores recentes) suportam um atributo name em <details>. Quando vários elementos <details> partilham o mesmo name, comportam-se como um grupo exclusivo, como um acordeão: abrir um fecha automaticamente os outros.

<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>

Como esta é uma funcionalidade mais recente, os navegadores que não suportam name simplesmente ignoram-no e permitem que cada widget abra de forma independente — uma melhoria progressiva segura.

Tags relacionadas

  • <summary> — o rótulo visível e o controlo para um widget <details>.
  • <dialog> — uma caixa de diálogo nativa modal ou não modal, útil quando se precisa de uma sobreposição em vez de revelação inline.

Prática

Prática
O que é verdade sobre a tag HTML <details>?
O que é verdade sobre a tag HTML <details>?
Was this page helpful?