I\'m trying to do a pure HTML/CSS countdown animation but I\'m struggling to make it work smoothly. For now I\'m only covering minutes and seconds. Notice that I\'m using
This is due to the percentage values of the keyframes. You are using 16%
while it should be 16.6667%
(100/6
) to be more exact and accurate, same thing with the others values.
When using 360s
or 3600s
as a duration you will have a clear difference between 16%
and 16.6667%
thus the state will change earlier and you will have the synchronisation issue. You may not notice this when using 6s
as duration with the seconds.
@keyframes tick6 {
0% { margin-top: 0; } /* 0*(100/6) */
16.6667% { margin-top: -2rem; } /* 1*(100/6) */
33.3333% { margin-top: -4rem; } /* 2*(100/6) */
50% { margin-top: -6rem; } /* 3*(100/6) */
66.6667% { margin-top: -8rem; } /* 4*(100/6) */
83.3333% { margin-top: -10rem; } /* 5*(100/6) */
100% { margin-top: -12rem; } /* 6*(100/6) */
}
@keyframes tick10 {
0% { margin-top: 0; }
10% { margin-top: -2rem; }
20% { margin-top: -4rem; }
30% { margin-top: -6rem; }
40% { margin-top: -8rem; }
50% { margin-top: -10rem; }
60% { margin-top: -12rem; }
70% { margin-top: -14rem; }
80% { margin-top: -16rem; }
90% { margin-top: -18rem; }
100% { margin-top: -20rem; }
}
body {
background-color: black;
}
.container {
background-color: white;
}
.digit {
display: inline-block;
height: 2rem;
overflow: hidden;
width: 1ch;
}
.digit span {
display: block;
height: 2rem;
width: 100%;
}
.minutes-digit-one {
animation: tick6 360s infinite step-end;
/*animation-delay: -54s;*/
}
.minutes-digit-two {
animation: tick10 60s infinite step-end;
/*animation-delay: -54s;*/
}
.seconds-digit-one {
animation: tick6 6s infinite step-end;
/*animation-delay: -54s;*/
}
.seconds-digit-two {
animation: tick10 1s infinite step-end;
}
<div class="container">
<div class="digit">
<span class="minutes-digit-one">5</span>
<span>4</span>
<span>3</span>
<span>2</span>
<span>1</span>
<span>0</span>
<span>5</span>
</div>
<div class="digit">
<span class="minutes-digit-two">9</span>
<span>8</span>
<span>7</span>
<span>6</span>
<span>5</span>
<span>4</span>
<span>3</span>
<span>2</span>
<span>1</span>
<span>0</span>
<span>9</span>
</div>
<div class="digit">
<span>:</span>
</div>
<div class="digit">
<span class="seconds-digit-one">5</span>
<span>4</span>
<span>3</span>
<span>2</span>
<span>1</span>
<span>0</span>
<span>5</span>
</div>
<div class="digit">
<span class="seconds-digit-two">9</span>
<span>8</span>
<span>7</span>
<span>6</span>
<span>5</span>
<span>4</span>
<span>3</span>
<span>2</span>
<span>1</span>
<span>0</span>
<span>9</span>
</div>
</div>