15 CSS Number Counter Animations
Uptime SLA Monitor
Stark white industrial card with corner tick marks and JetBrains Mono throughout. Uptime counts from 99.000% up to 99.997% with satisfying precision. Thirty incident-history bars scale up sequentially, color-coded green and yellow. Built for status pages and infrastructure dashboards.
Uptime SLA Monitor the 6th of 15 designs in the 15 CSS Number Counter Animations collection. The design pairs CSS styling with a small amount of JavaScript for interactivity. Copy the HTML, CSS and JavaScript panels below into your project — the JS is self-contained, has zero dependencies, and is safe to drop into any framework (React, Vue, Svelte, plain HTML). The design honours prefers-reduced-motion and uses real semantic markup, so it ships accessibility-ready out of the box.
Live preview
The code
<div class="cnc-up">
<div class="cnc-up-block">
<div class="cnc-up-status-row">
<span class="cnc-up-status-id">SYS-MONITOR / API</span>
<span class="cnc-up-status-badge"><div class="cnc-up-badge-dot"></div>Operational</span>
</div>
<div class="cnc-up-uptime-wrap">
<div class="cnc-up-uptime-num"><span class="cnc-up-uptime" data-target="99.997">99.000</span><span class="cnc-up-uptime-suffix">%</span></div>
</div>
<div class="cnc-up-uptime-label">Uptime · Rolling 90 Days</div>
<hr class="cnc-up-hr">
<div class="cnc-up-bars-label">Daily incident history · 30 days</div>
<div class="cnc-up-bars">
<div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 1 · OK"></div><div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 2 · OK"></div>
<div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 3 · OK"></div><div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 4 · OK"></div>
<div class="cnc-up-bar cnc-up-bar-warn" data-tip="May 5 · Degraded"></div><div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 6 · OK"></div>
<div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 7 · OK"></div><div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 8 · OK"></div>
<div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 9 · OK"></div><div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 10 · OK"></div>
<div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 11 · OK"></div><div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 12 · OK"></div>
<div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 13 · OK"></div><div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 14 · OK"></div>
<div class="cnc-up-bar cnc-up-bar-warn" data-tip="May 15 · Degraded"></div><div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 16 · OK"></div>
<div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 17 · OK"></div><div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 18 · OK"></div>
<div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 19 · OK"></div><div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 20 · OK"></div>
<div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 21 · OK"></div><div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 22 · OK"></div>
<div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 23 · OK"></div><div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 24 · OK"></div>
<div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 25 · OK"></div><div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 26 · OK"></div>
<div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 27 · OK"></div><div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 28 · OK"></div>
<div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 29 · OK"></div><div class="cnc-up-bar cnc-up-bar-ok" data-tip="May 30 · OK"></div>
</div>
<div class="cnc-up-bars-sub"><span>30 days ago</span><span>Today</span></div>
<div class="cnc-up-footer">
<div class="cnc-up-foot-item"><span class="cnc-up-foot-label">Incidents</span><span class="cnc-up-foot-val">2</span></div>
<div class="cnc-up-foot-item"><span class="cnc-up-foot-label">Avg Response</span><span class="cnc-up-foot-val"><span class="cnc-up-resp" data-target="142">0</span>ms</span></div>
<div class="cnc-up-foot-item"><span class="cnc-up-foot-label">SLA Target</span><span class="cnc-up-foot-val">99.9%</span></div>
</div>
</div>
</div> .cnc-up { display: grid; place-items: center; padding: 32px 16px; background: #f4f4f0; font-family: 'JetBrains Mono', monospace; }
.cnc-up *, .cnc-up *::before, .cnc-up *::after { box-sizing: border-box; }
.cnc-up-block { width: 420px; border: 1px solid #d8d8d0; background: #fff; padding: 48px 44px; position: relative; }
.cnc-up-block::before { content: ''; position: absolute; top: 0; left: 0; width: 12px; height: 12px; border-top: 2px solid #111; border-left: 2px solid #111; }
.cnc-up-block::after { content: ''; position: absolute; bottom: 0; right: 0; width: 12px; height: 12px; border-bottom: 2px solid #111; border-right: 2px solid #111; }
.cnc-up-status-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 40px; opacity: 0; animation: cnc-up-in 0.4s ease 0.0s forwards; }
.cnc-up-status-id { font-size: 9px; letter-spacing: 3px; color: #aaa; text-transform: uppercase; }
.cnc-up-status-badge { font-size: 9px; letter-spacing: 3px; text-transform: uppercase; color: #16a34a; display: flex; align-items: center; gap: 6px; }
.cnc-up-badge-dot { width: 6px; height: 6px; background: #16a34a; border-radius: 50%; box-shadow: 0 0 0 0 rgba(22,163,74,0.4); animation: cnc-up-ping 2s ease-out infinite; }
@keyframes cnc-up-ping { 0% { box-shadow: 0 0 0 0 rgba(22,163,74,0.4); } 70% { box-shadow: 0 0 0 7px rgba(22,163,74,0); } 100% { box-shadow: 0 0 0 0 rgba(22,163,74,0); } }
.cnc-up-uptime-wrap { opacity: 0; animation: cnc-up-in 0.6s cubic-bezier(0.22,1,0.36,1) 0.15s forwards; margin-bottom: 6px; }
.cnc-up-uptime-num { font-size: clamp(72px, 14vw, 100px); font-weight: 700; color: #111; letter-spacing: -3px; line-height: 1; display: flex; align-items: baseline; }
.cnc-up-uptime-suffix { font-size: 0.3em; font-weight: 100; color: #bbb; letter-spacing: 0; margin-left: 2px; }
.cnc-up-uptime-label { font-size: 9px; letter-spacing: 4px; text-transform: uppercase; color: #bbb; font-weight: 100; margin-bottom: 36px; opacity: 0; animation: cnc-up-in 0.4s ease 0.25s forwards; }
.cnc-up-hr { border: none; border-top: 1px solid #ebebeb; margin: 0 0 28px; opacity: 0; animation: cnc-up-in 0.3s ease 0.3s forwards; }
.cnc-up-bars-label { font-size: 8px; letter-spacing: 3px; text-transform: uppercase; color: #bbb; margin-bottom: 12px; opacity: 0; animation: cnc-up-in 0.3s ease 0.35s forwards; }
.cnc-up-bars { display: flex; gap: 3px; align-items: flex-end; height: 32px; margin-bottom: 8px; opacity: 0; animation: cnc-up-in 0.4s ease 0.4s forwards; }
.cnc-up-bar { flex: 1; background: #eee; border-radius: 1px; position: relative; cursor: default; transform: scaleY(0); transform-origin: bottom; animation: cnc-up-barRise 0.5s ease forwards; }
.cnc-up-bar-ok { background: #d1fae5; }
.cnc-up-bar-warn { background: #fef3c7; }
.cnc-up-bar:hover::after { content: attr(data-tip); position: absolute; bottom: calc(100% + 6px); left: 50%; transform: translateX(-50%); background: #111; color: #fff; font-size: 8px; padding: 3px 7px; white-space: nowrap; letter-spacing: 1px; pointer-events: none; }
.cnc-up-bar:nth-child(1) { animation-delay: 0.42s; height: 100%; }
.cnc-up-bar:nth-child(2) { animation-delay: 0.44s; height: 100%; }
.cnc-up-bar:nth-child(3) { animation-delay: 0.46s; height: 100%; }
.cnc-up-bar:nth-child(4) { animation-delay: 0.48s; height: 100%; }
.cnc-up-bar:nth-child(5) { animation-delay: 0.50s; height: 40%; }
.cnc-up-bar:nth-child(6) { animation-delay: 0.52s; height: 100%; }
.cnc-up-bar:nth-child(7) { animation-delay: 0.54s; height: 100%; }
.cnc-up-bar:nth-child(8) { animation-delay: 0.56s; height: 100%; }
.cnc-up-bar:nth-child(9) { animation-delay: 0.58s; height: 100%; }
.cnc-up-bar:nth-child(10) { animation-delay: 0.60s; height: 100%; }
.cnc-up-bar:nth-child(11) { animation-delay: 0.62s; height: 100%; }
.cnc-up-bar:nth-child(12) { animation-delay: 0.64s; height: 100%; }
.cnc-up-bar:nth-child(13) { animation-delay: 0.66s; height: 100%; }
.cnc-up-bar:nth-child(14) { animation-delay: 0.68s; height: 100%; }
.cnc-up-bar:nth-child(15) { animation-delay: 0.70s; height: 70%; }
.cnc-up-bar:nth-child(16) { animation-delay: 0.72s; height: 100%; }
.cnc-up-bar:nth-child(17) { animation-delay: 0.74s; height: 100%; }
.cnc-up-bar:nth-child(18) { animation-delay: 0.76s; height: 100%; }
.cnc-up-bar:nth-child(19) { animation-delay: 0.78s; height: 100%; }
.cnc-up-bar:nth-child(20) { animation-delay: 0.80s; height: 100%; }
.cnc-up-bar:nth-child(21) { animation-delay: 0.82s; height: 100%; }
.cnc-up-bar:nth-child(22) { animation-delay: 0.84s; height: 100%; }
.cnc-up-bar:nth-child(23) { animation-delay: 0.86s; height: 100%; }
.cnc-up-bar:nth-child(24) { animation-delay: 0.88s; height: 100%; }
.cnc-up-bar:nth-child(25) { animation-delay: 0.90s; height: 100%; }
.cnc-up-bar:nth-child(26) { animation-delay: 0.92s; height: 100%; }
.cnc-up-bar:nth-child(27) { animation-delay: 0.94s; height: 100%; }
.cnc-up-bar:nth-child(28) { animation-delay: 0.96s; height: 100%; }
.cnc-up-bar:nth-child(29) { animation-delay: 0.98s; height: 100%; }
.cnc-up-bar:nth-child(30) { animation-delay: 1.00s; height: 100%; }
@keyframes cnc-up-barRise { to { transform: scaleY(1); } }
.cnc-up-bars-sub { display: flex; justify-content: space-between; font-size: 8px; letter-spacing: 2px; color: #ccc; opacity: 0; animation: cnc-up-in 0.3s ease 0.5s forwards; }
.cnc-up-footer { display: flex; justify-content: space-between; margin-top: 28px; opacity: 0; animation: cnc-up-in 0.4s ease 0.55s forwards; }
.cnc-up-foot-item { display: flex; flex-direction: column; gap: 4px; }
.cnc-up-foot-label { font-size: 8px; letter-spacing: 3px; text-transform: uppercase; color: #ccc; }
.cnc-up-foot-val { font-size: 18px; font-weight: 700; color: #111; letter-spacing: -0.5px; }
@keyframes cnc-up-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }
@media (prefers-reduced-motion: reduce) {
.cnc-up-status-row, .cnc-up-uptime-wrap, .cnc-up-uptime-label, .cnc-up-hr, .cnc-up-bars-label, .cnc-up-bars, .cnc-up-bars-sub, .cnc-up-footer, .cnc-up-bar, .cnc-up-badge-dot { animation: none; opacity: 1; transform: none; }
} (function () {
var root = document.querySelector('.cnc-up');
if (!root) return;
function ease(t) { return 1 - Math.pow(1 - t, 4); }
setTimeout(function () {
var el = root.querySelector('.cnc-up-uptime');
var target = parseFloat(el.dataset.target);
var start = performance.now(), dur = 1800;
function tick(now) {
var t = Math.min((now - start) / dur, 1);
el.textContent = Math.min(99 + ease(t) * (target - 99), target).toFixed(3);
if (t < 1) requestAnimationFrame(tick);
}
requestAnimationFrame(tick);
}, 400);
setTimeout(function () {
var el = root.querySelector('.cnc-up-resp');
var target = parseFloat(el.dataset.target);
var start = performance.now(), dur = 1400;
function tick(now) {
var t = Math.min((now - start) / dur, 1);
el.textContent = Math.round(ease(t) * target);
if (t < 1) requestAnimationFrame(tick);
}
requestAnimationFrame(tick);
}, 600);
})();