animbase
Version:
Declarative animation engine
255 lines (175 loc) โข 7.98 kB
Markdown
# AnimBase
[](https://github.com/agusmade/animbase/actions/workflows/ci.yml)
[](https://www.npmjs.com/package/animbase)
[](https://packagephobia.com/result?p=animbase)
[](https://bundlephobia.com/package/animbase)
[](https://codecov.io/gh/agusmade/animbase)
[](https://github.com/agusmade/animbase/blob/main/LICENSE)
[](https://agusmade.github.io/animbase/)
**The declarative animation engine** โ Animate HTML elements using only `data-*` attributes. No custom JavaScript required.
### ๐ฎ Try it instantly!
No installation required. Experiment with AnimBase directly in your browser:
๐ **[Interactive Playground](https://agusmade.github.io/animbase/playground/)** (with "Download HTML" feature)
## โจ Features
- ๐ง **Fully declarative** via `data-anim-init` and `data-anim-config`
- ๐ฎ **Frame-based timeline**
- ๐จ Supports numeric values and colors
- โก Per-subvalue easing (e.g., `transform: translateY(20px.out)`, `color: #00f.out`)
- ๐ง Detects and interpolates each number or color in a single property (e.g., `box-shadow`, `filter`, `transform`, `outline`, etc.)
- ๐ฏ Multiple timeline sources (2 types):
- external-controlled (scroll, input range, other)
- triggered timer (looping or one-shot)
- ๐ Triggered animation with runtime control API
- โฐ Playback control: trigger, pause, resume, stop, seek
- ๐ Direction control with `reverse`
- โ๏ธ Play-once support with `once`
- ๐ช Hooks: `onStart` and `onFinish`
- ๐งฉ Easy to extend and integrate
## ๐ Installation
### Using NPM
```bash
npm install animbase
```
Then import manually:
```js
import AnimBase from 'animbase';
```
### Using CDN
```html
<script src="https://cdn.jsdelivr.net/npm/animbase@1.2.0/dist/animbase.iife.min.js"></script>
```
## ๐งญ Quick Start
### 1. Include the script
```html
<script src="https://cdn.jsdelivr.net/npm/animbase@1.2.0/dist/animbase.iife.min.js"></script>
```
### 2. Add animated element using one of two animation modes:
#### A. External-Controlled Animator
These use `data-anim-controller-ref` and/or `data-anim-controlled-by`.
```html
<input type="range" id="range" min="0" max="100" />
<div
data-anim-controller-ref="#range"
data-anim-controlled-by="value"
data-anim-init='{"opacity": "0"}'
data-anim-config='{"100": {"opacity": "1"}}'
></div>
<!-- Or using scrollY on window -->
<div
data-anim-controlled-by="scrollY"
data-anim-init='{"transform": "translateY(100px.out)"}'
data-anim-config='{"200": {"transform": "translateY(0px.out)"}}'
></div>
```
- `data-anim-controller-ref`: selector of the controlling element (default: `window`)
- `data-anim-controlled-by`: property to read (e.g. `value`, `scrollTop`, `scrollLeft`)
- `data-anim-listen` (optional): event to listen (e.g. `input`, `scroll`, `timeupdate`, etc.)
Default behavior:
- If only `data-anim-controller-ref` โ property defaults to `value`, listens to `input`
- If only `data-anim-controlled-by` โ target defaults to `window`, uses common scroll events
#### B. Timed Animator
```html
<!-- Config element (required once per group) -->
<div
data-anim-trigger-group="hero"
data-anim-trigger-config='{"speed": 60, "once": false, "reverse": false, "autostart": true}'
></div>
<!-- Animated element(s) -->
<div data-anim-init='{"opacity": "0"}' data-anim-config='{"100": {"opacity": "1"}}' data-anim-trigger-group="hero"></div>
<!-- Optional JS control -->
<script>
AnimBase.trigger('hero');
</script>
```
> Group config should be placed on a separate, non-animated element.
## ๐ Documentation
API reference and usage guide:
๐ [https://agusmade.github.io/animbase/docs](https://agusmade.github.io/animbase/docs)
## ๐จ Demo Gallery
Explore live demos of AnimBase in action:
๐ [https://agusmade.github.io/animbase/demo](https://agusmade.github.io/animbase/demo)
Includes coverflow, book flips, 3D cards, scroll animations, and more.
--
## ๐ Builds
AnimBase includes multiple builds:
| File | Type | Notes |
| ------------------------- | ---------- | ------------------------- |
| `animbase.esm.js` | ESM | For modern bundlers |
| `animbase.cjs.js` | CommonJS | For Node or legacy tools |
| `animbase.iife.js` | IIFE | Non-minified global build |
| `animbase.iife.min.js` | IIFE (min) | Production CDN use |
| `animbase-core-only.*.js` | Core only | Excludes auto-init logic |
> โ ๏ธ Source maps are not included in the npm package to keep it lightweight.
## ๐ง How AnimBase Works (Summary)
AnimBase lets you define powerful animations **entirely using HTML attributes** โ no JavaScript required for most cases.
It works by parsing two key attributes:
### 1. `data-anim-init`
Defines the **initial styles** of the element as a JSON string.
```html
data-anim-init='{"opacity": "0", "transform": "scale(0.5)"}'
```
### 2. `data-anim-config`
Defines a **timeline of keyframes**, where each key (frame number) maps to a style change. Values are interpolated over time.
```html
data-anim-config='{ "500": {"opacity": "1.out", "transform": "scale(1.spring)"} }'
```
### 3. `data-anim-strict` (optional)
By default, AnimBase **fails softly**: invalid JSON, colors, or easing will only warn and wonโt break the page.
Add strict mode to make errors throw (useful during development):
```html
<div data-anim-strict="true" data-anim-init='{"opacity": "0"}' data-anim-config='{"100": {"opacity": "1"}}'></div>
```
### โจ Per-Value Easing
Each variable inside a value string (e.g. `5rem.outQuad`) can have **its own easing**. AnimBase parses:
- Numbers: `100`, `50px`, `-2.5rem`, `10%`
- Colors: `#fff`, `#5bf.outBounce`
- Easing functions: `linear`, `spring`, `outQuad`, etc.
### โ๏ธ Example
```html
<div
data-anim-init='{"boxShadow": "1px -2.5rem 10% #5bf"}'
data-anim-config='{"300": {"boxShadow": "3px 5rem.in 10% #fa2.outBounce"}}'
>
AnimBase
</div>
```
Each variable animates independently with its own easing. AnimBase **matches variables by position**, so value structure must stay consistent across keyframes.
๐ Want more details? See the [full explanation here](https://agusmade.github.io/animbase/docs/how-it-works.html)
---
## ๐ช Advanced API (for `trigger-group` only)
```js
AnimBase.trigger('group'); // Start animation
AnimBase.pause('group'); // Pause
AnimBase.resume('group'); // Resume
AnimBase.stop('group'); // Stop and reset
AnimBase.seek('group', 50); // Jump to frame 50
AnimBase.setReverse('group', true); // Reverse playback
AnimBase.setOnce('group', true); // Play once only
AnimBase.setHooks('group', {
onStart: () => console.log('Started'),
onFinish: () => console.log('Finished'),
});
// Extend how properties are applied
AnimBase.registerHandlerType('dataSet', (el, key, val) => {
el.dataset[key] = val;
});
AnimBase.registerKeyHandler('dataCount', 'dataSet');
// Add element programmatically
AnimBase.getAnimator('group').addElement(domElement, {init, config});
```
## ๐ License
MIT
๐ Check out the [live demos](https://agusmade.github.io/animbase/) to see AnimBase in action, or integrate it into your next web creation!
๐ GitHub: [github.com/agusmade/animbase](https://github.com/agusmade/animbase)
๐ฆ NPM: [npmjs.com/package/animbase](https://www.npmjs.com/package/animbase)
๐ AnimBase is open-source and ready to grow with your creativity.
Contribute, suggest features, or just say hi!
Made with โค๏ธ by Agus Made