001. DOM: Ejercicios / Menú de hamburguesa

En este ejercicio vamos a crear un menú de hamburguesa. En estos ejercicios vamos a estar trabajando con módulos de Javascript.

Para la imagen de la hamburguesa nos vamos a ayudar de una página, llamada https://jonsuh.com/hamburgers/. Tenemos que llamar a la librería, para lo que nos vamos a ayudar de un CDN llamado https://cdnjs.com, y en su buscador escribimos la palabra hamburguer. Copiamos la URL de la hoja de estilos minificada y la pegamos en un link.

Nota: es un error de usabilidad poner los botones de hamburguesa en la parte de arriba, porque cuando usamos el móvil, vamos a acceder a dicho botón de mejor manera desde abajo.

La sintaxis de nuestro archivo menu-hamburguesa.html es la siguiente.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Ejercicios del DOM</title>
    <link
      rel="stylesheet"
      href="https://cdnjs.cloudflare.com/ajax/libs/hamburgers/1.2.1/hamburgers.min.css"
    />
    <link rel="stylesheet" href="dom-ejercicios.css" />
  </head>
  <body>
    <header class="header">
      <h1>Ejercicios del DOM</h1>
    </header>
    <button class="panel-btn hamburger hamburger--vortex" type="button">
      <span class="hamburger-box">
        <span class="hamburger-inner"></span>
      </span>
    </button>
    <aside class="panel">
      <nav class="menu">
        <a href="#seccion1">Sección 1</a>
        <a href="#seccion2">Sección 2</a>
        <a href="#seccion3">Sección 3</a>
        <a href="#seccion4">Sección 4</a>
        <a href="#seccion5">Sección 5</a>
      </nav>
    </aside>
    <main>
      <section id="seccion1" class="section">
        <h2>Sección 1</h2>
      </section>
      <section id="seccion2" class="section">
        <h2>Sección 2</h2>
      </section>
      <section id="seccion3" class="section">
        <h2>Sección 3</h2>
      </section>
      <section id="seccion4" class="section">
        <h2>Sección 4</h2>
      </section>
      <section id="seccion5" class="section">
        <h2>Sección 5</h2>
      </section>
    </main>
    <script src="index_dom.js" type="module"></script>
  </body>
</html>

La del archivo menu-hamburguesa.css sería la siguiente.

/* **** Reset CSS **** */
:root {
  --main-font: sans-serif;
  --font-size: 16px;
  --main-color: #f7df1e;
  --second-color: #222;
  --main-modal-color: rgba(247, 222, 30, 0.85);
  --second-modal-color: rgba(34, 34, 34, 0.85);
  --container-width: 1200px;
}
html {
  box-sizing: border-box;
  font-family: var(--main-font);
  font-size: var(--font-size);
  scroll-behavior: smooth;
}
*,
*::before,
*::after {
  box-sizing: inherit;
}
body {
  margin: 0;
  overflow-x: hidden;
}
img {
  max-width: 100%;
  height: auto;
}
/* **** Menú Hamburguesa **** */
.header {
  position: sticky;
  top: 0;
  padding: 1rem;
  background-color: var(--main-color);
  color: var(--second-color);
}
.header h1 {
  margin: 0 auto;
  text-align: center;
}
.section {
  padding: 2rem;
  padding-top: 4rem;
  margin-left: auto;
  margin-right: auto;
  width: 100%;
  max-width: var(--container-width);
  min-height: 100vh;
  text-align: center;
}
.panel {
  position: fixed;
  z-index: 998;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  width: 100%;
  background-color: var(--second-modal-color);
  transition: transform 0.3s ease, opacity 0.5s ease;
  /* De arriba */
  transform: translate(0, -100%);
  /* De abajo */
  transform: translate(0, 100%);
  /* De izda */
  transform: translate(-100%, 0);
  /* De dcha */
  transform: translate(100%, 0);
  /* Opacidad */
  opacity: 0;
}
.panel.is-active {
  transform: translate(0, 0);
  opacity: 1;
}
.panel-btn {
  position: fixed;
  z-index: 999;
  bottom: 1vh;
  right: 1vw;
  width: 4rem;
  height: 4rem;
  border-radius: 50%;
  padding: 0;
  display: flex;
  justify-content: center;
  align-items: center;
  background-color: var(--main-color);
}
.menu {
  width: inherit;
  display: flex;
  flex-direction: column;
  justify-content: space-evenly;
  align-items: center;
  text-align: center;
}
.menu a {
  padding: 2rem;
  width: inherit;
  display: block;
  font-size: 1.5rem;
  text-decoration: none;
  color: var(--main-color);
  transition: all 0.3s ease;
}
.menu a:hover {
  font-weight: bold;
  color: var(--second-color);
  background-color: var(--main-modal-color);
}

La de nuestro archivo index_dom.js sería la siguiente.

import hamburguerMenu from "./menu_hamburguesa.js";

const d = document;

d.addEventListener("DOMContentLoaded", (e) => {
  hamburguerMenu(".panel-btn", ".panel", ".menu a");
})

Y por último, nuestro archivo menu_hamburguesa.js contendría la siguiente sintaxis.

export default function hamburguerMenu(panelBtn, panel, menuLink) {
const d = document;

d.addEventListener("click", (e) => {
  if(e.target.matches(panelBtn) || e.target.matches(`${panelBtn} *`)) {
   d.querySelector(panel).classList.toggle("is-active");
   d.querySelector(panelBtn).classList.toggle("is-active");
  }

  if(e.target.matches(menuLink)) {
   d.querySelector(panel).classList.remove("is-active");
   d.querySelector(panelBtn).classList.remove("is-active");
  }
 })
}
Scroll al inicio