svg(version='1.1', xmlns='http://www.w3.org/2000/svg', xmlns:xlink='http://www.w3.org/1999/xlink', x="0px", y="0px", style="display: none;")
symbol#wave
path(d='M420,20c21.5-0.4,38.8-2.5,51.1-4.5c13.4-2.2,26.5-5.2,27.3-5.4C514,6.5,518,4.7,528.5,2.7\c7.1-1.3,17.9-2.8,31.5-2.7c0,0,0,0,0,0v20H420z')
path(d='M420,20c-21.5-0.4-38.8-2.5-51.1-4.5c-13.4-2.2-26.5-5.2-27.3-5.4C326,6.5,322,4.7,311.5,2.7\C304.3,1.4,293.6-0.1,280,0c0,0,0,0,0,0v20H420z')
path(d='M140,20c21.5-0.4,38.8-2.5,51.1-4.5c13.4-2.2,26.5-5.2,27.3-5.4C234,6.5,238,4.7,248.5,2.7\c7.1-1.3,17.9-2.8,31.5-2.7c0,0,0,0,0,0v20H140z')
path(d='M140,20c-21.5-0.4-38.8-2.5-51.1-4.5c-13.4-2.2-26.5-5.2-27.3-5.4C46,6.5,42,4.7,31.5,2.7\C24.3,1.4,13.6-0.1,0,0c0,0,0,0,0,0l0,20H140z')
.page#page
.tracker
.tracker__inner#tracker
.tracker__item 12:08
.tracker__item 15:10
.tracker__item.tracker__item_active 16:58
.percent
.percent__inner
.percent__num#count 50
.percent__sign %
button.button#button
| Drink
.water#water
svg.water__wave.water__wave_back(viewBox="0 0 560 20")
use(xlink:href="#wave")
svg.water__wave.water__wave_front(viewBox="0 0 560 20")
use(xlink:href="#wave")
.water__inner
.bubble.bubble_1
.bubble.bubble_2
.bubble.bubble_3
View Compiled
@use postcss-simple-vars;
@use postcss-nested;
*, *:before, *:after {
box-sizing: border-box;
outline: none;
}
body {
background: #f0f6fc;
font: 14px/1 'Open Sans', helvetica, sans-serif;
font-smoothing: antialiased;
}
.page {
height: 480px;
width: 280px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: #1e384c;
border-radius: 6px;
overflow: hidden;
&_animated {
.button {
&:before {
animation: button-shadow .25s;
}
}
.bubble {
&_1 {
animation: bubble-1 .75s linear -.3s;
}
&_2 {
animation: bubble-2 .75s linear;
}
&_3 {
animation: bubble-3 .75s linear;
}
}
}
}
.button {
z-index: 15;
position: absolute;
width: 50%;
bottom: 8%;
left: 25%;
color: #fff;
border: 2px solid #fff;
border-radius: 1.5rem;
text-align: center;
text-transform: uppercase;
font-size: 1.2rem;
padding: .7rem 0;
background: none;
font-weight: 600;
cursor: pointer;
&:before {
content: '';
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
opacity: 0;
border: inherit;
border-radius: inherit;
}
}
.percent {
color: #fff;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
text-align: center;
font-weight: lighter;
z-index: 10;
display: flex;
align-items: center;
justify-content: center;
&__inner {
display: inline-block;
}
&__num {
display: inline-block;
font-size: 6rem;
}
&__sign {
display: inline-block;
font-size: 4rem;
}
}
.water {
position: absolute;
height: 100%;
width: 100%;
z-index: 5;
bottom: 0;
left: 0;
background: #32bafa;
transform: translate(0, 50%);
&__inner {
position: absolute;
width: 100%;
height: 50%;
top: 0;
left: 0;
overflow: hidden;
}
&__wave {
width: 200%;
position: absolute;
bottom: 100%;
&_back {
right: 0;
fill: #2c7fbe;
animation: wave-back 1.4s infinite linear;
}
&_front {
left: 0;
fill: #32bafa;
margin-bottom: -1px;
animation: wave-front .7s infinite linear;
}
}
}
.bubble {
position: absolute;
bottom: 80px;
left: 50%;
width: 20px;
height: 20px;
margin-left: -10px;
background: #fff;
border-radius: 50%;
transform: scale(0) translate(0, 0);
opacity: 0;
&_2 {
margin-left: -20px;
}
}
@keyframes wave-front {
100% {
transform: translate(-50%, 0);
}
}
@keyframes wave-back {
100% {
transform: translate(50%, 0);
}
}
@keyframes button-shadow {
0% {
opacity: 1;
transform: scale(1);
}
100% {
opacity: 0;
transform: scale(1.6);
}
}
@keyframes bubble-1 {
0% {
opacity: 1;
transform: scale(0) translate(0, 0);
}
25% {
transform: scale(.25) translate(20px, -25px);
}
50% {
transform: scale(.5) translate(40px, -50px);
}
75% {
transform: scale(.75) translate(20px, -75px);
}
100% {
transform: scale(1) translate(10px, -100px);
}
}
.tracker {
position: absolute;
top: 10%;
left: 0;
width: 100%;
color: #fff;
text-align: center;
height: 74px;
overflow: hidden;
z-index: 20;
&__inner {
transition: transform .2s ease-in-out;
}
&__item {
transition: opacity .2s ease-in-out;
font-size: 1.1rem;
padding-bottom: 10px;
opacity: .7;
&_active {
opacity: 1;
}
}
}
@keyframes bubble-2 {
0% {
opacity: 1;
transform: scale(0) translate(-20px, -10px);
}
25% {
transform: scale(.25) translate(-40px, -45px);
}
50% {
transform: scale(.5) translate(-60px, -70px);
}
75% {
transform: scale(.75) translate(-40px, -95px);
}
100% {
transform: scale(1) translate(-30px, -100px);
}
}
@keyframes bubble-3 {
0% {
opacity: 1;
transform: scale(0) translate(0, 0);
}
25% {
transform: scale(.25) translate(0, -20px);
}
50% {
transform: scale(.5) translate(-10px, -40px);
}
75% {
transform: scale(.75) translate(10px, -60px);
}
100% {
transform: scale(1) translate(0, -100px);
}
}
View Compiled
var btn = document.getElementById('button'),
tracker = document.getElementById('tracker'),
trackerOffset = 0,
page = document.getElementById('page'),
water = document.getElementById('water'),
cnt = document.getElementById('count'),
percent = cnt.innerHTML,
random, diff, interval, isInProgress;
btn.addEventListener('click', update);
function update() {
if (isInProgress) return;
btn.removeEventListener('click', update);
isInProgress = true;
page.classList.add('page_animated');
setTimeout(function(){
page.classList.remove('page_animated');
}, 1000);
rotateTracker();
random = parseInt(Math.random() * 100);
diff = percent - random;
random = Math.abs(random);
interval = setInterval(function(){
if (diff === 0 || percent === random) {
btn.addEventListener('click', update);
clearInterval(interval);
isInProgress = false;
return;
}
if (diff < 0) {
percent++;
} else {
percent--;
}
cnt.innerHTML = percent;
water.style.transform = 'translate(0, ' + (100 - percent) + '%)';
water.querySelector('.water__inner').style.height = percent + '%';
isInProgress = false;
}, 16);
}
function getTime() {
var time = new Date(Math.random() * 1000000000000),
hours = time.getHours(),
minutes = time.getMinutes();
if (hours < 10) hours = '0' + hours
if (minutes < 10) minutes = '0' + minutes
time = hours + ':' + minutes;
return time;
}
function rotateTracker() {
var time = getTime(),
firstElem = tracker.firstElementChild,
computedStyle = getComputedStyle(firstElem),
step = computedStyle.height,
node = document.createElement('div');
node.className = 'tracker__item tracker__item_active';
node.innerHTML = time;
tracker.querySelector('.tracker__item_active').className = 'tracker__item';
trackerOffset = trackerOffset - parseInt(step);
console.log(trackerOffset);
tracker.style.transform = 'translate( 0, ' + trackerOffset + 'px)';
tracker.appendChild(node);
}
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.