---
title: Countup
summary: A countup element is used to display numerical data in an interesting way and make the interface more interactive.
docs-libs: [countup]
description: Animate numbers with the countup component to display statistics dynamically and make dashboards more engaging.
related: [/ui/plugins/chart]
---
import Example from '@components/Example.astro';
import CodeDocs from '@components/CodeDocs.astro';
import TabsPackage from '@components/TabsPackage.astro';
import { Code } from 'astro:components';
import { site } from '@shared/lib/site.ts';
## Overview
A countup animates a number from a starting value up to its final value. Use it for statistics on a dashboard or a landing page, where the number is the point of the block.
Write the final number as the text of the element and add `data-countup`. Tabler finds every such element and animates it when it scrolls into view, so no JavaScript of your own is needed.
30000
## Installation
Install countup.js with npm:
Or include it from a CDN:
`} />
Tabler reads the library from the `countUp` global, so load the UMD build above before `tabler.js`. If you install with npm and bundle it yourself, assign it first:
```js
import * as countUp from 'countup.js';
window.countUp = countUp;
```
For options beyond the ones below, see the [countUp.js website](https://inorganik.github.io/countUp.js/).
## Usage
Add `data-countup` to any text element and write the target number inside it. The animation starts as soon as the number enters the viewport.
```html
30000
```
Pass options as JSON in the same attribute. Every option below works this way.
```html
300
```
### Duration
Set the `duration` to determine how long the animation should take. By default, the duration is set to 2 seconds, but you can modify it as you wish.
30000
30000
30000
### Starting value
By default the countup will start from zero. If you want to set a different start value use `startVal`.
You can also set the start value to be greater than the final value, so that it counts down instead of up.
To see how the starting value affects the animation, look at the example below.
30000
30000
### Decimal places
Set how many decimal numbers should be displayed using `decimalPlaces`. By default, the number of decimal places is set to 0.
3.123
3.123
3.123
3.123
### Easing
Disable easing using `"useEasing": false`. Easing is set to `true` by default, so that the animation speed changes over the course of its duration. Easing can be disabled to make the animation linear.
30000
30000
### Use grouping
Disable grouping using `"useGrouping": false`. Grouping is set to `true` by default, so that the number is displayed with a separator.
30000
30000
### Separator
You can change the default separator using `separator` and specifying the one you wish to use.
3000000
3000000
### Decimal separator
You can change the default decimal separator using `decimal` and specifying the one you wish to use.
3.12
3.12
### Prefix
Set the countup prefix using `prefix` and specifying the prefix you want to add, for instance a currency symbol.
30000
30000
### Suffix
Set the countup suffix using `suffix` and specifying the suffix you want to add, for instance a percentage symbol.
300
300
## JavaScript
Tabler automatically initializes all elements with `data-countup` on page load. This is the code that runs:
## Accessibility
- Write the final number in the HTML, as the examples do. That is what a search engine indexes, what shows without JavaScript, and what a screen reader reads if it reaches the element before the animation starts.
- Never put a countup inside an `aria-live` region. The text changes on every frame, so a live region would announce dozens of intermediate numbers.
- The number on its own says nothing. Give it a visible label next to it, or an `aria-label` on the block that holds both.
- Tabler does not check `prefers-reduced-motion`, so a countup animates even for users who asked for less motion. Skip the initialization for them:
```js
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
document.querySelectorAll('[data-countup]').forEach((el) => el.removeAttribute('data-countup'));
}
```
Run it before `tabler.js`, so the number simply stays at its final value.