Simple countdown powered by HTML, Javascript, and CSS. Originally made in 2013 and updated in 2017 using es6/es2015 JS, BEM methodology for CSS, and some ARIA sprinkled into the HTML.
A Pen by Nick Klauer on CodePen.
Simple countdown powered by HTML, Javascript, and CSS. Originally made in 2013 and updated in 2017 using es6/es2015 JS, BEM methodology for CSS, and some ARIA sprinkled into the HTML.
A Pen by Nick Klauer on CodePen.
<!-- 2017 Countdown - Simple JS, HTML, & CSS only --> | |
<body> | |
<div class="countdown" id="js-countdown"> | |
<h1>Lindsey Time</h1> | |
<div class="countdown__item countdown__item--large"> | |
<div class="countdown__timer js-countdown-days" aria-labelledby="day-countdown"> | |
</div> | |
<div class="countdown__label" id="day-countdown">Days</div> | |
</div> | |
<div class="countdown__item"> | |
<div class="countdown__timer js-countdown-hours" aria-labelledby="hour-countdown"> | |
</div> | |
<div class="countdown__label" id="hour-countdown">Hours</div> | |
</div> | |
<div class="countdown__item"> | |
<div class="countdown__timer js-countdown-minutes" aria-labelledby="minute-countdown"> | |
</div> | |
<div class="countdown__label" id="minute-countdown">Minutes</div> | |
</div> | |
<div class="countdown__item"> | |
<div class="countdown__timer js-countdown-seconds" aria-labelledby="second-countdown"> | |
</div> | |
<div class="countdown__label" id="second-countdown">Seconds</div> | |
</div> | |
</div> | |
</body> | |
<!-- 2013 Countdown --> | |
<!-- <body> | |
<form class="countdown" name="countDown"> | |
<input size="4" name="daysLeft" /> | |
<hr class="soft"> | |
<h3>Days</h3> | |
<hr class="soft"> | |
<span class="bottom_time"><input size="3" name="hrLeft" /></span> | |
<span class="bottom_time"><input size="3" name="minLeft" /></span> | |
<span class="bottom_time"><input size="3" name="secLeft" /></span> | |
<ul> | |
<li>Hrs</li> | |
<li>Min</li> | |
<li>Sec</li> | |
</ul> | |
</form> | |
</body> --> |
// ========================== // | |
// 2017 Countdown JS | |
// ========================== // | |
const countdown = new Date("May 7, 2020"); | |
function getRemainingTime(endtime) { | |
const milliseconds = Date.parse(endtime) - Date.parse(new Date()); | |
const seconds = Math.floor( (milliseconds/1000) % 60 ); | |
const minutes = Math.floor( (milliseconds/1000/60) % 60 ); | |
const hours = Math.floor( (milliseconds/(1000*60*60)) % 24 ); | |
const days = Math.floor( milliseconds/(1000*60*60*24) ); | |
return { | |
'total': milliseconds, | |
'seconds': seconds, | |
'minutes': minutes, | |
'hours': hours, | |
'days': days, | |
}; | |
} | |
function initClock(id, endtime) { | |
const counter = document.getElementById(id); | |
const daysItem = counter.querySelector('.js-countdown-days'); | |
const hoursItem = counter.querySelector('.js-countdown-hours'); | |
const minutesItem = counter.querySelector('.js-countdown-minutes'); | |
const secondsItem = counter.querySelector('.js-countdown-seconds'); | |
function updateClock() { | |
const time = getRemainingTime(endtime); | |
daysItem.innerHTML = time.days; | |
hoursItem.innerHTML = ('0' + time.hours).slice(-2); | |
minutesItem.innerHTML = ('0' + time.minutes).slice(-2); | |
secondsItem.innerHTML = ('0' + time.seconds).slice(-2); | |
if (time.total <= 0) { | |
clearInterval(timeinterval); | |
} | |
} | |
updateClock(); | |
const timeinterval = setInterval(updateClock, 1000); | |
} | |
initClock('js-countdown', countdown); | |
// ========================== // | |
// 2013 Countdown JS | |
// ========================== // | |
// function counter() { | |
// var today = new Date(); //variable contains current date and time | |
// var days = calcDays(today); //calculate the time left until set date below | |
// document.countDown.daysLeft.value = Math.floor(days); // displays days rounded to the next lowest integer | |
// var hours = (days - Math.floor(days)) * 24; //calculate the hours left in the current day | |
// document.countDown.hrLeft.value = Math.floor(hours); // display hours rounded to the next lowest integer | |
// var minutes = (hours - Math.floor(hours)) * 60; // calculate the minutes left in the current hour | |
// document.countDown.minLeft.value = Math.floor(minutes); // display minutes rounded to the next lowest integer | |
// var seconds = (minutes - Math.floor(minutes)) * 60; //calculate the seconds left in the current minute | |
// document.countDown.secLeft.value = Math.floor(seconds); // display seconds rounded to the next lowest integer | |
// } | |
// function calcDays(currentDate) { | |
// //create a date object for date of graduation | |
// //calculate the difference between currentDate and set date | |
// setDate = new Date("May 6, 2013"); | |
// currentTime = currentDate.getFullYear() + 1; | |
// setDate.setFullYear(currentTime); | |
// days = (setDate - currentDate) / (1000 * 60 * 60 * 24); | |
// return days; | |
// } | |
// setInterval('counter()', 1000) |
// ========================== // | |
// 2017 Countdown CSS | |
// ========================== // | |
body { | |
display: flex; | |
align-items: center; | |
min-height: 100vh; | |
text-align: center; | |
font-family: helvetica; | |
text-transform: uppercase; | |
background-image: linear-gradient( | |
165deg, | |
rgba(194, 233, 221, 0.5) 3%, | |
rgba(104, 119, 132, 0.5) 100%); | |
} | |
.countdown { | |
display: flex; | |
flex-wrap: wrap; | |
justify-content: space-between; | |
width: 75%; | |
max-width: 20rem; | |
margin: 0 auto; | |
} | |
.countdown__item { | |
display: flex; | |
flex-direction: column; | |
flex: 0 1 auto; | |
min-width: 31%; | |
margin-bottom: 1rem; | |
// Instead of a modifier one could use a pseudo-class: | |
// &:first-child { | |
// width: 100%; | |
// } | |
// &:not(:first-child) { | |
// flex: 1; | |
// } | |
} | |
.countdown__item--large { | |
flex: auto; | |
width: 100%; | |
font-size: 2.75em; | |
} | |
.countdown__timer { | |
padding: .25em; | |
background-color: white; | |
border: 1px solid black; | |
border-radius: 3px; | |
font-weight: bold; | |
font-size: 2em; | |
} | |
.countdown__label { | |
font-size: 1em; | |
padding-top: .40em; | |
.countdown__item--large & { | |
&:before, | |
&:after { | |
content: ''; | |
display: block; | |
height: 1px; | |
background-image: linear-gradient( | |
left, | |
rgba(0, 0, 0, 0), | |
rgba(0, 0, 0, .4), | |
rgba(0, 0, 0, 0)); | |
} | |
} | |
} | |
// ========================== // | |
// 2013 Countdown CSS | |
// ========================== // | |
// @import "compass/css3"; | |
// html { | |
// height: 100%; | |
// } | |
// body { | |
// display: flex; | |
// align-items: center; | |
// min-height: 100%; | |
// background-image: linear-gradient(165deg, rgba(194, 233, 221, 0.5) 3%, rgba(104, 119, 132, 0.5) 100%); | |
// text-align: center; | |
// font-family: helvetica; | |
// text-transform: uppercase; | |
// } | |
// .countdown { | |
// position: relative; | |
// top: 50%; | |
// display: block; | |
// height: auto; | |
// max-width: 35em; | |
// margin: 0 auto; | |
// input { | |
// text-transform: uppercase; | |
// text-align: center; | |
// font-family: helvetica; | |
// height: 1.25em; | |
// border: 1px solid black; | |
// font-weight: 700; | |
// font-size: 9.5rem; | |
// width: 80%; | |
// margin: 0 10px; | |
// @include border-radius(5px); | |
// } | |
// h3 { | |
// font-size: 5.0rem; | |
// font-weight: 700; | |
// letter-spacing: 5px; | |
// margin: -30px; | |
// } | |
// .bottom_time input { | |
// padding: 2.0% 4.1%; | |
// display: inline-block; | |
// height: 1em; | |
// font-weight: 500; | |
// font-size: 2.5rem; | |
// color: black; | |
// width: 15.5%; | |
// } | |
// ul { | |
// padding: 0; | |
// margin: .5em 0; | |
// li { | |
// display: inline; | |
// font-weight: 500; | |
// padding: 0 11%; | |
// } | |
// } | |
// hr.soft { | |
// height: 1px; | |
// margin: 1.5em 0; | |
// background-image: -webkit-gradient(linear, 0 0, 100% 0, from(rgba(0, 0, 0, 0)), color-stop(0.5, rgba(0, 0, 0, .4)), to(rgba(0, 0, 0, 0))); | |
// background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0), rgba(0, 0, 0, .4), rgba(0, 0, 0, 0)); | |
// background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0), rgba(0, 0, 0, .4), rgba(0, 0, 0, 0)); | |
// background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0), rgba(0, 0, 0, .4), rgba(0, 0, 0, 0)); | |
// background-image: linear-gradient(left, rgba(0, 0, 0, 0), rgba(0, 0, 0, .4), rgba(0, 0, 0, 0)); | |
// border: 0; | |
// } | |
// } |