Descripción
Este proyecto es una representación digital de un reloj analógico clásico, construido utilizando JavaScript, HTML y CSS. No solo muestra la hora en tiempo real con agujas animadas suavemente, sino que también incluye un indicador completo de la fecha (día de la semana, día del mes, mes y año). La carátula del reloj, con sus marcas de hora y minuto, se dibuja dinámicamente utilizando el API de Canvas 2D, lo que permite un diseño flexible y adaptable. Las animaciones fluidas de las agujas se logran mediante transformaciones CSS, proporcionando una una experiencia visual elegante y precisa.
Características clave
- Visualización Analógica en Tiempo Real:
Muestra la hora exacta con agujas de hora, minuto y segundo que se actualizan cada segundo.
- Diseño de Carátula Dinámico:
La carátula del reloj, incluyendo las marcas de hora y minuto, se dibuja programáticamente usando el API de Canvas 2D.
- Indicador de Fecha Completo:
Muestra el día de la semana, el día del mes, el mes y el año, proporcionando información de fecha completa.
- Animación Fluida de Agujas:
Las agujas se mueven de forma suave y precisa gracias a las transformaciones CSS (rotate).
- Responsive:
La generación de la carátula se adapta al tamaño del canvas.
Aspectos destacados del código
- API de Canvas 2D para Gráficos:
Utiliza canvas.getContext('2d') para dibujar las marcas de las horas y minutos del reloj, permitiendo un control preciso sobre la estética de la carátula.
-
function DrawLinesClock() { for (let index = 0; index < numberOfLines; index++) { ctxClock.strokeStyle = index % 5 == 0 ? "#2c2c2c" : "#656565"; ctxClock.lineWidth = index % 5 == 0 ? 40 : 20; circleDiameter = index % 5 == 0 ? 242 : 250; ctxClock.beginPath(); ctxClock.arc(275, 275, circleDiameter, positionAngle * (index * 2) - 0.008, positionAngle * ((index * 2) + 0.1)); ctxClock.stroke(); } } - `setInterval` para Actualización Continua:
Emplea un temporizador para refrescar la posición de las agujas y la fecha cada segundo, asegurando la precisión del reloj.
-
setInterval(() => { const date = new Date(); let seconds = (360 / 120) * (date.getSeconds() * 2); let minutes = (360 / 60) * date.getMinutes(); let hours = (360 / 12) * date.getHours(); handSecond.style.transform = `rotate(${seconds}deg)`; handMinute.style.transform = `rotate(${minutes}deg)`; handHour.style.transform = `rotate(${hours}deg)`; GetDate(); // Actualiza la visualización de la fecha }, 1000); - CSS Transformations para Animación:
Aplica style.transform = 'rotate(Xdeg)' directamente a los elementos DOM que representan las agujas, creando una animación de rotación eficiente y fluida.
-
handSecond.style.transform = `rotate(${seconds}deg)`; handMinute.style.transform = `rotate(${minutes}deg)`; handHour.style.transform = `rotate(${hours}deg)`; - Objeto `Date` para Sincronización:
Utiliza el objeto Date de JavaScript para obtener la hora y fecha actuales del sistema, calculando las rotaciones necesarias para cada aguja y extrayendo la información de la fecha.
-
function GetDate() { const date = new Date(); let weekdate = date.getDay(); let daysName = ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"]; let daysMonth = ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"] weekDay.textContent = daysName[weekdate]; day.textContent = date.getDate(); month.textContent = daysMonth[date.getMonth()]; year.textContent = date.getFullYear(); } - Manipulación Directa del DOM:
Accede y actualiza el contenido de los elementos HTML (textContent) para mostrar la fecha y el día de la semana.
-
weekDay.textContent = daysName[weekdate]; day.textContent = date.getDate(); month.textContent = daysMonth[date.getMonth()]; year.textContent = date.getFullYear(); - Re-renderizado en Resize:
Adapta el dibujo de la carátula si la ventana cambia de tamaño, manteniendo la proporción y la calidad visual.
-
window.addEventListener("resize", function () { // Lógica para borrar y redibujar la carátula al cambiar el tamaño de la ventana while (ruleXContainer.children[1]) { // Asumiendo que ruleXContainer se refiere a una parte de la carátula que se reconstruye ruleXContainer.removeChild(ruleXContainer.children[1]) } CreateRuleX(); // O la función específica para redibujar las marcas del reloj });
Desafíos técnicos
- Cálculo Preciso de Rotaciones:
Convertir la hora del sistema (horas, minutos, segundos) en los ángulos de rotación exactos para cada aguja del reloj, asegurando su movimiento fluido y coordinado.
- Sincronización Visual:
Mantener las agujas del reloj perfectamente sincronizadas con el tiempo real del sistema sin saltos ni desfases perceptibles, lo que requiere un uso cuidadoso de setInterval y las propiedades transform de CSS.
- Dibujo de Carátula con Canvas:
Diseñar y dibujar las marcas de hora y minuto en la carátula del reloj de forma programática utilizando el API de Canvas 2D, asegurando que sean proporcionales y estéticamente agradables.
Aprendizajes obtenidos
- Combinación de Canvas y CSS:
Aprendí a integrar eficazmente el dibujo con Canvas para elementos estáticos (la carátula) y las transformaciones CSS para animaciones dinámicas (las agujas), aprovechando las fortalezas de cada tecnología.
- Manejo de Fechas y Tiempo en JavaScript:
Profundicé en el objeto Date de JavaScript y sus métodos para extraer y manipular información de tiempo y fecha con precisión.
- Programación Basada en Intervalos:
Reforcé mi comprensión del uso de setInterval para ejecutar funciones periódicamente y mantener la interfaz de usuario actualizada en tiempo real.
- Conceptos de Rotación y Ángulos:
Practiqué la aplicación de trigonometría básica para calcular ángulos de rotación basados en datos numéricos, un concepto fundamental en la animación de elementos gráficos.
Posibles mejoras / Ideas a implementar
- Personalización Visual:
Añadir opciones para cambiar los colores de las agujas, el fondo del reloj o el estilo de las marcas.
- Múltiples Zonas Horarias:
Permitir la adición de relojes que muestren la hora en diferentes zonas horarias.
- Alarmas y Temporizadores:
Integrar funciones de alarma o un temporizador de cuenta regresiva.
- Modo Nocturno/Día:
Alternar entre diferentes temas visuales según la hora del día.
- Sonido de Tictac Opcional:
Añadir un efecto de sonido de tictac que se pueda activar/desactivar.
Información
Componentes
2022-12-24
JavaScript