230 lines
4.6 KiB
JavaScript
230 lines
4.6 KiB
JavaScript
MorphSVGPlugin.convertToPath("polygon");
|
|
var xmlns = "http://www.w3.org/2000/svg",
|
|
xlinkns = "http://www.w3.org/1999/xlink",
|
|
select = function (s) {
|
|
return document.querySelector(s);
|
|
},
|
|
selectAll = function (s) {
|
|
return document.querySelectorAll(s);
|
|
},
|
|
pContainer = select(".pContainer"),
|
|
mainSVG = select(".mainSVG"),
|
|
star = select("#star"),
|
|
sparkle = select(".sparkle"),
|
|
tree = select("#tree"),
|
|
showParticle = true,
|
|
particleColorArray = [
|
|
"#E8F6F8",
|
|
"#ACE8F8",
|
|
"#F6FBFE",
|
|
"#A2CBDC",
|
|
"#B74551",
|
|
"#5DBA72",
|
|
"#910B28",
|
|
"#910B28",
|
|
"#446D39",
|
|
],
|
|
particleTypeArray = ["#star", "#circ", "#cross", "#heart"],
|
|
// particleTypeArray = ['#star'],
|
|
particlePool = [],
|
|
particleCount = 0,
|
|
numParticles = 201;
|
|
|
|
gsap.set("svg", {
|
|
visibility: "visible",
|
|
});
|
|
|
|
gsap.set(sparkle, {
|
|
transformOrigin: "50% 50%",
|
|
y: -100,
|
|
});
|
|
|
|
let getSVGPoints = (path) => {
|
|
let arr = [];
|
|
var rawPath = MotionPathPlugin.getRawPath(path)[0];
|
|
rawPath.forEach((el, value) => {
|
|
let obj = {};
|
|
obj.x = rawPath[value * 2];
|
|
obj.y = rawPath[value * 2 + 1];
|
|
if (value % 2) {
|
|
arr.push(obj);
|
|
}
|
|
//console.log(value)
|
|
});
|
|
|
|
return arr;
|
|
};
|
|
let treePath = getSVGPoints(".treePath");
|
|
|
|
var treeBottomPath = getSVGPoints(".treeBottomPath");
|
|
|
|
var mainTl = gsap.timeline({ delay: 0, repeat: 0 }),
|
|
starTl;
|
|
|
|
function flicker(p) {
|
|
gsap.killTweensOf(p, { opacity: true });
|
|
gsap.fromTo(
|
|
p,
|
|
{
|
|
opacity: 1,
|
|
},
|
|
{
|
|
duration: 0.07,
|
|
opacity: Math.random(),
|
|
repeat: -1,
|
|
}
|
|
);
|
|
}
|
|
|
|
function createParticles() {
|
|
var i = numParticles,
|
|
p,
|
|
particleTl,
|
|
step = numParticles / treePath.length,
|
|
pos;
|
|
while (--i > -1) {
|
|
p = select(particleTypeArray[i % particleTypeArray.length]).cloneNode(true);
|
|
mainSVG.appendChild(p);
|
|
p.setAttribute("fill", particleColorArray[i % particleColorArray.length]);
|
|
p.setAttribute("class", "particle");
|
|
particlePool.push(p);
|
|
//hide them initially
|
|
gsap.set(p, {
|
|
x: -100,
|
|
y: -100,
|
|
transformOrigin: "50% 50%",
|
|
});
|
|
}
|
|
}
|
|
|
|
var getScale = gsap.utils.random(0.5, 3, 0.001, true);
|
|
|
|
function playParticle(p) {
|
|
if (!showParticle) {
|
|
return;
|
|
}
|
|
var p = particlePool[particleCount];
|
|
gsap.set(p, {
|
|
x: gsap.getProperty(".pContainer", "x"),
|
|
y: gsap.getProperty(".pContainer", "y"),
|
|
scale: getScale(),
|
|
});
|
|
var tl = gsap.timeline();
|
|
tl.to(p, {
|
|
duration: gsap.utils.random(0.61, 6),
|
|
physics2D: {
|
|
velocity: gsap.utils.random(-23, 23),
|
|
angle: gsap.utils.random(-180, 180),
|
|
gravity: gsap.utils.random(-6, 50),
|
|
},
|
|
scale: 0,
|
|
rotation: gsap.utils.random(-123, 360),
|
|
ease: "power1",
|
|
onStart: flicker,
|
|
onStartParams: [p],
|
|
onRepeat: (p) => {
|
|
gsap.set(p, {
|
|
scale: getScale(),
|
|
});
|
|
},
|
|
onRepeatParams: [p],
|
|
});
|
|
|
|
particleCount++;
|
|
particleCount = particleCount >= numParticles ? 0 : particleCount;
|
|
}
|
|
|
|
function drawStar() {
|
|
starTl = gsap.timeline({ onUpdate: playParticle });
|
|
starTl
|
|
.to(".pContainer, .sparkle", {
|
|
duration: 6,
|
|
motionPath: {
|
|
path: ".treePath",
|
|
autoRotate: false,
|
|
},
|
|
ease: "linear",
|
|
})
|
|
.to(".pContainer, .sparkle", {
|
|
duration: 1,
|
|
onStart: function () {
|
|
showParticle = false;
|
|
},
|
|
x: treeBottomPath[0].x,
|
|
y: treeBottomPath[0].y,
|
|
})
|
|
.to(
|
|
".pContainer, .sparkle",
|
|
{
|
|
duration: 2,
|
|
onStart: function () {
|
|
showParticle = true;
|
|
},
|
|
motionPath: {
|
|
path: ".treeBottomPath",
|
|
autoRotate: false,
|
|
},
|
|
ease: "linear",
|
|
},
|
|
"-=0"
|
|
)
|
|
.from(
|
|
".treeBottomMask",
|
|
{
|
|
duration: 2,
|
|
drawSVG: "0% 0%",
|
|
stroke: "#FFF",
|
|
ease: "linear",
|
|
},
|
|
"-=2"
|
|
);
|
|
}
|
|
|
|
createParticles();
|
|
drawStar();
|
|
|
|
mainTl
|
|
.from([".treePathMask", ".treePotMask"], {
|
|
duration: 6,
|
|
drawSVG: "0% 0%",
|
|
stroke: "#FFF",
|
|
stagger: {
|
|
each: 6,
|
|
},
|
|
duration: gsap.utils.wrap([6, 1, 2]),
|
|
ease: "linear",
|
|
})
|
|
.from(
|
|
".treeStar",
|
|
{
|
|
duration: 3,
|
|
scaleY: 0,
|
|
scaleX: 0.15,
|
|
transformOrigin: "50% 50%",
|
|
ease: "elastic(1,0.5)",
|
|
},
|
|
"-=4"
|
|
)
|
|
|
|
.to(
|
|
".sparkle",
|
|
{
|
|
duration: 3,
|
|
opacity: 0,
|
|
ease: "rough({strength: 2, points: 100, template: linear, taper: both, randomize: true, clamp: false})",
|
|
},
|
|
"-=0"
|
|
)
|
|
.to(
|
|
".treeStarOutline",
|
|
{
|
|
duration: 1,
|
|
opacity: 1,
|
|
ease: "rough({strength: 2, points: 16, template: linear, taper: none, randomize: true, clamp: false})",
|
|
},
|
|
"+=1"
|
|
);
|
|
|
|
mainTl.add(starTl, 0);
|
|
gsap.globalTimeline.timeScale(1.5);
|