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/animate
lets 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, includingdisplay
andvisibility
.
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:
Animation
instances come from theAnimation
class of the Web Animations API. TheAnimation
class 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 keyframes
are 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
Animate
sees thekeyframes
property, it ignores all other css properties, in situations whereAnimate
sees 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
Animate
is 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.