Aprende a implementar un menú hamburguesa: estructura HTML, estilos CSS, toggle con JavaScript y mejoras de accesibilidad (aria-expanded, foco).
Cómo crear un menú hamburguesa con JavaScript

El “menú hamburguesa” es un patrón típico en móviles: un botón (icono de 3 líneas) que abre/cierra la navegación. La idea clave es simple: mostrar u ocultar el menú con una clase CSS, y controlar esa clase con JavaScript.

1) HTML recomendado

Necesitas un botón y un contenedor para los enlaces. Importante: el botón debe ser un <button> (no un <div>) y conviene añadir atributos ARIA.

<header class="topbar">
  <a class="logo" href="/">Recetas</a>

  <button
    id="menuBtn"
    class="menu-btn"
    aria-controls="mainNav"
    aria-expanded="false"
    aria-label="Abrir menú"
  >
    ☰
  </button>

  <nav id="mainNav" class="nav" hidden>
    <a href="#inicio">Inicio</a>
    <a href="#recetas">Recetas</a>
    <a href="#videos">Vídeos</a>
    <a href="#otros">Otros</a>
  </nav>
</header>

2) CSS: ocultar/mostrar con una clase

En móvil, ocultas el menú por defecto. Al abrir, aplicas una clase (por ejemplo .is-open).

.nav[hidden] { display: none; }

.nav {
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding: 12px 0;
}

@media (min-width: 900px) {
  .menu-btn { display: none; }
  .nav { flex-direction: row; padding: 0; }
  .nav[hidden] { display: flex; }
}

3) JavaScript: toggle

const btn = document.querySelector("#menuBtn");
const nav = document.querySelector("#mainNav");

btn.addEventListener("click", () => {
  const isOpen = btn.getAttribute("aria-expanded") === "true";

  btn.setAttribute("aria-expanded", String(!isOpen));
  btn.setAttribute("aria-label", isOpen ? "Abrir menú" : "Cerrar menú");

  if (isOpen) {
    nav.setAttribute("hidden", "");
  } else {
    nav.removeAttribute("hidden");
  }
});

4) Mejoras rápidas (muy recomendadas)

  • Cerrar al clicar un enlace (en móvil).
  • Cerrar con ESC para accesibilidad y UX.
  • Bloquear scroll si el menú ocupa toda la pantalla.
// Cerrar con ESC
document.addEventListener("keydown", (e) => {
  if (e.key !== "Escape") return;
  if (btn.getAttribute("aria-expanded") === "true") {
    btn.click();
  }
});