JSFiddle - React, Tailwind, and code Playground
HTML
<div class="d1">Single Animation</div>
<div class="d2">Composed Animation, Part 1</div>
CSS
div {
position: absolute;
background: red;
width: 160px;
height: 100px;
}
.d1 {
transition: transform 2s cubic-bezier(0.4, 0, 0.2, 1);
}
.d2 {
transition: transform 1s cubic-bezier(0.4, 0, 0.2, 1) 0s;
top: 116px
}
JavaScript
// Single Animation, 2s from 0 to 200px
var d1 = document.querySelector('.d1')
d1.style.transform = 'translateX(200px)';
// Composed Animation, Part 1, 1s from 0 to 100px
var d2 = document.querySelector('.d2');
// Get first part bezier
// cubic-bezier(0.4, 0, 0.2, 1)
var x = [0, 0.4, 0.2, 1]
var y = [0, 0, 1, 1]
function splitCubicBezier(options) {
var z = options.z,
cz = z-1,
z2 = z*z,
cz2 = cz*cz,
z3 = z2*z,
cz3 = cz2*cz,
x = options.x,
y = options.y;
var left = [
x[0],
y[0],
z*x[1] - cz*x[0],
z*y[1] - cz*y[0],
z2*x[2] - 2*z*cz*x[1] + cz2*x[0],
z2*y[2] - 2*z*cz*y[1] + cz2*y[0],
z3*x[3] - 3*z2*cz*x[2] + 3*z*cz2*x[1] - cz3*x[0],
z3*y[3] - 3*z2*cz*y[2] + 3*z*cz2*y[1] - cz3*y[0]];
var right = [
z3*x[3] - 3*z2*cz*x[2] + 3*z*cz2*x[1] - cz3*x[0],
z3*y[3] - 3*z2*cz*y[2] + 3*z*cz2*y[1] - cz3*y[0],
z2*x[3] - 2*z*cz*x[2] + cz2*x[1],
z2*y[3] - 2*z*cz*y[2] + cz2*y[1],
z*x[3] - cz*x[2],
z*y[3] - cz*y[2],
x[3],
y[3]];
if (options.fitUnitSquare) {
return {
left: left.map(function(el, i) {
if (i % 2 == 0) {
var Xmin = left[0];
var Xmax = left[6]; //should be 1
var Sx = 1 / (Xmax - Xmin);
return (el - Xmin) * Sx;
} else {
var Ymin = left[1];
var Ymax = left[7]; //should be 1
var Sy = 1 / (Ymax - Ymin);
return (el - Ymin) * Sy;
}
}),
right: right.map(function(el, i) {
if (i % 2 == 0) {
//xval
var Xmin = right[0]; //should be 0
var Xmax = right[6];
var Sx = 1 / (Xmax - Xmin);
return (el - Xmin) * Sx;
} else {
//yval
var Ymin = right[1]; //should be...