<article>, <nav>, <main>, <aside>...// 06 de 09
Acordeón nativo sin JavaScript. El navegador gestiona apertura, cierre, el evento toggle y el atributo open.
<details><summary>open
name=toggle eventexclusive accordion
Básico
<article>, <nav>, <main>, <aside>...<section> implica un bloque temático con sentido propio, idealmente con un heading. <div> es un contenedor genérico sin semántica propia.Abierto por defecto — atributo open
open en el HTML lo hace visible desde el inicio. Es un atributo booleano, no necesita valor.Exclusive Accordion — atributo name (Chrome 120+)
<details> con el mismo valor de name forman un grupo. Abrir uno cierra los demás automáticamente.name y funcionan como details normales.Evento toggle (escucha con JS)
open como atributo — puedes leer/escribir details.open en JS para saber si está abierto.
summary — es el único hijo que el navegador requiere. Lo demás puede ser cualquier HTML.
<!-- Básico -->
<details>
<summary>Título visible</summary>
<p>Contenido oculto</p>
</details>
<!-- Abierto por defecto -->
<details open>
<summary>Visible al cargar</summary>
<p>Este ya está expandido</p>
</details>
<!-- Exclusive accordion (Chrome 120+) -->
<!-- El mismo name= los agrupa -->
<details name="grupo">
<summary>Item 1</summary>
Contenido 1
</details>
<details name="grupo">
<summary>Item 2</summary>
Contenido 2
</details>
<!-- Evento toggle: detecta apertura/cierre -->
details.addEventListener('toggle', e => {
if (e.newState === 'open') {
console.log('abierto')
} else {
console.log('cerrado')
}
})
<!-- Leer estado programáticamente -->
const d = document.querySelector('details')
console.log(d.open) // true o false
d.open = true // abrir desde JS
<!-- CSS: quitar el triángulo nativo -->
summary {
list-style: none;
}
summary::-webkit-details-marker {
display: none;
}