|
$accent: #1B53F1; |
|
|
|
*, *:before, *:after { |
|
box-sizing: border-box; |
|
position: relative; |
|
} |
|
|
|
body, html { |
|
height: 100%; |
|
width: 100%; |
|
margin: 0; |
|
padding: 0; |
|
overflow: hidden; |
|
} |
|
|
|
html { font-size: 62.5%; } |
|
|
|
body { |
|
display: flex; |
|
justify-content: center; |
|
align-items: center; |
|
color: white; |
|
background-color: black; |
|
} |
|
@import url('https://fonts.googleapis.com/css?family=Oswald'); |
|
|
|
#speedometer { |
|
font-family: 'Oswald', sans-serif; |
|
width: 80vmin; |
|
height: 80vmin; |
|
display: flex; |
|
flex-direction: column; |
|
justify-content: center; |
|
align-items: center; |
|
--progress: 0; |
|
background: radial-gradient( |
|
transparent 68%, |
|
#3C4042 70%, |
|
transparent 76% |
|
); |
|
border-top: solid .5vmin #3C4042; |
|
border-radius: 50%; |
|
} |
|
|
|
|
|
#speed { |
|
font-size: 20vmin; |
|
height: 20vmin; |
|
width: 25vmin; |
|
--delta: calc(var(--speed, 0) - var(--prev-speed, 0)); |
|
|
|
line-height: 1; |
|
|
|
&:before, &:after { |
|
content: ''; |
|
position: absolute; |
|
top: 0; |
|
left: 0; |
|
width: 100%; |
|
height: 100%; |
|
text-align: center; |
|
} |
|
|
|
&:before { |
|
content: attr(data-speed); |
|
} |
|
} |
|
|
|
.speed-instructions { |
|
text-align: center; |
|
line-height: 1.6; |
|
margin-bottom: -3em; |
|
max-width: 25%; |
|
font-size: 2vmin; |
|
> * { display: block; } |
|
em { font-style: normal; font-size: 0.8em; } |
|
small { font-size: 0.6em; font-family: monospace; } |
|
} |
|
|
|
#range { display: none; } |
|
|
|
.speed-needle { |
|
height: 50%; |
|
width: 4px; |
|
margin: -2px; |
|
position: absolute; |
|
left: 50%; |
|
top: 50%; |
|
transform-origin: top center; |
|
transform: scaleY(1.2) rotate(calc(var(--progress, 0) * 1turn)); |
|
|
|
border-radius: 50%; |
|
background: radial-gradient( #FFF, $accent, transparent 85%); |
|
background-size: 100% 60%; |
|
background-position: center 90%; |
|
background-repeat: no-repeat; |
|
|
|
&:after { |
|
mix-blend-mode: overlay; |
|
content: ''; |
|
height: 45%; |
|
width: 100%; |
|
position: absolute; |
|
bottom: 12%; |
|
left: 0; |
|
box-shadow: 0 0 4rem 1rem rgba(white, 0.2); |
|
z-index: 1; |
|
} |
|
} |
|
|
|
|
|
.speed-glow { |
|
position: absolute; |
|
top: 0; right: 0; bottom: 0; left: 0; |
|
width: 85%; |
|
height: 85%; |
|
margin: auto; |
|
transform: rotate(calc(var(--progress, 0) * 1turn)); |
|
|
|
//background: radial-gradient(transparent 60%, $accent 61%, transparent 69%); |
|
border-radius: 50%; |
|
filter: blur(0.75vw); |
|
border-bottom: solid 2vw $accent; |
|
|
|
&:before { |
|
content: ''; |
|
display: block; |
|
position: absolute; |
|
top: 0; right: 0; bottom: 0; left: 0; |
|
margin: auto; |
|
border: inherit; |
|
border-radius: inherit; |
|
border-style: dashed; |
|
// border-color: #FFF; |
|
border-color: lighten($accent,10%); |
|
opacity: 0.3; |
|
// mix-blend-mode: screen; |
|
animation: speed-glow-wobble 5s linear infinite; |
|
|
|
animation-duration: calc( ( 1 - var(--progress)) * 3s ); |
|
@keyframes speed-glow-wobble { |
|
33% { transform: scale(1.04); } |
|
66% { |
|
transform: scale(0.99); |
|
} |
|
} |
|
} |
|
} |
|
|
|
.speed-glow.inner { |
|
width: 70%; |
|
height: 70%; |
|
transition: transform 0.15s linear; |
|
} |
|
.speed-glow.outer { |
|
//background: radial-gradient(transparent 58%, $accent 63%, transparent 69%); |
|
transition: transform 0.3s linear; |
|
|
|
&:before { |
|
animation-delay: -2.5s; |
|
} |
|
} |
|
|
|
|
|
/* ////////////////////////////////////////////////////////////////////////// */ |
|
|
|
.speed-ticks, |
|
.speed-bg, |
|
.speed-bg__steady, |
|
.speed-bg__pulse { |
|
position: absolute; |
|
top: 0; right: 0; bottom: 0; left: 0; |
|
margin: auto; |
|
width: 85%; |
|
height: 85%; |
|
// border: solid 1px red; |
|
border-radius: 50%; |
|
overflow: hidden; |
|
} |
|
|
|
.speed-ticks { |
|
width: 90%; |
|
height: 90%; |
|
stroke: hsla(228, 50, 80, .8); |
|
stroke-dasharray: .3 1.85; |
|
stroke-width: 2; |
|
fill: none; |
|
} |
|
|
|
.speed-bg__pulse { |
|
background: radial-gradient(transparent 30%, $accent, transparent 60%); |
|
animation: bg-pulse 5s linear infinite; |
|
animation-duration: calc( 1s + (( 1 - var(--progress)) * 4s) ); |
|
|
|
@keyframes bg-pulse { |
|
0%, 60% { opacity: 0; transform: scale(0.8); } |
|
80% { opacity: 1; } |
|
100% { opacity: 0; transform: scale(1.4); } |
|
} |
|
} |
|
|
|
.speed-bg__steady { |
|
&, |
|
&:before, |
|
&:after { |
|
display: block; |
|
position: absolute; |
|
top: 0; right: 0; bottom: 0; left: 0; |
|
margin: auto; |
|
width: 100%; |
|
height: 100%; |
|
} |
|
|
|
&:before, |
|
&:after { |
|
content: ''; |
|
font-size: 3.5vw; |
|
word-wrap: break-word; |
|
line-height: 0.5; |
|
font-family: monospace; |
|
content: '......................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................'; |
|
background: radial-gradient(transparent 30%, $accent, transparent 60%); |
|
background-clip: text; |
|
-webkit-background-clip: text; |
|
color: transparent; |
|
|
|
animation: bg-spin 20s linear infinite; |
|
|
|
animation-duration: calc( |
|
15s + |
|
(( 1 - var(--progress)) * 5s ) |
|
); |
|
|
|
@keyframes bg-spin { |
|
50% { |
|
transform: rotate(180deg) scale(0.9); |
|
} |
|
100% { |
|
transform: rotate(360deg) scale(1); |
|
} |
|
} |
|
} |
|
|
|
&:after { |
|
width: 90%; |
|
height: 90%; |
|
//animation-delay: -5s; |
|
} |
|
} |
|
|