728x90
카운트다운 타이머 만들기
내가 지정한 날짜만큼 카운트 다운을 해준다
d-day가 되면 d-day라는 텍스트가 뜸
HTML
<div class="container">
<div class="title">COUNT DOWN</div>
<p data-confetti="true">
D-DAY!
</p>
<div id="date">
<div id="day">
<span class="d">00</span>
<span>DAY</span>
</div>
<div id="hours">
<span class="h">00</span>
<span>HOURS</span>
</div>
<div id="minutes">
<span class="m">00</span>
<span>MINUTES</span>
</div>
<div id="seconds">
<span class="s">00</span>
<span>SECONDS</span>
</div>
</div>
<div class="time">
<input type="datetime-local" id="user-input" />
</div>
<div class="btnWrap">
<button id="start">시작</button>
<button id="stop">정지</button>
<button id="reset">재설정</button>
</div>
<div class="footer">
© 2023. <a href="https://ozcodingschool.com/" target="_blank">ozcodingschool</a>. All rights
reserved. Developed by <a href="#">[수강생이름]</a>.
</div>
</div>
CSS
@import url('https://fonts.googleapis.com/css2?family=Black+Han+Sans&family=Francois+One&family=Luckiest+Guy&family=Montserrat:wght@100;200;300;400;500;600;700;800;900&family=Nanum+Gothic&family=Noto+Sans+KR:wght@100;300;400;500;700;900&family=Playfair+Display:wght@400;500;600;700;800;900&family=Rubik+Bubbles&display=swap');
@font-face {
font-family: 'LOTTERIACHAB';
src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_2302@1.0/LOTTERIACHAB.woff2') format('woff2');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'GmarketSansMedium';
src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_2001@1.1/GmarketSansMedium.woff') format('woff');
font-weight: normal;
font-style: normal;
}
*{
margin: 0;
padding: 0;
}
a{
text-decoration: none;
}
body{
width: 100%;
background-color: rgb(26, 26, 26);
font-family: 'GmarketSansMedium';
}
.container{
width: 100%;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
.title{
font-size: 100px;
color: white;
font-family: 'LOTTERIACHAB';
font-weight: bold;
}
p{
color: white;
font-size: 30px;
display: none;
}
#date{
width: 1440px;
height: 400px;
padding: 12px;
display: flex;
justify-content: space-between;
font-family: 'LOTTERIACHAB';
}
#day,#hours,#minutes,#seconds{
width: 330px;
height: 100%;
color: white;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
}
#day{
/* background: rgba( 255, 255, 255, 0.15 ); */
box-shadow: 0 8px 32px 0 #694aff33;
backdrop-filter: blur( 4px );
-webkit-backdrop-filter: blur( 4px );
border-radius: 10px;
border: 1px solid rgba( 255, 255, 255, 0.18 );
background-color:#694aff ;
}
#hours{
box-shadow: 0 8px 32px 0 #ff80ee33;
backdrop-filter: blur( 4px );
-webkit-backdrop-filter: blur( 4px );
border-radius: 10px;
border: 1px solid rgba( 255, 255, 255, 0.18 );
background-color:#ff80ee ;
}
#minutes{
box-shadow: 0 8px 32px 0 #ff550033;
backdrop-filter: blur( 4px );
-webkit-backdrop-filter: blur( 4px );
border-radius: 10px;
border: 1px solid rgba( 255, 255, 255, 0.18 );
background-color:#ff5500 ;
}
#seconds{
box-shadow: 0 8px 32px 0 #06df7233;
backdrop-filter: blur( 4px );
-webkit-backdrop-filter: blur( 4px );
border-radius: 10px;
border: 1px solid rgba( 255, 255, 255, 0.18 );
background-color:#06df72 ;
}
.d,.h,.m,.s{
font-size: 10rem;
}
span{
font-size: 16px;
}
.btnWrap{
margin-top: 6px;
}
#start,#stop,#reset{
width: 100px;
height: 50px;
margin-left: 10px;
color: white;
cursor: pointer;
font-family: 'GmarketSansMedium';
}
#start{
box-shadow: 0 8px 32px 0 #694aff33;
backdrop-filter: blur( 4px );
-webkit-backdrop-filter: blur( 4px );
border-radius: 10px;
border: 1px solid rgba( 255, 255, 255, 0.18 );
background-color:#694aff ;
}
#stop{
box-shadow: 0 8px 32px 0 #ff80ee33;
backdrop-filter: blur( 4px );
-webkit-backdrop-filter: blur( 4px );
border-radius: 10px;
border: 1px solid rgba( 255, 255, 255, 0.18 );
background-color:#ff80ee ;
}
#reset{
box-shadow: 0 8px 32px 0 #06df7233;
backdrop-filter: blur( 4px );
-webkit-backdrop-filter: blur( 4px );
border-radius: 10px;
border: 1px solid rgba( 255, 255, 255, 0.18 );
background-color:#06df72 ;
}
#start:hover{
box-shadow: 0 8px 32px 0 #694aff33;
backdrop-filter: blur( 4px );
-webkit-backdrop-filter: blur( 4px );
border-radius: 10px;
border: 1px solid rgba( 255, 255, 255, 0.18 );
background-color:#5e42e7 ;
}
#stop:hover{
box-shadow: 0 8px 32px 0 #ff80ee33;
backdrop-filter: blur( 4px );
-webkit-backdrop-filter: blur( 4px );
border-radius: 10px;
border: 1px solid rgba( 255, 255, 255, 0.18 );
background-color:#ea75db ;
}
#reset:hover{
box-shadow: 0 8px 32px 0 #06df7233;
backdrop-filter: blur( 4px );
-webkit-backdrop-filter: blur( 4px );
border-radius: 10px;
border: 1px solid rgba( 255, 255, 255, 0.18 );
background-color:#06c968 ;
}
#user-input{
padding: 6px;
margin-bottom: 5px;
box-shadow: 0 8px 32px 0 #ff550033;
backdrop-filter: blur( 4px );
-webkit-backdrop-filter: blur( 4px );
border-radius: 10px;
border: 1px solid rgba( 255, 255, 255, 0.18 );
background-color:#ff5500 ;
color: white;
}
뭔가 달력 넘기는 느낌을 주고싶었ㄴ지만,, 그건 나의 부족으로 못함
JS
나는,, 내 코드 작성하기 바쁘지 설명을 정말 못한다,,,
let intervalId, future;
intervalId는 setInterval 함수를 제어하는 변수
future는 사용자가 입력한 시간을 저장하기 위한 변수
function updateTimer() {
const now = new Date();
const diff = future - now;
if (diff <= 0) {
document.querySelector(".d").textContent = '00';
document.querySelector(".h").textContent = '00';
document.querySelector(".m").textContent = '00';
document.querySelector(".s").textContent = '00';
document.querySelector("p").style.display = "block";
} else {
const days = Math.floor(diff / (1000 * 60 * 60 * 24));
const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
const mins = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
const secs = Math.floor((diff % (1000 * 60)) / 1000);
document.querySelector(".d").textContent = days;
document.querySelector(".h").textContent = hours;
document.querySelector(".m").textContent = mins;
document.querySelector(".s").textContent = secs;
}
}
updateTimer 함수는 현재 시간과 미래시간의 시간 차이를 계산하고 계산한 값을 일/시/분/초 단위로 화면에 표시해준다
시간차가 0이하인 경우에는 카운트 다운이 끝났음을 알리는 메세지를 보여준다
document.getElementById('start').addEventListener('click', function () {
const userInput = document.getElementById('user-input').value;
future = new Date(userInput);
intervalId = setInterval(updateTimer, 1000);
});
스타트 버튼을 클릭하면 사용자가 입력한 시간을 userInput에 저장하고 updateTimer 함수를 1초마다 호출함
document.getElementById('stop').addEventListener('click', function () {
clearInterval(intervalId);
});
스탑 버튼을 클릭하면 카운트 다운 중지
document.getElementById('reset').addEventListener('click', function () {
clearInterval(intervalId);
document.querySelector(".d").textContent = '00';
document.querySelector(".h").textContent = '00';
document.querySelector(".m").textContent = '00';
document.querySelector(".s").textContent = '00';
document.querySelector("p").style.display = "none";
});
리셋 버튼을 클릭하면 카운트 다운을 중지하고 시간을 초기화 한다.
분명 코드 작성할때는 되게 어려웠는데,,,,,,,,,,,,,, 이렇게 보니까 별거 없는듯,,, 왜지,,,,,
전체코드
let intervalId;
let future;
function updateTimer() {
const now = new Date();
const diff = future - now;
if (diff <= 0) {
document.querySelector(".d").textContent = '00';
document.querySelector(".h").textContent = '00';
document.querySelector(".m").textContent = '00';
document.querySelector(".s").textContent = '00';
document.querySelector("p").style.display = "block";
} else {
const days = Math.floor(diff / (1000 * 60 * 60 * 24));
const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
const mins = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
const secs = Math.floor((diff % (1000 * 60)) / 1000);
document.querySelector(".d").textContent = days;
document.querySelector(".h").textContent = hours;
document.querySelector(".m").textContent = mins;
document.querySelector(".s").textContent = secs;
}
}
document.getElementById('start').addEventListener('click', function () {
const userInput = document.getElementById('user-input').value;
future = new Date(userInput);
intervalId = setInterval(updateTimer, 1000);
});
document.getElementById('stop').addEventListener('click', function () {
clearInterval(intervalId);
});
document.getElementById('reset').addEventListener('click', function () {
clearInterval(intervalId);
document.querySelector(".d").textContent = '00';
document.querySelector(".h").textContent = '00';
document.querySelector(".m").textContent = '00';
document.querySelector(".s").textContent = '00';
document.querySelector("p").style.display = "none";
});
결과
'JavaScript' 카테고리의 다른 글
미니 프로젝트 - 아이스크림 퀴즈 만들기 (1) | 2024.01.22 |
---|---|
Carousel 구현하기 (1) | 2024.01.10 |