002. DOM: Ejercicios / Reloj digital

Este ejercicio es la continuación del ejercicio del capítulo anterior, por lo que vamos a utilizar los mismos archivos, pero vamos a incluirles archivos nuevos, que forman parte justamente de este ejercicio. Para este ejercicio vamos a tener 5 archivos, que son:

  • dom-ejercicios.css
  • dom-ejercicios.html
  • index_dom.js
  • menu_hamburguesa.js
  • reloj.js

Además, tenemos que bajarnos de internet un pequeño audio que sea una alarma, dándole el nombre alarm.mp3.

El archivo dom-ejercicios.css tiene la siguiente sintaxis.

/* **** 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;
  visibility: hidden;
}

.panel.is-active {
  transform: translate(0, 0);
  opacity: 1;
  visibility: visible;
}

.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);
}

El archivo dom-ejercicios.html tiene la siguiente sintaxis.

<!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">Reloj Digital y Alarma Sonora</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>Reloj Digital y Alarma Sonora</h2>
        <div id="reloj"></div>
        <div>
          <button id="activar-reloj">Iniciar Reloj</button>
          <button id="desactivar-reloj">Detener Reloj</button>
          <button id="activar-alarma">Iniciar Alarma</button>
          <button id="desactivar-alarma">Detener Alarma</button>
        </div>
      </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>

El archivo index_dom.js tiene la siguiente sintaxis.

import hamburgerMenu from "./menu_hamburguesa.js";
import { digitalClock, alarm } from "./reloj.js";

const d = document;

d.addEventListener("DOMContentLoaded", (e) => {
  hamburgerMenu(".panel-btn", ".panel", ".menu a");
  digitalClock("#reloj", "#activar-reloj", "#desactivar-reloj");
  alarm("alarma.mp3", "#activar-alarma", "#desactivar-alarma");
});

El archivo menu_hamburguesa.js tiene la siguiente sintaxis.

export default function hamburgerMenu(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");
    }
  });
}

El archivo reloj.js tiene la siguiente sintaxis.

const d = document;

export function digitalClock(clock, btnPlay, btnStop) {
  let clockTempo;
  d.addEventListener("click", (e) => {
    if (e.target.matches(btnPlay)) {
      clockTempo = setInterval(() => {
        let clockHour = new Date().toLocaleTimeString();
        d.querySelector(clock).innerHTML = `<h3>${clockHour}</h3>`;
      }, 1000);
      e.target.disabled = true;
    }

    if (e.target.matches(btnStop)) {
      clearInterval(clockTempo);
      d.querySelector(clock).innerHTML = null;
      document.querySelector(btnPlay).disabled = false;
    }
  });
}

export function alarm(sound, btnPlay, btnStop) {
  let alarmTempo;
  const $alarm = d.createElement("audio");
  $alarm.src = sound;

  d.addEventListener("click", (e) => {
    if (e.target.matches(btnPlay)) {
      alarmTempo = setTimeout(() => {
        $alarm.play();
      }, 2000);
      e.target.disabled = true;
    }

    if (e.target.matches(btnStop)) {
      clearTimeout(alarmTempo);
      $alarm.pause();
      $alarm.currentTime = 0;
      document.querySelector(btnPlay).disabled = false;
    }
  });
}
Scroll al inicio