details y summary: Contraer y expandir con HTML5

publicado en la categoría HTML
Las etiquetas details y summary se utilizan combinadas para contraer y expandir elementos y, aunque aún no terminan de implementarse en algunos navegadores, están disponibles para la mayoría de ellos y son reconocidos por los distintos dispositivos.

Contraer y expandir elementos es algo muy simple que podemos hacer con JavaScript y hay decenas de métodos; incluso librerías como jQuery poseen funciones específicas que incluyen efectos y animaciones ¿por qué jamas existió una etiqueta específica para eso? NO tengo idea pero, el HTML5 lo ha resuelto aunque aún no terminan de implementarse en algunos dispositivos.

Las etiquetas details y summary se utilizan combinadas para generar una sección interactiva que el usuario pueda abrir o cerrar. Un ejemplo básico:

<details>
	<summary>detalles a ver</summary>
	....... cualquier contenido .......
</details>
expandir/contraer detalles

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.
Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero.

El texto visible que sirve de enlace para desplegar y contraer se coloca en summary y todo lo que lo que sigue es lo que se ocultará hasta tanto se haga click. Ese contenido que por defecto no es visible, puede ser cualquier cosa.

ver/ocultar imagen

La etiqueta details admite todos los atributos generales de cualquier otra y además, posee dos que son específicos:

ontoggle ejecuta una función JavaScript cuando se abre o cierra
open indica que el contenido es visible inicialmente

ejemplo toggle

este texto es visible por defecto

Podemos usar CSS para personalizar su apariencia, incluyendo el carácter que se define como marca si establecemos la propiedad display con el valor block:

summary {
	color: #34b3a0;
	cursor: pointer;
	display: block;
	font-weight: bold;
}
summary::before {
	color: #34b3a0;
	content: "\25BC";
	font-size: 24px;
	padding-right: .1em;
	vertical-align: text-top;
}
details[open] summary::before {
	content: "\25B2";
}
ejemplo CSS personalizado

Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.

Como cualquier etiqueta, puede anidarse así que nada impide transformarla, por ejemplo, en algo parecido a un menú:

<details>
	<summary>ejemplo anidado</summary>
	<details>
		<summary>primero</summary>
		....... contenido .......
	</details>
	<details>
		<summary>segundo</summary>
		....... contenido .......
	</details>
</details>
ejemplo anidado
submenú 1
submenú 2