Este proyecto demuestra cómo construir una página interactiva de Año Nuevo utilizando HTML5, CSS3 y JavaScript. Se emplean características avanzadas de CSS como gradientes lineales, sombras de caja, bordes estilizados y pseudo-elementos para crear animaciones visuales atractivas.
La estructura del documento incluye secciones para diferentes estados de la página, un reproductor de música y elementos decorativos.
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Fiesta de Año Nuevo</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div id="control-musical">
<img class="activo" id="disco" src="img/disco.png" alt="Control de música">
<img src="img/puntero.png" alt="Puntero">
</div>
<div class="seccion" id="inicio">
<div class="fondo"></div>
<div class="linterna">Toque para iniciar<br>¡Feliz Año Nuevo!</div>
<div class="logo"></div>
<div class="saludo">Deseamos un próspero 2025</div>
</div>
<div class="seccion" id="medio">
<div class="fondo"></div>
<div class="anillo"></div>
<div class="año">2025</div>
</div>
<div class="seccion" id="final">
<div class="fondo"></div>
<div class="titulo">Éxito y Prosperidad</div>
<div class="arte"></div>
<div class="pareado-izquierdo"></div>
<div class="pareado-derecho"></div>
<div class="fortuna"></div>
</div>
<audio autoplay loop>
<source src="audio/fiesta.mp3">
</audio>
<script src="app.js"></script>
</body>
</html>
Se utilizan selectores avanzados y propeidades de diseño para crear efectos visuales. La propiedad box-sizing ajusta el modelo de caja, y los pseudo-elementos ::before e ::after generan elementos decorativos sin HTML adicional.
/* Reset general */
* { margin: 0; padding: 0; box-sizing: border-box; }
html, body { width: 100%; height: 100%; overflow: hidden; }
/* Control musical */
#control-musical {
position: fixed;
top: 20px;
right: 15px;
width: 50px;
height: 50px;
border-radius: 50%;
border: 3px solid #e63946;
background: #f1faee;
z-index: 100;
}
#control-musical img:first-of-type {
position: absolute;
width: 40px;
margin: 5px;
cursor: pointer;
}
#control-musical img:last-of-type {
position: absolute;
top: 10px;
right: 0;
width: 14px;
}
#control-musical img.activo {
animation: girar-disco 3s linear infinite;
}
@keyframes girar-disco {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
/* Secciones de página */
.seccion {
position: absolute;
width: 100%;
height: 100%;
display: none;
}
.seccion.activa { display: block; }
.seccion .fondo {
position: absolute;
width: 100%;
height: 100%;
z-index: -1;
}
#inicio .fondo { background: url(img/fondo-inicio.jpg) no-repeat center/cover; }
#medio .fondo { background: url(img/fondo-medio.jpg) no-repeat center/cover; }
#final .fondo { background: url(img/fondo-final.jpg) no-repeat center/cover; }
/* Estilos específicos de la sección de inicio */
#inicio .linterna {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 140px;
height: 300px;
background: url(img/linterna.png) no-repeat center/contain;
padding-top: 120px;
text-align: center;
color: #fff;
font-size: 18px;
}
#inicio .linterna::before {
content: '';
position: absolute;
top: 90px;
left: 50%;
transform: translateX(-50%);
width: 100px;
height: 100px;
background: radial-gradient(circle, #ff6b6b, transparent);
border-radius: 50%;
animation: pulsar 0.8s ease-in-out infinite alternate;
}
@keyframes pulsar {
from { opacity: 0.6; transform: translateX(-50%) scale(0.9); }
to { opacity: 1; transform: translateX(-50%) scale(1); }
}
#inicio .logo {
position: absolute;
bottom: 60px;
left: 50%;
transform: translateX(-50%);
width: 90px;
height: 100px;
background: url(img/logo.png) no-repeat center/contain;
}
#inicio .saludo {
position: absolute;
bottom: 30px;
width: 100%;
text-align: center;
font-size: 16px;
}
/* Estilos de la sección media */
#medio {
transition: opacity 0.5s, transform 0.5s;
}
#medio.desvanecer {
opacity: 0.3;
transform: translateY(-100%);
}
#medio .anillo {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 200px;
height: 200px;
border-radius: 50%;
background: url(img/anillo-externo.png) no-repeat center/contain;
animation: rotar-externo 2s linear infinite;
}
#medio .anillo::before {
content: '';
position: absolute;
top: 15px;
left: 15px;
width: 170px;
height: 170px;
border-radius: 50%;
background: url(img/anillo-medio.png) no-repeat center/contain;
animation: rotar-medio 1.5s linear infinite reverse;
}
#medio .anillo::after {
content: '';
position: absolute;
top: 30px;
left: 30px;
width: 140px;
height: 140px;
border-radius: 50%;
background: url(img/anillo-interno.png) no-repeat center/contain;
animation: rotar-interno 1s linear infinite;
}
#medio .año {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-size: 40px;
font-weight: bold;
color: #457b9d;
}
@keyframes rotar-externo { to { transform: translate(-50%, -50%) rotate(360deg); } }
@keyframes rotar-medio { to { transform: translate(-50%, -50%) rotate(-720deg); } }
@keyframes rotar-interno { to { transform: translate(-50%, -50%) rotate(1080deg); } }
/* Estilos de la sección final */
#final {
transition: transform 0.5s;
}
#final.desplazar {
transform: translateY(-100%);
}
#final .titulo {
position: absolute;
top: 40px;
left: 50%;
transform: translateX(-50%);
width: 170px;
height: 35px;
line-height: 35px;
text-align: center;
font-size: 22px;
font-weight: bold;
color: #d62828;
background: linear-gradient(45deg, #fdf0d5, #c9b458);
box-shadow: 5px 5px 15px rgba(0,0,0,0.2);
border: 4px groove #a8201a;
}
#final .arte {
position: absolute;
top: 120px;
left: 50%;
transform: translateX(-50%);
width: 150px;
height: 250px;
background: url(img/arte.png) no-repeat center/contain;
}
#final .pareado-izquierdo, #final .pareado-derecho {
position: absolute;
top: 150px;
width: 70px;
height: 240px;
background: url(img/pareado.png) no-repeat center/contain;
}
#final .pareado-izquierdo { left: 20px; }
#final .pareado-derecho { right: 20px; }
#final .fortuna {
position: absolute;
bottom: 30px;
left: 50%;
transform: translateX(-50%);
width: 90px;
height: 90px;
background: url(img/fortuna.png) no-repeat center/contain;
animation: girar-fortuna 4s linear infinite;
}
@keyframes girar-fortuna { to { transform: translateX(-50%) rotate(360deg); } }
El script gestiona la interación del usuario, cnotrolando la reproducción de audio y la transición entre secciones de la página.
// Referencias a elementos del DOM
const discoControl = document.getElementById('disco');
const audioElement = document.querySelector('audio');
const seccionInicio = document.getElementById('inicio');
const seccionMedio = document.getElementById('medio');
const seccionFinal = document.getElementById('final');
// Control del reproductor de música
discoControl.addEventListener('click', () => {
if (audioElement.paused) {
audioElement.play();
discoControl.classList.add('activo');
} else {
audioElement.pause();
discoControl.classList.remove('activo');
}
});
// Navegación entre secciones
seccionInicio.addEventListener('click', () => {
seccionInicio.classList.remove('activa');
seccionMedio.classList.add('activa');
seccionFinal.classList.add('activa');
seccionFinal.style.top = '100%';
// Iniciar transiciones después de un retraso
setTimeout(() => {
seccionMedio.classList.add('desvanecer');
seccionFinal.classList.add('desplazar');
seccionFinal.style.top = '0';
}, 5000);
});