Skip to content

Instantly share code, notes, and snippets.

@winkey728
Last active July 20, 2023 09:04
Show Gist options
  • Save winkey728/bbade92d6cc72e619c1cfa04299bce9c to your computer and use it in GitHub Desktop.
Save winkey728/bbade92d6cc72e619c1cfa04299bce9c to your computer and use it in GitHub Desktop.
Beautiful clock
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<title>Concentricity</title>
<link rel="stylesheet" href="style.css">
</head>
<body class="terra">
<svg id="clock" viewBox="0 0 512 512" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<style>
text { font-family: 'Helvetica Bold', 'Helvetica', sans-serif; font-weight: bold; }
</style>
</svg>
<script src="https://cdn.bootcdn.net/ajax/libs/snap.svg/0.4.1/snap.svg-min.js"></script>
<script src="index.js"></script>
<div style="position: absolute; bottom: 0; left: 0;">
<a href="https://beian.miit.gov.cn/" target="_blank">粤ICP备2021021303号-1</a>
</div>
</body>
</html>
var c = Snap("#clock"),
i;
var c1 = c.circle(256, 256, 255).addClass("f1");
var c2 = c.circle(256, 192, 192).addClass("f2");
var c3 = c.circle(256, 128, 129).addClass("f1");
var c4 = c.circle(256, 64, 66).addClass("f2");
var fontOff = 16;
var fontAttr = { textAnchor: "middle", fontSize: 48 };
var hourCoord = { x: 256, y: 512 - 256 - 64 + fontOff };
var hourDisplay = c
.text(hourCoord.x, hourCoord.y, "06")
.addClass("f2")
.attr(fontAttr);
var hour = c.g(c3, c4, hourDisplay);
hourCoord.txt = "," + hourCoord.x + "," + hourCoord.y - fontOff;
hourDisplay.transform("r" + 90 + hourCoord.txt);
var minuteCoord = { x: 256, y: 512 - 128 - 64 + fontOff };
var minuteDisplay = c
.text(minuteCoord.x, minuteCoord.y, "23")
.addClass("f1")
.attr(fontAttr);
var minute = c.g(c2, hour, minuteDisplay);
minuteCoord.txt = "," + minuteCoord.x + "," + minuteCoord.y - fontOff;
minuteDisplay.transform("r" + 90 + minuteCoord.txt);
var secondCoord = { x: 256, y: 512 - 64 + fontOff };
var secondDisplay = c
.text(secondCoord.x, secondCoord.y, "48")
.addClass("f2")
.attr(fontAttr);
var second = c.g(c1, minute, secondDisplay);
secondCoord.txt = "," + secondCoord.x + "," + secondCoord.y - fontOff;
secondDisplay.transform("r" + 90 + secondCoord.txt);
// Drawing
var delta,
lastSecond,
last = new Date();
function draw() {
var now = new Date();
delta = (now.getTime() - last.getTime()) / 1000;
last = now;
// Get Times
var h = now.getHours();
var m = now.getMinutes();
var s = now.getSeconds();
var ms = now.getMilliseconds();
// Progress
var prog = { ms: ms / 1000 },
p,
target;
prog.s = (s + prog.ms) / 60;
prog.m = (m + prog.s) / 60;
prog.h = (h + prog.m) / 12;
var sa = prog.s * 360;
var ma = prog.m * 360;
var ha = prog.h * 360 - ma;
ma = ma - sa;
second.transform("r" + sa + ",256,256");
minute.transform("r" + ma + ",256,192");
hour.transform("r" + ha + ",256,128");
window.requestAnimationFrame(draw);
function updateTimes(s, m, h) {
function pad(num) {
var str = num.toString();
return str.length > 1 ? str : "0" + str;
}
secondDisplay.node.innerHTML = pad(s);
minuteDisplay.node.innerHTML = pad(m);
hourDisplay.node.innerHTML = pad(h);
secondDisplay.transform("r" + (s < 30 ? -90 : 90) + secondCoord.txt);
minuteDisplay.transform("r" + (m < 30 ? -90 : 90) + minuteCoord.txt);
hourDisplay.transform("r" + (h % 12 < 6 ? -90 : 90) + hourCoord.txt);
}
if (s !== lastSecond) {
updateTimes(s, m, h);
}
lastSecond = s;
}
draw();
html,
body,
div,
span,
applet,
object,
iframe,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
abbr,
acronym,
address,
big,
cite,
code,
del,
dfn,
em,
img,
ins,
kbd,
q,
s,
samp,
small,
strike,
strong,
sub,
sup,
tt,
var,
b,
u,
i,
center,
dl,
dt,
dd,
ol,
ul,
li,
fieldset,
form,
label,
legend,
table,
caption,
tbody,
tfoot,
thead,
tr,
th,
td,
article,
aside,
canvas,
details,
embed,
figure,
figcaption,
footer,
header,
hgroup,
menu,
nav,
output,
ruby,
section,
summary,
time,
mark,
audio,
video {
margin: 0;
padding: 0;
border: 0;
font: inherit;
font-size: 100%;
vertical-align: baseline;
}
html {
line-height: 1;
}
ol,
ul {
list-style: none;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
caption,
th,
td {
text-align: left;
font-weight: normal;
vertical-align: middle;
}
q,
blockquote {
quotes: none;
}
q:before,
q:after,
blockquote:before,
blockquote:after {
content: "";
content: none;
}
a img {
border: none;
}
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
menu,
nav,
section,
summary {
display: block;
}
svg {
position: absolute;
width: 80vh;
height: 80vh;
max-width: 80vw;
max-height: 80vw;
top: 50%;
left: 50%;
-moz-transform: translate3d(-50%, -50%, 0px);
-ms-transform: translate3d(-50%, -50%, 0px);
-webkit-transform: translate3d(-50%, -50%, 0px);
transform: translate3d(-50%, -50%, 0px);
}
* {
-webkit-font-smoothing: antialiased;
-webkit-font-feature-settings: "tnum";
-moz-font-feature-settings: "tnum";
-ms-font-feature-settings: "tnum";
-moz-backface-visibility: hidden;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
stroke-width: 0;
}
body {
background: #f3f6f7;
}
body .f1 {
fill: #181f22;
}
body .f2 {
fill: #f3f6f7;
}
body.frog {
background: #181f22;
}
body.frog .f1 {
fill: #0ef998;
}
body.frog .s1 {
stroke: #0ef998;
}
body.frog .f2 {
fill: #181f22;
}
body.frog .s2 {
stroke: #181f22;
}
body.sol {
background: #181f22;
}
body.sol .f1 {
fill: #f90e5a;
}
body.sol .s1 {
stroke: #f90e5a;
}
body.sol .f2 {
fill: #181f22;
}
body.sol .s2 {
stroke: #181f22;
}
body.wasp {
background: #181f22;
}
body.wasp .f1 {
fill: #fff532;
}
body.wasp .s1 {
stroke: #fff532;
}
body.wasp .f2 {
fill: #181f22;
}
body.wasp .s2 {
stroke: #181f22;
}
body.terra {
background: #e76054;
}
body.terra .f1 {
fill: #ecf1cc;
}
body.terra .s1 {
stroke: #ecf1cc;
}
body.terra .f2 {
fill: #e76054;
}
body.terra .s2 {
stroke: #e76054;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment