<div id="container">
<div id="text-container">
<h1>Happy Thanksgiving</h1>
<h2><span>20</span><span>24</span></h2>
</div>
<div id="sun-container">
<svg viewBox="0 0 150 145" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="inner-sun" fill-rule="evenodd">
<circle id="sun" cx="61" cy="82" r="61"></circle>
<circle class="dot" cx="10" cy="19" r="3"></circle>
<circle class="dot" cx="148.5" cy="1.5" r="1.5"></circle>
<circle class="dot" cx="95" cy="144" r="1"></circle>
</g>
</svg>
</div>
<div id="rays-container" data-depth='0.5'>
<svg viewBox="0 0 404 229" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="rays" fill-rule="evenodd">
<line x1="31" y1="226" x2="3" y2="217" class="ray"></line>
<line x1="54" y1="184" x2="17" y2="147" class="ray"></line>
<line x1="114" y1="155" x2="59" y2="60" class="ray"></line>
<line x1="173" y1="137" x2="145" y2="3" class="ray"></line>
<line x1="231" y1="137" x2="259" y2="3" class="ray"></line>
<line x1="290" y1="155" x2="345" y2="60" class="ray"></line>
<line x1="350" y1="184" x2="387" y2="147" class="ray"></line>
<line x1="373" y1="226" x2="401" y2="217" class="ray"></line>
</g>
</svg>
</div>
<div id="turkey-container" data-depth='0.5'>
<svg viewBox="0 0 172 186" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="turkey" fill-rule="evenodd">
<path d="M167.206001,70.3765841 C167.206001,40.3765841 132.206001,44.3765841 132.206001,64.3765841 C132.206001,84.3765841 157.206001,84.3765841 157.206001,116.376584 C157.206001,148.376584 124.206001,153.376584 115.206001,148.376584" id="neck"></path>
<path d="M118.206001,133.376584 C118.206001,153.376584 95.2060007,173.376584 51.2060007,166.376584 C77.2060007,150.376584 77.2060007,143.376584 80.2060007,130.376584" id="wing"></path>
<line x1="108.206001" y1="155.376584" x2="108.206001" y2="181.376584" id="leg1"></line>
<line x1="88.2060007" y1="165.376584" x2="88.2060007" y2="181.376584" id="leg2"></line>
<path d="M75.2060007,145.376584 C58.2060007,159.376584 29.2060007,142.376584 29.2060007,103.376584 C29.2060007,64.3765841 59.2060007,46.3765841 63.2060007,44.3765841 C75.2060007,48.3765841 81.2060007,63.3765841 81.2060007,71.3765841" id="tail"></path>
<path d="M57.2060007,87.3765841 C68.539334,74.7099174 82.539334,69.3765841 99.2060007,71.3765841 C115.872667,73.3765841 127.872667,82.3765841 135.206001,98.3765841" id="back"></path>
<path d="M111.348958,72.982222 C119.139287,43.9083194 101.885541,14.0239553 72.8116387,6.23362654 C43.737736,-1.55670219 13.8533719,15.6970435 6.06304317,44.7709461 C-0.148643244,67.9532754 9.56221456,91.6508807 28.491812,104.252432" id="feather"></path>
</g>
</svg>
</div>
<div id="leaf-container">
<svg viewBox="0 0 141 73" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="leaf" fill-rule="evenodd">
<path d="M137,10 C114.866666,29.3333333 92.533333,39 70,39 C47.466667,39 24.8000003,29.3333333 2,10" id="stem"></path>
<path d="M114,27 C99.3333333,35 95,46.3333333 101,61 C117,56.3333333 121.333333,45 114,27 Z"></path>
<path d="M113.612903,27 C98.9462366,35 94.6129032,46.3333333 100.612903,61 C116.612903,56.3333333 120.946237,45 113.612903,27 Z"></path>
<path d="M114,27 C107.333333,12.3333333 97,8.33333333 83,15 C87,28.3333333 97.3333333,32.3333333 114,27 Z"></path>
<path d="M76.2997601,38.1183854 C59.4332534,40.0394618 51.6666667,48.6666667 53,64 C68.3333333,65.3333333 76.09992,56.7061285 76.2997601,38.1183854 Z"></path>
<path d="M76.65867,38.2633944 C75.0253544,21.6368075 66.2861342,13.219667 50.4410096,13.0119729 C48.4850009,29.5634625 57.224221,37.980603 76.65867,38.2633944 Z"></path>
<path d="M39.3648737,32.3926122 C20.4549579,30.1308707 9.55644378,35.4642198 6.66933133,48.3926594 C21.5536496,55.8916492 32.4521637,50.5583001 39.3648737,32.3926122 Z"></path>
<path d="M39.6479783,32.6566116 C45.2159928,16.8855372 40.3333333,6.66666667 25,2 C19,16.6666667 23.8826594,26.8855372 39.6479783,32.6566116 Z"></path>
</g>
<circle class="dot" cx="9.5" cy="2.5" r="2.5"></circle>
<circle class="dot" cx="118.5" cy="6.5" r="1.5"></circle>
<circle class="dot" cx="86.5" cy="70.5" r="2.5"></circle>
</svg>
<span></span>
</div>
</div>
<button class="meta" id="color-toggle"></button>
<p class="meta">Artwork by <a href="https://dribbble.com/stephendoulas" target="_blank">Stephen Doulas</a> // Animation by <a href="https://codepen.io/jackiezen" target="_blank">Jackie Zen</a></p>
<button class="meta" id="replay">Replay ↻</button>
@import url("https://fonts.googleapis.com/css2?family=Roboto+Condensed:wght@700&display=swap");
*,
*:before,
*:after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
*:before,
*:after {
position: absolute;
content: "";
}
:root {
--container-width: 50vw;
--color-black: #323232;
--color-orange: #fe911b;
--color-cream: #fef3e9;
--max-width: 50vh;
--text-timing: 0.25s;
--text-unit: 10;
--spacing-unit: 0.68;
--degree-unit: calc(var(--spacing-unit) * 2);
--margin: 5vh;
}
html {
--background-color: var(--color-cream);
--stroke-color: var(--color-black);
}
html.dark-mode {
--background-color: var(--color-black);
--stroke-color: var(--color-cream);
}
body {
width: 100%;
height: 100vh;
overflow: hidden;
font-family: "Roboto Condensed", sans-serif;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background: var(--background-color);
}
/* body:before {
width: 100%;
height: 100%;
background-image: url(http://api.thumbr.it/whitenoise-500x500.png?background=FEF3E900&noise=626262&density=1&opacity=30);
z-index: 100;
}
*/
#container {
width: var(--container-width);
height: calc(var(--container-width) * 1.4);
margin: 0 auto;
display: flex;
justify-content: center;
align-items: center;
position: relative;
max-width: var(--max-width);
max-height: calc(var(--max-width) * 1.4);
margin-top: -6%;
}
#container > div {
position: absolute;
}
#turkey-container {
position: absolute;
width: 43%;
height: auto;
margin-bottom: 35%;
bottom: 0;
margin-right: -6%;
}
#sun-container {
position: relative;
width: 38%;
height: auto;
margin-bottom: 35%;
bottom: 0;
opacity: 0;
}
.sun-animation {
animation: fade, shift;
animation-duration: calc(var(--text-timing) * 4);
animation-fill-mode: forwards;
animation-delay: calc(var(--text-timing) * 3);
}
@keyframes shift {
0% {
margin-left: 0;
}
100% {
margin-left: -12%;
}
}
#rays-container {
position: absolute;
width: 100%;
height: auto;
top: 0;
opacity: 0;
}
.ray-animation {
animation: fade calc(var(--text-timing) * 3) forwards 1s;
}
#rays > * {
stroke-width: 6px;
stroke: var(--color-orange);
}
#turkey-container svg,
#leaf-container svg,
#sun-container svg,
#rays-container svg {
width: auto;
height: 100%;
display: block;
stroke-linecap: round;
stroke-linejoin: round;
overflow: visible;
}
#turkey > *,
#leaf > *:not(.dot) {
fill: none;
stroke: var(--stroke-color);
}
#leaf-container svg .dot {
fill: var(--stroke-color);
}
.stroke-animation {
animation: svgFill 1.25s ease-out forwards;
}
.ray-stroke-animation {
animation: svgFill ease-out infinite alternate 1s;
}
#rays .ray:nth-of-type(odd) {
animation-delay: 1.25s;
}
#rays .ray:first-of-type {
animation-duration: 1.8s;
}
#rays .ray:nth-of-type(2) {
animation-duration: 2s;
}
#rays .ray:nth-of-type(3) {
animation-duration: 1.7s;
}
#rays .ray:nth-of-type(4) {
animation-duration: 2.15s;
}
#rays .ray:nth-of-type(5) {
animation-duration: 1.85s;
}
#rays .ray:nth-of-type(6) {
animation-duration: 2.2s;
}
#rays .ray:nth-of-type(7) {
animation-duration: 2.2s;
}
#rays .ray:nth-of-type(8) {
animation-duration: 2.15s;
}
#turkey > * {
stroke-width: 6px;
}
#leaf > *:not(.dot) {
stroke-width: 5px;
}
#leaf > * {
stroke-width: none;
fill: var(--stroke-color);
}
#inner-sun > * {
stroke-width: none;
fill: var(--color-orange);
}
@keyframes svgFill {
100% {
stroke-dashoffset: 0;
}
}
#leaf > *:not(.dot) {
animation-delay: 1s;
}
#leaf > .dot {
opacity: 0;
}
.leaf-dot-aniamtion {
animation: fade calc(var(--text-timing) * 1) forwards 1.5s;
}
#leaf > .dot:first-of-type {
animation-delay: 1.75s;
}
#leaf > .dot:last-of-type {
animation-delay: 2s;
}
#leaf-container {
width: 35%;
height: auto;
bottom: 0;
margin-right: -3%;
margin-bottom: 5%;
position: relative;
opacity: 0;
overflow: visible;
}
.leaf-animation {
animation: fade calc(var(--text-timing) * 1) forwards 1s;
}
#leaf-container span {
position: absolute;
width: 70%;
height: 10%;
bottom: 0;
background: var(--stroke-color);
margin-bottom: -24%;
border-radius: 50%;
left: 50%;
transform: translateX(-50%);
opacity: 0;
}
.leaf-shadow-animation {
animation: fade calc(var(--text-timing) * 2) forwards 1.75s;
}
#text-container {
width: 86%;
padding-bottom: 86%;
bottom: 0;
margin-bottom: 16%;
position: relative;
}
#text-container:before {
width: 100%;
height: 50%;
bottom: 0;
}
#text-container:after {
width: 100%;
height: 100%;
border-radius: 50%;
}
#text-container h2 {
position: absolute;
width: 100%;
display: flex;
justify-content: space-between;
bottom: 0;
font-size: min(max(3.5vw), 3.5vh);
color: var(--color-orange);
opacity: 0;
}
.h2-animation {
animation: fade calc(var(--text-timing) * 1) forwards 1s;
}
#text-container h2 span {
position: relative;
padding-bottom: 2%;
}
#text-container h2 span:before {
width: 100%;
height: 10%;
background: var(--color-orange);
bottom: 0;
border-radius: 25% / 250%;
}
#text-container h2 span:first-letter {
letter-spacing: min(max(1vw), 2vh);
}
#text-container h1 {
position: absolute;
font-size: 250%;
color: var(--stroke-color);
text-transform: uppercase;
height: 50%;
width: 100%;
display: flex;
justify-content: center;
font-size: min(max(4.5vw), 4.5vh);
}
#text-container h1 span {
position: absolute;
height: 100%;
transform-origin: bottom center;
line-height: 1;
width: 6%;
display: flex;
justify-content: center;
align-items: flex-start;
opacity: 0;
}
.h1-animation {
animation: fade calc(var(--text-timing) * 1) forwards;
}
@keyframes fade {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}
#text-container h1 span:first-of-type {
animation-delay: calc(var(--text-timing) * 0.25);
}
#text-container h1 span:nth-of-type(2) {
animation-delay: calc(var(--text-timing) * 0.5);
}
#text-container h1 span:nth-of-type(3) {
animation-delay: calc(var(--text-timing) * 0.75);
}
#text-container h1 span:nth-of-type(4) {
animation-delay: calc(var(--text-timing) * 1);
}
#text-container h1 span:nth-of-type(5) {
animation-delay: calc(var(--text-timing) * 1.75);
}
#text-container h1 span:nth-of-type(6) {
animation-delay: calc(var(--text-timing) * 2);
}
#text-container h1 span:nth-of-type(7) {
animation-delay: calc(var(--text-timing) * 2.25);
}
#text-container h1 span:nth-of-type(8) {
animation-delay: calc(var(--text-timing) * 2.5);
}
#text-container h1 span:nth-of-type(9) {
animation-delay: calc(var(--text-timing) * 2.75);
}
#text-container h1 span:nth-of-type(10) {
animation-delay: calc(var(--text-timing) * 3);
}
#text-container h1 span:nth-of-type(11) {
animation-delay: calc(var(--text-timing) * 3.25);
}
#text-container h1 span:nth-of-type(12) {
animation-delay: calc(var(--text-timing) * 3.5);
}
#text-container h1 span:nth-of-type(13) {
animation-delay: calc(var(--text-timing) * 3.75);
}
#text-container h1 span:nth-of-type(14) {
animation-delay: calc(var(--text-timing) * 4);
}
#text-container h1 span:nth-of-type(15) {
animation-delay: calc(var(--text-timing) * 4.25);
}
#text-container h1 span:nth-of-type(16) {
animation-delay: calc(var(--text-timing) * 4.5);
}
#text-container h1 span:nth-of-type(17) {
animation-delay: calc(var(--text-timing) * 4.75);
}
#text-container h1 span:nth-of-type(18) {
animation-delay: calc(var(--text-timing) * 5);
}
#text-container h1 span:first-of-type,
#text-container h1 span:nth-of-type(2),
#text-container h1 span:nth-of-type(3) {
transform: rotate(-90deg);
}
#text-container h1 span:last-of-type,
#text-container h1 span:nth-of-type(17),
#text-container h1 span:nth-of-type(16) {
transform: rotate(90deg);
}
#text-container h1 span:first-of-type,
#text-container h1 span:last-of-type {
margin-top: calc(calc(var(--text-unit) * 1%) * 2);
}
#text-container h1 span:nth-of-type(2),
#text-container h1 span:nth-of-type(17) {
margin-top: calc(calc(var(--text-unit) * 1%) * 1);
}
#text-container h1 span:nth-of-type(3) {
transform: rotate(
calc(
calc(var(--text-unit) * 1deg) *
calc(calc(var(--spacing-unit) * -1) + calc(var(--degree-unit) * -6))
)
);
}
#text-container h1 span:nth-of-type(16) {
transform: rotate(
calc(
calc(var(--text-unit) * 1deg) *
calc(var(--spacing-unit) + calc(var(--degree-unit) * 6))
)
);
}
#text-container h1 span:nth-of-type(4) {
transform: rotate(
calc(
calc(var(--text-unit) * 1deg) *
calc(calc(var(--spacing-unit) * -1) + calc(var(--degree-unit) * -5))
)
);
}
#text-container h1 span:nth-of-type(15) {
transform: rotate(
calc(
calc(var(--text-unit) * 1deg) *
calc(var(--spacing-unit) + calc(var(--degree-unit) * 5))
)
);
}
#text-container h1 span:nth-of-type(5) {
transform: rotate(
calc(
calc(var(--text-unit) * 1deg) *
calc(calc(var(--spacing-unit) * -1) + calc(var(--degree-unit) * -4))
)
);
}
#text-container h1 span:nth-of-type(14) {
transform: rotate(
calc(
calc(var(--text-unit) * 1deg) *
calc(var(--spacing-unit) + calc(var(--degree-unit) * 4))
)
);
}
#text-container h1 span:nth-of-type(6) {
transform: rotate(
calc(
calc(var(--text-unit) * 1deg) *
calc(calc(var(--spacing-unit) * -1) + calc(var(--degree-unit) * -3))
)
);
}
#text-container h1 span:nth-of-type(13) {
transform: rotate(
calc(
calc(var(--text-unit) * 1deg) *
calc(var(--spacing-unit) + calc(var(--degree-unit) * 3))
)
);
}
#text-container h1 span:nth-of-type(7) {
transform: rotate(
calc(
calc(var(--text-unit) * 1deg) *
calc(calc(var(--spacing-unit) * -1) + calc(var(--degree-unit) * -2))
)
);
}
#text-container h1 span:nth-of-type(12) {
transform: rotate(
calc(
calc(var(--text-unit) * 1deg) *
calc(var(--spacing-unit) + calc(var(--degree-unit) * 2))
)
);
}
#text-container h1 span:nth-of-type(8) {
transform: rotate(
calc(
calc(var(--text-unit) * 1deg) *
calc(calc(var(--spacing-unit) * -1) + calc(var(--degree-unit) * -1))
)
);
}
#text-container h1 span:nth-of-type(11) {
transform: rotate(
calc(
calc(var(--text-unit) * 1deg) *
calc(var(--spacing-unit) + calc(var(--degree-unit) * 1))
)
);
}
#text-container h1 span:nth-of-type(9) {
transform: rotate(
calc(
calc(var(--text-unit) * 1deg) *
calc(calc(var(--spacing-unit) * -1) + calc(var(--degree-unit) * 0))
)
);
}
#text-container h1 span:nth-of-type(10) {
transform: rotate(
calc(
calc(var(--text-unit) * 1deg) *
calc(var(--spacing-unit) + calc(var(--degree-unit) * 0))
)
);
}
.meta {
position: absolute;
opacity: 0.7;
z-index: 101;
}
button {
font-size: 0.8rem;
cursor: pointer;
background: transparent;
color: var(--stroke-color);
transition: all 0.3s;
border: 3px solid var(--stroke-color);
line-height: 1.5;
border-radius: 30px;
height: 30px;
padding: 0 14px;
text-transform: uppercase;
font-weight: 700;
letter-spacing: 0.05rem;
}
button:hover {
transform: scale(1.05);
}
#replay {
bottom: var(--margin);
right: var(--margin);
}
#color-toggle {
border-radius: 50%;
width: 30px;
overflow: hidden;
padding: 0;
bottom: var(--margin);
left: var(--margin);
}
#color-toggle:after {
width: 50%;
height: 100%;
background: var(--stroke-color);
top: 0;
right: 0;
}
button:focus {
outline: 0;
}
p {
padding: 0;
margin: 0;
line-height: 1.8;
font-size: 0.8rem;
text-transform: uppercase;
font-weight: 700;
letter-spacing: 0.1rem;
color: var(--stroke-color);
bottom: 0;
margin: var(--margin);
text-align: center;
}
p a:link,
p a:visited {
color: var(--color-orange);
text-decoration: none;
border-bottom: 2px solid var(--color-orange);
}
@media only screen and (max-width: 768px) {
#color-toggle {
top: var(--margin);
}
#replay {
top: var(--margin);
}
button {
font-size: 0.7rem;
cursor: pointer;
background: transparent;
color: var(--stroke-color);
transition: all 0.3s;
border: 3px solid var(--stroke-color);
line-height: 1.5;
border-radius: 26px;
height: 26px;
padding: 0 14px;
}
p {
font-size: 0.7rem;
}
p a:link {
border-bottom: 1px solid var(--color-orange);
}
#color-toggle {
width: 26px;
}
}
$(document).ready(function () {
console.log("ready!");
$("h1").lettering();
setup();
$("#replay").click(function () {
refresh();
setup();
});
$("#color-toggle").click(function () {
$("html").toggleClass("dark-mode");
});
$("#turkey > *, #leaf > *:not(.dot), #rays > *").each(function () {
var length_stroke = $(this).get(0).getTotalLength();
$(this).css({
"stroke-dasharray": length_stroke + " " + length_stroke,
"stroke-dashoffset": length_stroke
});
});
$.fn.parallax = function (resistance, mouse) {
$el = $(this);
TweenLite.to($el, 0.2, {
x: -((mouse.clientX - window.innerWidth / 2) / resistance),
y: -((mouse.clientY - window.innerHeight / 2) / resistance)
});
};
});
function refresh() {
$("#sun-container").removeClass("sun-animation");
$("#rays-container").removeClass("ray-animation");
$("#leaf-container").removeClass("leaf-animation");
$("#turkey > *, #leaf > *:not(.dot)").removeClass("stroke-animation");
$("#rays > *").removeClass("ray-stroke-animation");
$("#leaf > .dot").removeClass("leaf-dot-animation");
$("#leaf-container span").removeClass("leaf-shadow-animation");
$("#text-container h2").removeClass("h2-animation");
$("#text-container h1 span").removeClass("h1-animation");
}
function animations() {
$("#sun-container").addClass("sun-animation");
$("#rays-container").addClass("ray-animation");
$("#leaf-container").addClass("leaf-animation");
$("#turkey > *, #leaf > *:not(.dot)").addClass("stroke-animation");
$("#rays > *").addClass("ray-stroke-animation");
$("#leaf > .dot").addClass("leaf-dot-animation");
$("#leaf-container span").addClass("leaf-shadow-animation");
$("#text-container h2").addClass("h2-animation");
$("#text-container h1 span").addClass("h1-animation");
}
function setup() {
$("#container").hide(0).fadeIn(800);
animations();
setTimeout(function () {
$(document).mousemove(function (e) {
$("#sun-container #sun").parallax(150, e);
$("h1, h2, #rays-container").parallax(350, e);
$("#turkey-container").parallax(60, e);
$("#leaf-container #leaf").parallax(200, e);
});
}, 2250);
$("button#replay").hide().delay(2500).fadeIn(800);
}
This Pen doesn't use any external CSS resources.