MagicalScroll.getInstance().addElement({
target: "#scroll",
animations: {
opacity: {
positions: [0, 100],
values: [0, 1],
},
},
});
Slug
Description
#screenWidth
width of the screen
#screenHeight
height of the screen
#scrollWidth
width of the scroll container
#scrollHeight
height of the scroll container
#elementWidth
width of the element
#elementHeight
height of the element
#elementIn
when the element appear at the bottom of the container
#elementOut
when the element disappear at the top of the container
#elementCenter
when the element is placed center of the container
#parentElementWidth
width of the parent element (node)
#parentElementHeight
height of the parent element (node)
#parentElementIn
when the parent element (node) appear at the bottom of the container
#parentElementOut
when the parent element (node) disappear at the top of the container
#parentElementCenter
when the parent element (node) is placed center of the container
#ancestorElementWidth{1}
width of the ancestor element (node), where {1} means the generation(s)
#ancestorElementHeight{1}
height of the ancestor element (node), where {1} means the generation(s)
#ancestorElementIn{1}
when the ancestor element (node) appear at the bottom of the container, where {1} means the generation(s)
#ancestorElementOut{1}
when the ancestor element (node) disappear at the top of the container, where {1} means the generation(s)
#ancestorElementCenter{1}
when the ancestor element (node) is placed center of the container, where {1} means the generation(s)
Name
Description
opacity
scale
rotate
translateX
translateY
display
none or just nothing
visibility
visible or hidden
backgroundColor
calculating within values
color
calculating within values
Register/Replace your own property
Register/Replace the value populating callback
const magicalScroll = MagicalScroll.getInstance();
const animationName = "myScrollAnimation";
magicalScroll.registerPropertyPopulateCallback(
animationName,
(currentPosition, positions, values) => {
const index = positions.findIndex((position) => position > currentPosition);
return index > -1 ? values[index] : values[values.length - 1];
},
);
Explanation
Name
Meaning
currentPosition
current scroll top of the container
positions
list of position which are already computed as a number
values
list of value
You can also register a new animation with existed built-in callback
const magicalScroll = MagicalScroll.getInstance();
const animationName = "opacity";
magicalScroll.registerPropertyPopulateCallback(
animationName,
MagicalScroll.populateNumberValueCallback,
);
Register/Replace the CSS generation callback
const magicalScroll = MagicalScroll.getInstance();
const animationName = "myScrollAnimation";
magicalScroll.registerPropertyPopulateCallback(
animationName,
(target, property, value) => {
target.style.display = value ? null : "none";
}
);
Explanation
Name
Meaning
target
element target
property
name of the property, animationName as the example above
value
computed value
Provide other properties something like skew, brightness.
Interaction Observer API for better performance.
Support multiple instances.
Child slug.
Query for element.
Function of toggling class by position.
Inertia?
Animation function (ease-in-out, ... etc.) support.
Refactor it into better architecture.
Matrix calculation.