--- 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.