Patrones de menú responsive: 10 técnicas CSS y HTML nativas

Compara diez maneras reales de resolver navegación responsive: desde checkbox hack y details hasta popover, dialog, aria-expanded y WAAPI.

No existe un único menú responsive correcto: la mejor solución depende del tipo de navegación, del soporte que necesitas y del peso de interacción que quieres asumir.

En esta lección no repetimos la teoría base de navbar; aquí comparamos patrones de implementación reales para que aprendas a elegir con criterio profesional.

El objetivo es que puedas distinguir cuándo conviene CSS puro, cuándo merece la pena una API nativa del navegador y cuándo un poco de JavaScript mejora accesibilidad y mantenimiento.

  • Antes de elegir estilo, decide el mecanismo de apertura.
  • Los diez snippets se agrupan en cuatro familias: CSS puro, HTML nativo con comportamiento integrado, JavaScript mínimo para estado y JavaScript avanzado para animación.
  • CSS puro es ideal para menús simples y demos rápidas, pero puede quedarse corto cuando necesitas cerrar con clic externo, coordinar alturas dinámicas o sincronizar varios estados.
  • Las APIs nativas como <code>details</code>, <code>dialog</code> y <code>popover</code> reducen código y resuelven parte de la accesibilidad por ti. Son una gran opción cuando el soporte del navegador encaja con tu proyecto.
  • Más limpios de mantener cuando la navegación no exige lógica compleja.

Cuatro familias de solución

Antes de elegir estilo, decide el mecanismo de apertura.

Los diez snippets se agrupan en cuatro familias: CSS puro, HTML nativo con comportamiento integrado, JavaScript mínimo para estado y JavaScript avanzado para animación.

CSS puro es ideal para menús simples y demos rápidas, pero puede quedarse corto cuando necesitas cerrar con clic externo, coordinar alturas dinámicas o sincronizar varios estados.

Las APIs nativas como <code>details</code>, <code>dialog</code> y <code>popover</code> reducen código y resuelven parte de la accesibilidad por ti. Son una gran opción cuando el soporte del navegador encaja con tu proyecto.

Patrones sin JavaScript o casi sin JavaScript

Más limpios de mantener cuando la navegación no exige lógica compleja.

Aquí entran el checkbox hack, <code>:has()</code>, <code>details</code> y los menús que simplemente reordenan enlaces con Grid sin colapsar en hamburguesa.

Su ventaja principal es que el estado visual vive en HTML y CSS, así que el componente es fácil de inspeccionar, testear y portar a otros proyectos.

La contrapartida es que, en interacciones más ricas, el patrón puede volverse rígido o difícil de extender sin acabar metiendo JS igualmente.

  • Checkbox hack y :has() funcionan bien cuando solo necesitas abrir y cerrar.
  • details y summary son especialmente útiles para contenido desplegable simple.
  • Grid sin hamburguesa tiene sentido si el menú puede recolocarse sin perder legibilidad.

Patrones con JavaScript mínimo o expresivo

Úsalos cuando la interacción aporta valor real, no por inercia.

Los snippets con <code>aria-expanded</code>, <code>classList</code> y medición de alturas enseñan un JS pequeño pero muy práctico: sincronizar atributos, animar estados y mantener accesibilidad.

WAAPI ya es otro nivel: no se limita a poner clases, sino que define keyframes desde JS para controlar entrada, salida y ritmo con más precisión.

La clave profesional es que el estado siga siendo entendible. Si el usuario y tú no podéis deducir de dónde sale la apertura del menú, el patrón no escalará bien.

Cómo elegir el patrón correcto

La decisión se toma por restricciones, no por estética.

Código del tema: [aria-expanded="true"]

📘 Teoría

Cuatro familias de solución

Antes de elegir estilo, decide el mecanismo de apertura.

Los diez snippets se agrupan en cuatro familias: CSS puro, HTML nativo con comportamiento integrado, JavaScript mínimo para estado y JavaScript avanzado para animación.

CSS puro es ideal para menús simples y demos rápidas, pero puede quedarse corto cuando necesitas cerrar con clic externo, coordinar alturas dinámicas o sincronizar varios estados.

Las APIs nativas como details, dialog y popover reducen código y resuelven parte de la accesibilidad por ti. Son una gran opción cuando el soporte del navegador encaja con tu proyecto.

Patrones sin JavaScript o casi sin JavaScript

Más limpios de mantener cuando la navegación no exige lógica compleja.

Aquí entran el checkbox hack, :has(), details y los menús que simplemente reordenan enlaces con Grid sin colapsar en hamburguesa.

Su ventaja principal es que el estado visual vive en HTML y CSS, así que el componente es fácil de inspeccionar, testear y portar a otros proyectos.

La contrapartida es que, en interacciones más ricas, el patrón puede volverse rígido o difícil de extender sin acabar metiendo JS igualmente.

  • Checkbox hack y :has() funcionan bien cuando solo necesitas abrir y cerrar.
  • details y summary son especialmente útiles para contenido desplegable simple.
  • Grid sin hamburguesa tiene sentido si el menú puede recolocarse sin perder legibilidad.

Patrones con JavaScript mínimo o expresivo

Úsalos cuando la interacción aporta valor real, no por inercia.

1

Los snippets con aria-expanded, classList y medición de alturas enseñan un JS pequeño pero muy práctico: sincronizar atributos, animar estados y mantener accesibilidad.

2

WAAPI ya es otro nivel: no se limita a poner clases, sino que define keyframes desde JS para controlar entrada, salida y ritmo con más precisión.

3

La clave profesional es que el estado siga siendo entendible. Si el usuario y tú no podéis deducir de dónde sale la apertura del menú, el patrón no escalará bien.

Cómo elegir el patrón correcto

La decisión se toma por restricciones, no por estética.

1

Elige CSS puro si...

El menú es corto, la interacción es binaria y quieres un componente muy fácil de portar o enseñar.

2

Elige API nativa si...

Quieres foco, Escape o cierre externo resueltos con menos código y tu soporte de navegadores lo permite.

3

Elige JS mínimo si...

Necesitas sincronizar atributos ARIA, medir altura real o bloquear scroll del body sin montar una arquitectura pesada.

4

Elige WAAPI si...

La animación es parte del lenguaje visual del producto y requiere más control que classList más transition.

🧪 Aprende probando

Ejemplo Demo: menú brutalista con checkbox hack CSS puro con un look extremo y estructura fácil de diseccionar.
Ejemplo Demo: menú glassmorphism con altura interpolada El JS mide scrollHeight y lo usa como height real para lograr una apertura precisa, más limpia que el hack de max-height.
Ejemplo Demo: menú terminal con details y summary Patrón nativo muy útil para entender disclosure sin JS.
Ejemplo Demo: menú editorial con Grid adaptable Caso donde no hace falta hamburguesa porque el layout responde bien por sí solo.
Ejemplo Demo: menú cyberpunk con WAAPI Usa element.animate() con stagger en los enlaces, un buen ejemplo de cuándo la animación programática sí aporta valor.
Ejemplo Demo: menú swiss con @starting-style Muestra cómo animar desde display: none con CSS moderno usando @starting-style y transition-behavior: allow-discrete.
Ejemplo Demo: menú art déco con Popover API Gran ejemplo de API nativa para abrir y cerrar sin escribir controladores personalizados.
Ejemplo Demo: menú orgánico con dialog Menú a pantalla completa que aprovecha foco y Escape nativos.
Ejemplo Demo: menú industrial con aria-expanded Uno de los patrones más profesionales para conectar accesibilidad y estilo con la misma fuente de verdad.
Ejemplo Demo: menú lúdico con :has() El padre reacciona al estado del checkbox con :has(), un patrón más flexible que el combinador ~ para estudiar selectores modernos.

🏁 Retos

Reto Reto: conectar aria-expanded con el panel móvil Sincroniza el atributo ARIA del botón con la apertura visual del menú.

🧰 Recursos

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros. culTest

La hice en febrero de 2026 para facilitar el aprendizaje de mis alumnos. La idea es aprender desarrollo web practicando y que el proyecto siga creciendo con nuevos temas, tests y retos.

Está inspirada en MDN, W3Schools, CodePen, Manz y muchos otros sitios de documentación sobre desarrollo web. Quería combinar teoría útil, ejemplos ejecutables, retos y el sistema de tests que ya tenía en culTest. culTest

Si te gustó, si no te gustó o si quieres escribirme, puedes hacerlo en cristianeslava@gmail.com