본문 바로가기
GAS/[Js_손코딩]

Mini Time & Date Widget

by 일등미노왕국 2023. 6. 19.

https://www.youtube.com/watch?v=USoocGbbl4s 

See the Pen Mini Time & Date Widget by ektjtthsrk (@minos79) on CodePen.

코드 리뷰를 시작하겠다.

Html은 시계와 날짜 영역을 Div태그로 나누었다.

더보기
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Mini Time & Date Widget</title>  
  <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&display=swap" rel="stylesheet">
  <link rel="stylesheet" href="style.css" />
</head>
<body>
  <div class="container">
    <div class="clock-container"></div>
    <div class="date-container"></div>
  </div>
  <script src="script.js"></script>
</body>
</html>

Css 영역 역시 grid로 시간 영역과 날짜 영역으로 나눈 뒤 세부적으로 마무리하였다.

* {
  padding: 0;
  margin: 0;
  box-sizing: border-box;
  font-family: "Poppins", sans-serif;
}
body {
  background-color: #1a1a1a;
}
.container {
  width: 21.78em;
  display: grid;
  position: absolute;
  transform: translate(-50%, -50%);
  left: 50%;
  top: 50%;
  color: #ffffff;
  align-items: center;
  grid-template-columns: 8fr 4fr;
  background-color: #1e90ff;
  boder-radius: 0.5em;    
}
.clock-container {
  background-color: #1a1a1a;
  color: #ffffff;
  text-align: center;
  font-size: 3.75em;
  margin-left: 0.2em;
  border-radius: 0.1em;
  padding: 0.2em 0;
}
.date-container {
  padding: 1em 0;
  background-color: 1e90ff;
  color: #ffffff;
  text-align: center;
  border-radius: 0.5em;  
}
.date-container span {
  font-size: 2.5em;
}

자바스크립트 영역은 setInterval 함수를 통해 1초씩 반복하면서 HTML 태그에 신규 값들을 interHTML로 새롭게 업데이트하였다.

const dateClock = setInterval(function dateTime(){할일}, 1000);
더보기
let dateContainer = document.querySelector(".date-container");
let clockContainer = document.querySelector(".clock-container");

const weekdays = [
  "Sunday",
  "Monday",
  "Tuesday",
  "Wednesday",
  "Thursday",
  "Friday",
  "Saturday",
];
const monthNames =[
  "January",
  "February",
  "March",
  "April",
  "May",
  "June",
  "July",
  "August",
  "September",
  "October",
  "November",
  "December",  
]; 
const dateClock = setInterval(function dateTime(){
  const today = new Date();
  let date = today.getDate();
  let day = weekdays[today.getDay()];
  let month = monthNames[today.getMonth()];
  
  let hours = today.getHours();
  let minutes = today.getMinutes();  
  
  minutes = minutes < 10 ? "0" + minutes : minutes;
  
  dateContainer.innerHTML = `<p>${day}</p><p><span>${date}</span></p><p>${month}</p>`;
  
  clockContainer.innerHTML = `${hours}:${minutes}`;   
}, 1000);

css 영역에서는 크게 어려운건 없고

.container {
  width: 21.78em;
  display: grid;
  position: absolute;
  transform: translate(-50%, -50%);
  left: 50%;
  top: 50%;
  color: #ffffff;
  align-items: center;
  grid-template-columns: 8fr 4fr;
  background-color: #1e90ff;
  boder-radius: 0.5em;    
}

위젯이 보여지는 부분 class="container" 영역의 넓이를 21.78em으로 잡고 이것을 grid로 구성을 할건데 위치는 화면전체를 기준으로 하겠다. 그리고 가로중앙정렬한 후에 글자 색상은 흰색으로 하고 세로 중앙정렬해라. width값을 8:4의 비율로 나누고 바탕은 짙은 회색으로 하고 각 모서리를 라운딩처리해라.

 

자바스크립트에서는 미리 만들어놓은 clock-container / date-container 에 자바스크립트를 통한 값을 innerHTML을 변경하는 형태로 코드가 진행된다.

html

<div class="container">
    <div class="clock-container"></div>
    <div class="date-container"></div>
  </div>
Javascript

let dateContainer = document.querySelector(".date-container");
let clockContainer = document.querySelector(".clock-container");

여기서 재밌는건 weekdays 와 monthNames 배열인데, 일요일 ~ 토요일까지 / 1월 ~ 12월까지 각 배열에 담은 후

getDay() , getMonth()가 각 해당일에 맞게 숫자를 반환하면 그것을 배열의 위치값을 찾아 반환해주게 된다. 참고로 getDay()는 일요일:=0 , 토요일:=7 이며 , getMonth()는 1월:=0 , 12월:=11 이다.

 

중간에 보면

minutes = minutes < 10 ? "0" + minutes : minutes;

이런 코드가 나오는데 이건 삼항연산자로 이항연산자로 풀이하면 minutes가 10보다 작으면 0을 붙혀서 minutes를 출력하고 그렇지 않다면 그냥 출력해라. 라는 뜻이다.

if minutes < 10 {
  minutes = "0" + minutes
}else{
  minutes = minutes;	
}

 

마지막으로, 이녀석을 출력하기 위해서 각변수의 innerHTML에 대입시키면 완성이 된다.

 dateContainer.innerHTML = `<p>${day}</p><p><span>${date}</span></p><p>${month}</p>`;
  
 clockContainer.innerHTML = `${hours}:${minutes}`;

댓글