Geavanceerd animatiesysteem voor het creëren van dynamische, procedurele en op expressies gebaseerde animaties die verder gaan dan eenvoudige keyframes.
Het animatiesysteem ondersteunt verschillende types naast traditionele keyframes:
Deze geavanceerde animaties worden gedefinieerd in de animations array-eigenschap van elementen.
Node-animaties (animations array):
Keyframes (keyframes array):
Wanneer meerdere animatiemethoden hetzelfde eigenschap doelwit zijn:
| Eigenschap | Type | Vereist | Voorbeeld | Waardenbereik | Omschrijving |
|---|---|---|---|---|---|
| type | string | true | - | expression | procedural | sequence | path | Het type animatie. |
| enabled | boolean | false | - | - | Of de animatie actief is. |
| target | string | true | - | - | Het eigenschapspad om te animeren (bijv. "x", "rotation", "scaleX"). |
| startTime | number | false | - | - | Starttijd van de animatie relatief aan het begin van het element, in seconden. |
| duration | number | false | - | - | Duur van de animatie in seconden. Voor herhalende animaties is dit de herhalingsperiode. |
| loop | boolean | false | - | - | Of de animatie herhaalt. |
| blendMode | string | false | - | replace | add | multiply | Hoe deze animatie combineert met andere: vervangen (overschrijven), toevoegen (som), vermenigvuldigen (schaal). |
| blendWeight | number | false | - | - | De sterkte/invloed van deze animatie (0-1). Gebruikt voor het mengen van meerdere animaties. |
Expressies zijn JavaScript-code die per frame wordt geëvalueerd, met toegang tot animatiecontextvariabelen.
{
time: number; // Huidige absolute tijd (seconden)
localTime: number; // Tijd ten opzichte van het begin van het element
duration: number; // Duur van het element
progress: number; // Genormaliseerde voortgang (0-1)
index: number; // Elementindex in de groep
total: number; // Totaal aantal elementen in de groep
fps: number; // Frames per seconde
width: number; // Canvasbreedte
height: number; // Canvashoogte
value: any; // Huidige eigenschapswaarde
}Bounce-animatie met behulp van Math-functies:
{
"id": "element-1",
"type": "Image",
"start": 0,
"duration": 5,
"animations": [
{
"type": "expression",
"target": "y",
"enabled": true,
"expression": "100 + Math.abs(Math.sin(localTime * 3)) * 200",
"startTime": 0,
"duration": 5,
"loop": true
}
]
}
Combineer meerdere effecten:
{
"animations": [
{
"type": "expression",
"target": "rotation",
"expression": "(localTime * 2 * Math.PI / duration) + Math.sin(localTime * 4) * 0.1",
"loop": true
},
{
"type": "expression",
"target": "scaleX",
"expression": "1 + Math.sin(localTime * 5) * 0.2",
"loop": true
}
]
}
Ingebouwde animatiepatronen met configureerbare parameters.
{
"animations": [
{
"type": "procedural",
"proceduralType": "wiggle",
"target": "rotation",
"enabled": true,
"frequency": 2,
"amplitude": 0.1,
"loop": true
}
]
}
Stapgebaseerde animaties die waarden op specifieke intervallen veranderen.
| Eigenschap | Type | Vereist | Voorbeeld | Waardenbereik | Omschrijving |
|---|---|---|---|---|---|
| values | array | true | - | - | Array van waarden om doorheen te stappen. |
| stepDuration | number | true | - | - | Duur van elke stap in seconden. |
| loop | boolean | false | - | - | Of de sequentie moet herhalen. |
Tekst die door verschillende groottes cycled:
{
"animations": [
{
"type": "sequence",
"target": "fontSize",
"enabled": true,
"values": [24, 32, 40, 32, 24],
"stepDuration": 0.5,
"loop": true
}
]
}
Animeer elementen langs Bezier-krommingen.
| Eigenschap | Type | Vereist | Voorbeeld | Waardenbereik | Omschrijving |
|---|---|---|---|---|---|
| path | string | array | true | - | - | SVG-padgegevens (d-attribuut) of array van padpunten. |
| autoRotate | boolean | false | - | - | Of het element automatisch moet draaien om de padtangens te volgen. |
| duration | number | true | - | - | Tijd om het volledige pad te voltooien. |
Circulaire beweging:
{
"animations": [
{
"type": "path",
"target": "position",
"enabled": true,
"path": "M 100,100 a 200,200 0 1,1 0,1 Z",
"autoRotate": true,
"duration": 4,
"loop": true
}
]
}
De target eigenschap gebruikt puntnotatie om geneste eigenschappen aan te geven:
"x", "y", "rotation""scale.x", "position.y""colors[0]", "points[2].x"{
"target": "x" // De x-positie van het element
"target": "scaleX" // Horizontale schaling
"target": "alpha" // Opacity
"target": "fill.color" // Opvulkleur (als fill een object is)
"target": "points[0].x" // X-coördinaat van het eerste punt
}Beheer hoe animaties combineren wanneer meerdere hetzelfde eigenschap doelwit zijn:
{
"blendMode": "replace",
"blendWeight": 1.0
}Vervangt volledig de eigenschapswaarde.
{
"blendMode": "add",
"blendWeight": 0.5
}Voegt toe aan de bestaande waarde (gewogen). Nuttig voor het accumuleren van offsetwaarden.
{
"blendMode": "multiply",
"blendWeight": 1.0
}Vermenigvuldigt de bestaande waarde. Nuttig voor schaaleffecten.
Het combineren van verschillende animatietypen:
{
"id": "animated-element",
"type": "Shape",
"animations": [
{
"type": "expression",
"target": "x",
"expression": "width / 2 + Math.sin(localTime * 2) * 300",
"blendMode": "replace",
"loop": true
},
{
"type": "procedural",
"proceduralType": "wiggle",
"target": "rotation",
"frequency": 3,
"amplitude": 0.2,
"blendMode": "add",
"blendWeight": 0.5
},
{
"type": "sequence",
"target": "alpha",
"values": [1, 0.8, 1],
"stepDuration": 0.3,
"loop": true,
"blendMode": "multiply"
}
],
"keyframes": [
{
"id": "kf-1",
"time": 0,
"stateObj": { "scaleX": 1 }
},
{
"id": "kf-2",
"time": 2,
"stateObj": { "scaleX": 1.5 }
}
]
}
In dit voorbeeld:
startTime en duration zijn relatief aan de start tijd van het elementlocalTime in expressies begint bij 0 wanneer het element begintduration grens van het elementenabled: truetarget eigenschap bestaat op het elementstartTime ligt binnen de duur van het element{
"type": "expression",
"target": "x",
"expression": "value + (targetX - value) * 0.1"
}{
"type": "expression",
"target": "scaleY",
"expression": "1 + Math.exp(-localTime * 3) * Math.cos(localTime * 8) * 0.5"
}{
"type": "procedural",
"proceduralType": "wiggle",
"target": "x",
"frequency": 10,
"amplitude": 5
}{
"type": "expression",
"target": "alpha",
"expression": "Math.max(0, Math.min(1, (localTime - index * 0.1) * 2))"
}