BlogJavascriptTutorias

Clock JSON

Clock JSON

 

Clock JSON
Clock JSON

 

Introdução

Neste tutorial, vou mostrar a criação de um relógio(Clock) com display JSON, utilizando apenas CSS e JavaScript. com display JSON, utilizando apenas CSS e JavaScript.

Você aprenderá a construir uma interface elegante que simula um visor de relógio, exibindo dados dinâmicos como a data, hora, temperatura e nível de bateria, tudo formatado em JSON.

 

Criando o Clock JSON em Javascript

Primeiro passo você deverá criar a estrutura da página, para isso crie um arquivo html contendo  o seguinte código :

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Watch JSON Display</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>    
    <script src="script.js"></script>
</body>
</html>

 

Logo após crio a estrutura do Clock JSON:


    <div class="watch-container">
        <div class="watch-screen">
            <div class="header">
                <span class="dot red"></span>
                <span class="dot yellow"></span>
                <span class="dot green"></span>
                <span class="filename">stats.json</span>
            </div>
<pre class="json-display">
<span class="curly-brace">{</span>
    <span class="key">"now"</span>: <span class="curly-brace">{</span>
        <span class="key">"date"</span>: <span class="string" id="display-date">"12-05-2025"</span>,
        <span class="key">"time"</span>: <span class="string" id="display-time">"19:55:55"</span>,  
    <span class="curly-brace">}</span>,
    <span class="key">"temperature"</span>: <span class="number" id="display-temperature">"50ºC"</span>,
    <span class="key">"battery"</span>: <span class="number" id="display-battery">56</span>,
<span class="curly-brace">}</span>
</pre>
        </div>
    </div>

 

No código acima, focamos na estrutura básica do relógio em HTML.

 

Depois adiciono o css responsável pela estilização do relógio e pela animação:

 


body {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
  background-color: #333;
  margin: 0;
  font-family: "Consolas", "Monaco", monospace;
  overflow: hidden;
}
.watch-container {
  width: 250px;
  height: 250px;
  background-color: #000;
  border-radius: 50%;
  display: flex;
  justify-content: center;
  align-items: center;
  box-shadow: 0 0 20px rgba(0, 0, 0, 0.5);
}
.watch-screen {
  width: calc(100% - 2rem);
  height: calc(100% - 2rem);
  background-color: #1a1a1a;
  border-radius: 50%;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: space-evenly;
  padding: 1rem;
  box-sizing: border-box;
  font-size: 0.9em;
}
.header {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.4rem;
}
.header .dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
}
.header .red {
  background-color: #ff605c;
}
.header .yellow {
  background-color: #ffbd44;
}
.header .green {
  background-color: #00ca4e;
}
.header .filename {
  color: #e0e0e0;
  text-align: center;
  font-size: 0.8rem;
  font-weight: bold;
}
.json-display {
  white-space: pre-wrap; /* preserva whitespace e wrap text */
  margin: 0;
  padding: 0;
  line-height: 1.2;
  margin-left: 0.6rem;
  color: #e0e0e0;
}
/* Cores para simular o destaque de sintaxe JSON */
.key {
  color: #e06c75;
  color: #f7b233;
}
.string {
  color: #98c379;
}
.number {
  color: #9c71c4;
}
.curly-brace {
  color: #abb2bf;
}
/* Animação dos dots */
@keyframes bouncePulse {
  0%,
  100% {
    transform: translateY(0) scale(1);
    opacity: 1;
  }
  25% {
    transform: translateY(-2px) scale(1.05);
    opacity: 0.9;
  }
  50% {
    transform: translateY(0) scale(1);
    opacity: 1;
  }
  75% {
    transform: translateY(-1px) scale(1.02);
    opacity: 0.95;
  }
}
.dot {
  width: 12px;
  height: 12px;
  border-radius: 50%;
  animation: bouncePulse 2.5s infinite ease-in-out;
}
.red {
  background-color: #ff5f56;
  animation-delay: 0s;
}
.yellow {
  background-color: #ffbd2e;
  animation-delay: 0.6s;
}
.green {
  background-color: #27c93f;
  animation-delay: 1.2s;
}

 

Por ultimo adiciono o script responsável pela lógica do relógio:

    
// Obtem a referencia dos elementos html
const displayTime = document.getElementById("display-time");
const displayDate = document.getElementById("display-date");
const displayBattery = document.getElementById("display-battery");
const displayTemperature = document.getElementById("display-temperature");
// --- Função para formatar numeros com 2 digitos ---
function formatTwoDigits(number) {
  return number < 10 ? `0${number}` : number;
}
// --- Função para atualizar o Tempo ---
function updateTime() {
  const now = new Date();
  const hours = formatTwoDigits(now.getHours());
  const minutes = formatTwoDigits(now.getMinutes());
  const seconds = formatTwoDigits(now.getSeconds());
  if (displayTime) {
    displayTime.textContent = `${hours}:${minutes}:${seconds}`;
  }
}
// --- Função para atualizar a Data ---
function updateDate() {
  const now = new Date();
  const day = formatTwoDigits(now.getDate());
  const month = formatTwoDigits(now.getMonth() + 1);
  const year = now.getFullYear();
  if (displayDate) {
    displayDate.textContent = `${day}-${month}-${year}`;
  }
}
// --- Função para simular Bateria ---
function updateBattery() {
  if (displayBattery) {
    const simulatedBattery = Math.floor(Math.random() * (99 - 40 + 1)) + 40;
    displayBattery.textContent = `${simulatedBattery}%`;
  }
}
// --- Função para simular TEmperatura ---
function updateTemperature() {
  if (displayTemperature) {
    const simulatedTemperature = Math.floor(Math.random() * (35 - 20 + 1)) + 20;
    displayTemperature.textContent = `${simulatedTemperature}ºC`;
  }
}
// --- Função Principal ---
function initializeWatchDisplay() {
  // Call individual update functions to set initial display
  updateTime();
  updateDate();
  updateBattery();
  updateTemperature();
  // configura intervalos
  setInterval(updateTime, 1000); // atualiza a cada segundo
  setInterval(updateDate, 60000); // atualiza a cada minuto
  setInterval(updateBattery, 5000); // atualiza a Bateria a cada 5 segundos
  setInterval(updateTemperature, 7000); // atualiza a temperature a cada 7 segundos
}
// --- Inicializa ---
document.addEventListener("DOMContentLoaded", initializeWatchDisplay);

Uma breve explicação do código Javascript criado:  

    • Captura de Elementos HTML: No início, o script “pega” as referências de todos os elementos HTML (como display-time, display-date, etc.) onde as informações serão mostradas.
    • Formatação de Dois Dígitos: A função formatTwoDigits garante que números menores que 10 (como 5 horas ou 7 minutos) sejam exibidos com um zero à esquerda (ex: “05”, “07”), mantendo um formato padrão.
    • Atualização de Tempo e Data:
      • updateTime: Obtém a hora, minuto e segundo atuais e os exibe no formato HH:MM:SS.
      • updateDate: Pega o dia, mês e ano e os mostra como DD-MM-AAAA.
    • Simulação de Dados:
      • updateBattery: Gera um valor de bateria aleatório entre 40% e 99% para simular o nível da bateria.
      • updateTemperature: Simula uma temperatura aleatória entre 20ºC e 35ºC.
    • Função Principal (initializeWatchDisplay):
      • Chama as funções de atualização uma vez para exibir os valores iniciais assim que a página carrega.
      • Usada para definir os intervalos de atualização de cada informação;
    • Inicialização Segura: O evento DOMContentLoaded garante que o script só comece a rodar depois que todo o HTML da página for carregado, evitando erros.

 

Você pode visualizar a animação no link abaixo:

Relógio Json 

 

Deixo aqui um vídeo curto do processo de criação da animação:

 

 

 

 

Conclusão

Este projeto não só adiciona um elemento divertido ao seu site, mas também é uma excelente maneira de melhorar suas habilidades em HTML, CSS e JavaScript. Experimente adicionar outros efeitos ou personalizações para tornar a animação ainda mais envolvente.

 

Código fonte do tutorial  da animação em Javascript:

Código Fonte

 

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *