API Documentation
Animations
// Animate the fill color of an SVG circle
animate(ASTRO_ESCAPED_LEFT_CURLY_BRACKET
target: "circle",
fill: ["#80f", "#fc0"],
});
@okikio/animate creates animations by creating instances of the Animate class (a class that acts as a wrapper around the Web Animation API).
To create new instances of the Animate class, you can either import the Animate class and do this, new Animate(ASTRO_ESCAPED_LEFT_CURLY_BRACKET ... }) or import the animate (lowercase) method and do this, animate(ASTRO_ESCAPED_LEFT_CURLY_BRACKET ... }). The animate method creates new instances of the Animate class and passes the options it recieves as arguments to the Animate class.
import ASTRO_ESCAPED_LEFT_CURLY_BRACKET Animate, animate } from "@okikio/animate";
new Animate(ASTRO_ESCAPED_LEFT_CURLY_BRACKET
target: [/* ... */],
duration: 2000,
// ...
});
// or
animate(ASTRO_ESCAPED_LEFT_CURLY_BRACKET
target: [/* ... */],
duration: 2000,
// ...
});
Info:
@okikio/animatelets you animate HTML and SVG elements with any CSS property that is animatable, you might be surprised to learn many CSS properties fall under this perview, includingdisplayandvisibility.
The Animate class recieves a set of targets to animate, it then creates a list of Animation instances corrosponding to the respective target elements. In order to determine when all target animations are complete, the Animate class also creates a main Animation instance. The main Animation instance plays for the total duration of all target animations, and alerts the user when all target animations have completed.
Target animations are stored in Animate.prototype.animations: WeakMap<KeyframeEffect, Animation>, using their KeyframeEffect as the key, while the the main animation is stored in Animate.prototype.mainAnimation: Animation. You can actually access the animation for a specific target using Animate.prototype.getAnimation(target: HTMLElement): Animation, meaning you aren’t limited by what @okikio/animate provides, you can use the WAAPI api’s you know and love directly.
Note:
Animationinstances come from theAnimationclass of the Web Animations API. TheAnimationclass represents a single animation player and provides playback controls and a timeline for an animation node or source, Read more…
Each property you animate needs an array defining the start and end values, or an Array of keyframes.
Info:
Implicit to/from keyframesare now supported in all evergreen browsers, In newer browser versions, you are able to set a beginning or end state for an animation only (i.e. a single keyframe), and the browser will infer the other end of the animation if it is able to. Read more…
animate(ASTRO_ESCAPED_LEFT_CURLY_BRACKET
target: ".div",
transform: ["translate(0px)", "translate(1000px)"],
});
// Or
animate(ASTRO_ESCAPED_LEFT_CURLY_BRACKET
target: ".div",
// This is the same as ["translate(0px)", "translate(100px)"]
keyframes: [
ASTRO_ESCAPED_LEFT_CURLY_BRACKET transform: "translate(0px)" },
ASTRO_ESCAPED_LEFT_CURLY_BRACKET transform: "translate(100px)" },
],
});
Note: you can only use one of these formats for an animation, and if
Animatesees thekeyframesproperty, it ignores all other css properties, in situations whereAnimatesees the keyframes property it will still accept animation properties likeeasing,duration, etc…
These value arrays can optionally be returned by an animation option method that takes the index of each element, the total number of elements, and each specific element, just like with other properties.
// First element translates by 100px, second element by 200px, etc.
animate(ASTRO_ESCAPED_LEFT_CURLY_BRACKET
target: ".div",
transform(index) ASTRO_ESCAPED_LEFT_CURLY_BRACKET
return ["translate(0px)", `translate(${(index + 1) * 100}px)`];
},
});
// Or
// Same as above
animate(ASTRO_ESCAPED_LEFT_CURLY_BRACKET
target: ".div",
keyframes(index) ASTRO_ESCAPED_LEFT_CURLY_BRACKET
return [
ASTRO_ESCAPED_LEFT_CURLY_BRACKET transform: "translate(0px)" },
ASTRO_ESCAPED_LEFT_CURLY_BRACKET transform: `translate(${(index + 1) * 100}px)` },
];
},
});
Animation Options
Animate supports many options ranging from target to fillMode, etc…, I highly suggest looking through the options offered as many of the features of @okikio/animate are unlocked when you know the options, and properly understand their quirks and abilities.
Animation Options & CSS Properties as Methods
All options & properties except target, targets, autoplay, extend, onfinish, and options can be represented by a method with the arguments (index: number, total: number, element: HTMLElement)…
Transformable CSS Properties
By default WAAPI only supports string values with the unit specified for CSS properties to be animated, however, this is generally a bad Developer Experience, so, @okikio/animate does some computations on the given Animation Options, allowing you to use single value unitless numbers, strings, and arrays, as well as removing the need for the transform CSS property, as it exposes all the transform functions as CSS properties.
Animation Progress and the requestAnimationFrame
The Web Animation API doesn’t allow for keeping track of the progress in a clean way, so, we are forced to use requestAnimationFrame to check the current progress of an animation, however, doing, so, can actually decrease framerates, so, I built a system to call requestAnimationFrame less often. If you listen for the update event on an Animate instance, you can get access to this custom framerate requestAnimationFrame, so, something like this,
import ASTRO_ESCAPED_LEFT_CURLY_BRACKET animate, Animate } from "@okikio/animate";
let animation = animate(ASTRO_ESCAPED_LEFT_CURLY_BRACKET /* ... */ });
// By default the "update" event will only run at 60 fps
animation.on("update", () => ASTRO_ESCAPED_LEFT_CURLY_BRACKET
console.log("update")
});
// You can change the framerate by setting it using
Animate.FRAME_RATE = 30; // 30 fps
Promises and Promise-Like
new Animate() is promise-like meaning it has then, catch, and finally methods, but Animate itself isn’t a Promise (this is important to keep in mind when dealing with async/await asynchronous animations). Animate’s then resolves once all animations are complete. The promise resolves to an Array with the Animate instance being the only element.
Since Animate relies on native promises, you can benefit from all the usual features promises
provide, such as Promise.all, Promise.race, and especially async/await which makes animation timelines easy to set up.
An interesting quirk of Promises is that even though
Animateis not a Promise, async/await still work with it because it has athen, andcatch.
Read through the promises doc to learn how to chain animations using promises.
Events
There are 8 events in total, they are:
- “update”
- “play”
- “pause”
- “begin”
- “finish”
- “cancel”
- “error”
- “stop”
- “playstate-change”
The events themselves are fairly self explanitory, but to listen for said events you do this,
animation.on("play", () => ASTRO_ESCAPED_LEFT_CURLY_BRACKET
// Do something
})
@okikio/animate uses @okikio/emitter, read through both @okikio/emitter’s doc and the events doc to properly learn how events work.
Custom Easing
Custom Easing is extra complex especially while using WAAPI, and ensuring great performance, but @okikio/animate is able to do it. The basic idea is to generate most of the numbers required for the custom easing, and then using WAAPI’s ability to linearly interpolate between numbers to do the rest. You can use custom easing like this,
import ASTRO_ESCAPED_LEFT_CURLY_BRACKET animate, CustomEasing } from "@okikio/animate";
animate(ASTRO_ESCAPED_LEFT_CURLY_BRACKET
translateX: CustomEasing([0, 250], ASTRO_ESCAPED_LEFT_CURLY_BRACKET
easing: "spring(5, 100, 10, 1)",
// You can change the size of Array for the CustomEasing function to generate
numPoints: 200,
// The number of decimal places to round, final values in the generated Array
decimal: 5,
}),
easing: "linear"
})
Check out a demo of Custom Easing on Codepen →
This technique has some benefits and drawbacks, you can learn all about these on the custom easing doc.
Destroyable Animate
Remove elements and animations from the DOM when the .stop() method is called. Read more on the Destroyable Animate docs
AnimateAttributes & tweenAttr
Create morphing animations using the tweenAttr method, read more on the animate attributes doc.
Effects
Use pre-made effects in @okikio/animate, for example, the animate.css effects can be used via @shoelace-style/animations, read the effects doc, to learn more.
Stagger and Random
Queue Class
Methods & properties
Read through the methods and properties doc, to learn some of the most useful and importent methods and properties of Animate class.
Complete API Documentation
Not all available methods and properties are listed here (otherwise this README would be too long), go through the API documentation for the full documented API.