Last active
January 2, 2017 23:04
-
-
Save danieluhl/2ad9c52f157fc580eb621e1e9b5667ef to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>JS + CSS Clock</title> | |
</head> | |
<body> | |
<div class="clock"> | |
<div class="clock-face"> | |
<div class="hand hour-hand"></div> | |
<div class="hand min-hand"></div> | |
<div class="hand second-hand"></div> | |
</div> | |
</div> | |
<style> | |
html { | |
background:#018DED url(http://unsplash.it/1500/1000?image=881&blur=50); | |
background-size:cover; | |
font-family:'helvetica neue'; | |
text-align: center; | |
font-size: 10px; | |
} | |
body { | |
font-size: 2rem; | |
display:flex; | |
flex:1; | |
min-height: 100vh; | |
align-items: center; | |
} | |
.clock { | |
width: 30rem; | |
height: 30rem; | |
border:20px solid white; | |
border-radius:50%; | |
margin:50px auto; | |
position: relative; | |
padding:2rem; | |
box-shadow: | |
0 0 0 4px rgba(0,0,0,0.1), | |
inset 0 0 0 3px #EFEFEF, | |
inset 0 0 10px black, | |
0 0 10px rgba(0,0,0,0.2); | |
} | |
.clock-face { | |
position: relative; | |
width: 100%; | |
height: 100%; | |
transform: translateY(-3px); /* account for the height of the clock hands */ | |
} | |
.hand { | |
width:50%; | |
height:6px; | |
background:black; | |
position: absolute; | |
top:50%; | |
transform-origin: 100%; | |
transform: rotate(90deg); | |
transition: all 0.05s; | |
transition-timing-function: cubic-bezier(0.2, 1.85, 0.4, 1.6); | |
} | |
</style> | |
<script> | |
const partialApply = (fn, ...args) => fn.length <= args.length ? | |
fn.apply(this, args) : (...nextArgs) => | |
partialApply.call(this, fn, ...args, ...nextArgs); | |
const getDeg = (divisor, units) => ((360 / divisor) * units) + 90 | |
const setStyle = (el, deg) => el.style.transform = `rotate(${deg}deg)`; | |
// give an element, divisor, function for getting time, and the current time | |
// set the style for the element | |
const setElTime = (el, divisor, timeFn, now) => setStyle(el, getDeg(divisor, now[timeFn]())); | |
const setFunctions = [ | |
partialApply(setElTime, document.querySelector('.second-hand'), 60, 'getSeconds'), | |
partialApply(setElTime, document.querySelector('.min-hand'), 60, 'getMinutes'), | |
partialApply(setElTime, document.querySelector('.hour-hand'), 12, 'getHours'), | |
]; | |
const setTime = () => { | |
const now = new Date(); | |
setFunctions.forEach((fn) => fn(now)); | |
} | |
setInterval(setTime, 1000); | |
</script> | |
</body> | |
</html> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment