Christmas HTML
Christmas HTML
<head>
<style>
@import url('https://fonts.googleapis.com/css2?
family=Ephesis&family=Roboto:wght@500&display=swap');
body {
background-color: #151522;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
}
body,
html {
height: 100%;
width: 100%;
margin: 0;
padding: 0;
/* background:
url('https://hdwallpaperfx.com/wp-content/uploads/2023/09/iPhone-14-Pro-Christmas-
Wallpaper.jpg'); */
}
svg {
width: 90%;
height: 90%;
visibility: hidden;
.sparkle {
/* mix-blend-mode:luminosity */
}
.text {
padding: 15px 15px 15px 15px;
font-family: "Ephesis", sans-serif;
font-size: 83px;
color: #fffefe;
position: fixed;
top: calc(50% - 500px);
text-align: center;
opacity: 0;
}
.typewriter {
overflow: hidden;
/* Ensures the content is not revealed until the animation */
border-right: 2px solid white;
/* The typwriter cursor */
white-space: nowrap;
/* Keeps the content on a single line */
margin: 0 auto;
/* Gives that scrolling effect as the typing happens */
letter-spacing: .15em;
/* Adjust as needed */
animation:
typing 3.5s steps(40, end) forwards,
blink-caret .75s step-end forwards;
animation-delay: 5s;
}
.santa-claus {
animation: santa 2s forwards;
animation-delay: 6s;
width: 300px;
height: 300px;
position: fixed;
top: calc(50% + 30px);
left: calc(50% + 200px);
opacity: 0;
}
to {
width: 100%;
opacity: 1;
}
}
/* The typing effect */
@keyframes santa {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
from,
to {
border-color: transparent
}
50% {
border-color: #fff;
}
}
</style>
<body>
<svg class="mainSVG" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 800 600">
<defs>
<circle id="circ" class="particle" cx="0" cy="0" r="1" />
<polygon id="star" class="particle"
points="4.55,0 5.95,2.85 9.1,3.3 6.82,5.52 7.36,8.65 4.55,7.17
1.74,8.65 2.27,5.52 0,3.3 3.14,2.85 " />
<polygon id="cross" class="particle"
points="4,3.5 2.5,2 4,0.5 3.5,0 2,1.5 0.5,0 0,0.5 1.5,2 0,3.5 0.5,4
2,2.5 3.5,4 " />
<path id="heart" class="particle"
d="M2.9,0C2.53,0,2.2,0.18,2,0.47C1.8,0.18,1.47,0,1.1,0C0.49,0,0,0.49,0,1.1
C0,2.6,1.56,4,2,4s2-1.4,2-2.9C4,0.49,3.51,0,2.9,0z" />
<mask id="treePathMask">
<path class="treePathMask" fill="none" stroke-width="18"
stroke="#FFF" d="M252.9,447.9c0,0-30.8-21.6,33.9-44.7c64.7-23.1,46.2-37,33.9-41.6
c-12.3-4.6-59.3-11.6-42.4-28.5s114-52.4,81.7-66.2c-32.4-13.9-58.5-10.8-35.4-
29.3s66.2-101.7,70.9-115.6
c4.4-13.2,16.9-18.5,24.7,0c7.7,18.5,44.7,100.1,67.8,115.6c23.1,15.4-10.8,21.6-
26.2,24.7c-15.4,3.1-20,33.9,33.9,49.3
c53.9,15.4,47.8,40.1,27.7,44.7c-20,4.6-63.2,4.6-
27.7,32.4s98.6,21.6,61.6,60.1" />
</mask>
<mask id="treeBottomMask">
<path class="treeBottomMask" stroke="#FFF" stroke-width="8"
d="M207.5,484.1c0,0,58.5-43.1,211.1-3.1s191-16.9,191-16.9" />
</mask>
<mask id="treePotMask">
<path class="treePotMask" stroke="#FFF" stroke-width="8"
d="M374.3,502.5c0,0-
4.6,20,7.7,29.3c12.3,9.2,40.1,7.7,50.8,0s10.8-23.1,10.8-29.3" />
</mask>
<feComponentTransfer>
<feFuncR type="discrete" tableValues="0.8" />
<feFuncG type="discrete" tableValues="0.3" />
<feFuncB type="discrete" tableValues="0.2" />
<!--<feFuncA type="linear" slope="1" intercept="0" />-->
</feComponentTransfer>
<feComposite in="SourceGraphic" operator="over" />
</filter>
</defs>
<g class="whole">
<g class="pContainer"></g>
d="M374.32,502.55a48.15,48.15,0,0,0,1.24,14.35c1.15,4.52,3.29,8.64,6.49,11.35a18.5,
18.5,0,0,0,5.51,3.14,39.06,39.06,0,0,0,6.41,1.82,65.78,65.78,0,0,0,13.68,1.12,72.9,
72.9,0,0,0,13.72-1.44,44.51,44.51,0,0,0,6.46-1.85,17.75,17.75,0,0,0,5.51-
3.15,25.45,25.45,0,0,0,7.24-11.17,52,52,0,0,0,1.9-6.91c.48-2.37.83-4.8,1.18-
7.25a55.16,55.16,0,0,1,.64,7.42,40.11,40.11,0,0,1-.52,7.56,31.23,31.23,0,0,1-
2.19,7.5,24.37,24.37,0,0,1-4.46,6.79,25.16,25.16,0,0,1-6.61,5,39.72,39.72,0,0,1-
7.4,3A58.55,58.55,0,0,1,407.75,542a55,55,0,0,1-15.47-1.9,36.65,36.65,0,0,1-7.46-
3,25.3,25.3,0,0,1-6.6-5,19.63,19.63,0,0,1-2.5-3.34,21.72,21.72,0,0,1-1.79-
3.67,27.66,27.66,0,0,1-1.65-7.7,38.16,38.16,0,0,1,2-14.87Z"
fill="#cb9866" />
</g>
<path class="treeBottomPath" stroke="none" fill="none" stroke-width="8"
d="M207.5,484.1c0,0,58.5-43.1,211.1-3.1s191-16.9,191-16.9" />
<path class="treePath" fill="none" stroke="none" stroke-miterlimit="10"
d="M252.95,447.85s-30.81-21.57,33.89-44.68,46.22-37,33.89-41.6-
59.32-11.56-42.37-28.5,114-52.38,81.66-
66.25S301.48,256,324.59,237.55,390.84,135.87,395.46,122c4.41-13.24,16.95-
18.49,24.65,0s44.68,100.14,67.79,115.55-10.78,21.57-26.19,24.65-
20,33.89,33.89,49.3,47.76,40.06,27.73,44.68-63.17,4.62-
27.73,32.35,98.6,21.57,61.63,60.09" />
<path class="treeBottom" mask="url(#treeBottomMask)"
d="M207.5,484.06c7.05-5.11,15.14-8.66,23.34-
11.63a177.13,177.13,0,0,1,25.29-6.88,263.65,263.65,0,0,1,52.22-
4.49h3.28l3.28.09,6.56.19,6.55.39c2.18.13,4.37.26,6.54.48,4.35.39,8.71.74,13,1.28l6
.51.75,6.49.91c17.3,2.5,34.41,6,51.36,10.19l12.62,3.2c4.18,1,8.34,2.18,12.55,3.06,8
.38,2,16.82,3.63,25.29,5.13a353.5,353.5,0,0,0,51.17,5.47c17.11.32,34.36-.66,51-
4.7a118.55,118.55,0,0,0,24.21-8.47,84.82,84.82,0,0,0,11.11-
6.49,47.55,47.55,0,0,0,9.69-8.53,48.1,48.1,0,0,1-9,9.45,85.1,85.1,0,0,1-
10.81,7.45,116.56,116.56,0,0,1-24.23,10.24,165.66,165.66,0,0,1-
25.79,5.35,232.1,232.1,0,0,1-26.27,1.71c-8.77,0-17.55-.24-26.26-1.09-2.18-.2-
4.37-.35-6.54-.6l-6.52-.78c-4.36-.46-8.67-1.19-13-1.82-8.64-1.37-17.22-3.09-25.74-
5-4.28-.87-8.5-2-12.75-3l-12.62-3.11q-25.06-6.37-50.58-10.47a426.37,426.37,0,0,0-
51.3-5.3c-8.59-.42-17.19-.29-25.78,0a240.1,240.1,0,0,0-
25.68,2.24,186.57,186.57,0,0,0-25.27,5.19c-4.15,1.16-8.26,2.49-12.28,4.05-2,.79-
4,1.6-6,2.52A50.82,50.82,0,0,0,207.5,484.06Z"
fill="#cb9866" />
<path class="treePot" mask="url(#treePotMask)"
d="M374.32,502.55a48.15,48.15,0,0,0,1.24,14.35c1.15,4.52,3.29,8.64,6.49,11.35a18.5,
18.5,0,0,0,5.51,3.14,39.06,39.06,0,0,0,6.41,1.82,65.78,65.78,0,0,0,13.68,1.12,72.9,
72.9,0,0,0,13.72-1.44,44.51,44.51,0,0,0,6.46-1.85,17.75,17.75,0,0,0,5.51-
3.15,25.45,25.45,0,0,0,7.24-11.17,52,52,0,0,0,1.9-6.91c.48-2.37.83-4.8,1.18-
7.25a55.16,55.16,0,0,1,.64,7.42,40.11,40.11,0,0,1-.52,7.56,31.23,31.23,0,0,1-
2.19,7.5,24.37,24.37,0,0,1-4.46,6.79,25.16,25.16,0,0,1-6.61,5,39.72,39.72,0,0,1-
7.4,3A58.55,58.55,0,0,1,407.75,542a55,55,0,0,1-15.47-1.9,36.65,36.65,0,0,1-7.46-
3,25.3,25.3,0,0,1-6.6-5,19.63,19.63,0,0,1-2.5-3.34,21.72,21.72,0,0,1-1.79-
3.67,27.66,27.66,0,0,1-1.65-7.7,38.16,38.16,0,0,1,2-14.87Z"
fill="#cb9866" />
<g class="treeStar">
<path class="treeStarOutline" opacity="0"
d="M421,53.27c5,.83,10.08,1.52,15.15,2.13l3.8.45,1.9.21c.33,0,.6.06,1,.12a2.41,2.41
,0,0,1,1.27.66,2.52,2.52,0,0,1,.56,2.76,3.42,3.42,0,0,1-.78,1.07l-.66.69-
2.65,2.77c-1.78,1.83-3.54,3.68-5.35,5.48l-
2.7,2.71L429.81,75l-.69.67-.34.33,0,0h0a.14.14,0,0,0,0-.08s0-.07,0,0l0,.24.07.47.57
,3.78c.4,2.52.71,5,1.06,7.57l.94,7.59.22,1.9c0,.06,0,.19,0,.34a2.21,2.21,0,0,1,0,.4
3,2.72,2.72,0,0,1-.21.84,2.85,2.85,0,0,1-
2.65,1.75,2.57,2.57,0,0,1-.82-.14,3.12,3.12,0,0,1-.65-.3l-1.64-1-6.58-3.91-6.63-
3.81-3.34-
1.86-.42-.23-.21-.12-.14-.07a1,1,0,0,0-.59,0,1.15,1.15,0,0,0-.31.12l-.43.22-.85.44c
-2.27,1.17-4.54,2.31-6.79,3.52s-4.51,2.38-6.74,3.61l-
3.36,1.83-.84.46a3.07,3.07,0,0,1-1.28.44,2.68,2.68,0,0,1-2.84-3l.15-1,.29-1.89.57-
3.78,1.18-7.56,1.24-7.52a.13.13,0,0,0,0,.08l0,0-.1-.09-.17-.17-1.37-1.34-2.73-2.68-
10.93-10.7-.34-.33a4,4,0,0,1-.64-.84,3.63,3.63,0,0,1-.43-2.12,3.68,3.68,0,0,1,2.64-
3.17l.52-.11.25,0,.47-.06.95-.12,1.9-.25,7.58-
1,7.6-.9,1.9-.23.95-.11c.24,0,.11,0,.09,0l-.09.05-.07.08,0,0,.09-.16.46-.84.91-
1.68c2.41-4.5,4.95-8.92,7.51-13.34l1-
1.66.48-.83.24-.41.13-.23a3.49,3.49,0,0,1,.22-.33,2.66,2.66,0,0,1,2.83-.9,2.52,2.52
,0,0,1,1.26.84,2.85,2.85,0,0,1,.37.62l.18.44q1.45,3.54,3,7.06c1,2.36,2,4.68,3.06,7,
.51,1.17,1.06,2.32,1.59,3.48l.8,1.74a2.12,2.12,0,0,0,.45.75A1.42,1.42,0,0,0,421,53.
27Zm-.06.39a1.82,1.82,0,0,1-1-.46,2.52,2.52,0,0,1-.56-.86l-.84-1.72c-.56-1.14-1.11-
2.3-1.69-3.43-1.17-2.27-2.29-4.56-3.5-6.81s-2.39-4.51-3.6-
6.76l-.23-.42a.8.8,0,0,0-.14-.18.58.58,0,0,0-.33-.15.56.56,0,0,0-.57.28L407,36.48c-
2.09,4.66-4.2,9.31-6.45,13.88l-.83,1.72-.42.86-.13.27a3.57,3.57,0,0,1-
2,1.67,4.26,4.26,0,0,1-.84.18l-.95.13-1.89.27L386,56.53l-7.58,1-
3.49.44a.45.45,0,0,0,.34-.4.51.51,0,0,0-.07-.28s-.06-.08-.07-.08l.33.34,10.65,11,2.
66,2.75,1.33,1.37.4.42a3.41,3.41,0,0,1,.53.84,3.36,3.36,0,0,1,.24,1.95c-.53,2.56-
1,5-
1.57,7.52L388,90.85l-.83,3.73-.42,1.87-.2.9a.5.5,0,0,0,0,.3.58.58,0,0,0,.52.37,6.28
,6.28,0,0,0,1.38-.58l3.46-1.62q3.47-1.61,6.9-3.3c2.3-1.1,4.57-2.26,6.85-
3.39l.86-.43.43-.21a2.55,2.55,0,0,1,.57-.22,2.21,2.21,0,0,1,1.29.08l.29.13.21.11.42
.23,3.37,1.81,6.8,3.51,6.85,3.41,1.71.85c.19.09.15.07.22.08a.25.25,0,0,0,.12,0,.42.
42,0,0,0,.21-.1.33.33,0,0,0,.1-.19.2.2,0,0,0,0-.09.1.1,0,0,0,0,0l0-.13L428.74,96l-
1.42-7.52c-.43-2.51-.9-5-1.29-7.54l-.6-
3.78-.08-.47,0-.24a3.75,3.75,0,0,1,0-.45,3.37,3.37,0,0,1,.52-
1.9,3.33,3.33,0,0,1,.3-.4,3.73,3.73,0,0,1,.3-.3l.35-.32.7-.65,2.81-2.59,2.86-
2.54c1.9-1.71,3.84-3.36,5.77-5l2.91-2.49a12.91,12.91,0,0,0,1.15-
1,.7.7,0,0,0-.06-.79.73.73,0,0,0-.37-.26c-.23-.06-.6-.13-.89-.2l-
1.87-.4L436,56.39C431,55.39,426,54.45,420.95,53.66Z"
fill="#FFFCF9" />
<path
d="M408.12,83.45l-17.78,8.94,3.72-19.55-14-14.15,19.74-
2.5,9.13-17.68,8.48,18L437,59.73l-14.5,13.63,3,19.67Z"
fill="#C89568" />
</g>
<circle class="sparkle" fill="url(#dotGrad)" cx="0" cy="0" r="50" />
</g>
</svg>
<h1 class="text typewriter">Merry Christmas</h1>
<script src="https://unpkg.co/gsap@3/dist/gsap.min.js"></script>
<script
src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/16327/MorphSVGPlugin3.min.js"></
script>
<script
src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/16327/DrawSVGPlugin3.min.js"></
script>
<script
src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/16327/MotionPathPlugin.min.js"></
script>
<script
src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/16327/Physics2DPlugin3.min.js"></
script>
<script
src="https://s3-us-west-2.amazonaws.com/s.cdpn.io/16327/EasePack3.min.js"></script>
<script>
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 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'),
treeBottomPath = getSVGPoints('.treeBottomPath'),
mainTl = gsap.timeline({ delay: 0, repeat: 0 }),
starTl;
function flicker(p) {
function createParticles() {
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%'
})
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);
</script>
<script
src="https://unpkg.com/@dotlottie/player-component@latest/dist/dotlottie-
player.mjs" type="module"></script>
</html>