<nav class="nav">
<div class="nav-wrapper" data-animate="nav-wrapper">
<a class="nav__logo" href="#!" data-animate="split-word">Super company</a>
<ul class="nav__menu animate-nav__menu">
<li>
<a class="nav__menu-item nav__menu-item--active" href="#!">What</a>
</li>
<li>
<a class="nav__menu-item" href="#!">How</a>
</li>
<li>
<a class="nav__menu-item" href="#!">About</a>
</li>
<li>
<a class="nav__menu-item" href="#!">Contact</a>
</li>
<li>
<button class="btn-signin" type="button">Sign in</button>
</li>
</ul>
</div>
</nav>
<main class="main">
<div class="wrapper-purple">
<section class="purple">
<div class="purple__bg" data-animate="purple__bg"></div>
<figure class="purple__img shadow" data-animate="purple__img">
<img src="https://raw.githubusercontent.com/ivanalbizu/landing-animation/main/src/img/purple__img.png" alt="">
</figure>
<article class="purple__txt" data-animate="purple__txt">
<h1 class="purple-title">Lorem ipsum dolor sit.</h1>
<p class="purple-subtitle">Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur tempore corporis optio vitae nihil amet repellendus asperiores ipsam doloribus possimus.</p>
<form onsubmit="event.preventDefault();">
<div class="btn-subscribe">
<label class="label" data-animate="label">
<input type="text" class="text" placeholder="Your email">
<span class="placeholder">Your email</span>
</label>
<button type="submit" class="submit" data-animate="submit">subscribe</button>
</div>
</form>
</article>
</section>
</div>
<div class="wrapper-green" data-content-visibility="false" style="--intrinsic-size:1px 700px;">
<section class="green">
<article class="green__txt" data-animate="green__txt">
<h2 class="green-title">Lorem ipsum dolor sit amet consectetur adipisicing elit.</h2>
<p class="green-subtitle">Lorem ipsum dolor sit amet consectetur, adipisicing elit. Molestias, alias.</p>
<form>
<button type="button" class="btn-register">register</button>
</form>
</article>
<div class="green__bg" data-animate="green__bg"></div>
<figure class="green__img-left shadow" data-animate="green__img-left">
<img src="https://raw.githubusercontent.com/ivanalbizu/landing-animation/main/src/img/green__img-01.jpg" alt="">
</figure>
<figure class="green__img-right shadow" data-animate="green__img-right">
<img src="https://raw.githubusercontent.com/ivanalbizu/landing-animation/main/src/img/green__img-02.jpg" alt="">
</figure>
</section>
</div>
<div class="blue">
<header class="blue__header">
<h3 class="blue-title">Lorem ipsum dolor sit amet consectetur, adipisicing elit. Iusto, repellendus.</h3>
</header>
<div class="wrapper-blue wrapper-blue--top">
<div class="blue__content">
<div class="blue__content-left">
<p class="blue-subtitle">Lorem ipsum dolor sit amet consectetur.</p>
<div class="counter">
<div class="counter__minute"><span></span></div>
<div class="counter__separator">:</div>
<div class="counter__second"><span></span></div>
</div>
</div>
<div class="blue__content-right">
<figure class="blue__img-top" data-animate="blue__img-top">
<img src="https://raw.githubusercontent.com/ivanalbizu/landing-animation/main/src/img/linternas.jpg" alt="">
</figure>
</div>
</div>
</div>
<div class="wrapper-blue wrapper-blue--bottom">
<div class="blue__content">
<div class="blue__content-left">
<ul class="list" data-animate="list">
<li class="list-item">
<span class="list__title">First item Lorem ipsum dolor sit.</span>
<span class="list__subtitle">Lorem ipsum dolor sit amet consectetur adipisicing elit. Rem blanditiis necessitatibus earum.</span>
</li>
<li class="list-item">
<span class="list__title">Second item Lorem ipsum dolor sit more than one.</span>
<span class="list__subtitle">Lorem ipsum dolor sit amet consectetur adipisicing elit. Rem blanditiis necessitatibus earum.</span>
</li>
<li class="list-item">
<span class="list__title">Third item Lorem ipsum dolor.</span>
<span class="list__subtitle">Lorem ipsum dolor sit amet. Rem blanditiis necessitatibus earum.</span>
</li>
</ul>
</div>
<div class="blue__content-right">
<figure class="blue__img-bottom shadow-light">
<img src="https://raw.githubusercontent.com/ivanalbizu/landing-animation/main/src/img/spider.png" data-animate="filter" alt="">
</figure>
</div>
</div>
</div>
</div>
</main>
<footer class="footer">
<div>This is a footer content</div>
</footer>
* {
box-sizing: border-box;
margin: 0;
}
html,
body {
height: 100%;
}
body {
font-family: 'Montserrat', sans-serif;
color: #242424;
}
h1, h2, h3, h4, h5, h6, p {
font-size: 1em;
margin-block-start: 0;
margin-block-end: 0;
margin-inline-start: 0;
margin-inline-end: 0;
font-weight: 400;
}
figure {
margin-block-start: 0;
margin-block-end: 0;
margin-inline-start: 0;
margin-inline-end: 0;
font-weight: 400;
display: flex;
img {
max-width: 100%;
}
}
ul {
list-style-type: none;
margin-block-start: 0;
margin-block-end: 0;
margin-inline-start: 0;
margin-inline-end: 0;
padding-inline-start: 0;
}
a, a:hover, a:visited {
text-decoration: none;
}
input, button {
font-family: 'Montserrat', sans-serif;
font-weight: 400;
border: 0;
border-radius: 0;
outline: none;
}
input[type="submit"], button {
cursor: pointer;
}
::placeholder {
color: transparent;
}
$breakpoint-desktop: 64em;
$breakpoint-tablet: 42.5em;
$breakpoint-mobile: 35.938em;
:root {
--width-content: 86.252em;
--color-purple: #70163C;
--color-purple-light: #9C2A5A;
--color-purple-dark: #2E0F15;
--color-green: #307351;
--color-green-light: #A8BBB2;
--color-gray: #d6d6d6;
--color-blue: #068d9d;
--color-mustard: #e3b23c;
--grid: 90px;
--counter-legend-size: 24;
}
@supports (content-visibility: auto) {
[data-content-visibility="false"] {
content-visibility: auto;
contain-intrinsic-size: var(--intrinsic-size);
}
[data-content-visibility="true"] {
content-visibility: visible;
}
}
.main {
width: 100%;
display: flex;
flex-direction: column;
}
.wrapper-purple {
background: var(--color-purple);
background: linear-gradient(to bottom, var(--color-purple) 88%, var(--color-gray) 88%);
}
.wrapper-green {
background-color: var(--color-gray);
}
.wrapper-blue {
position: relative;
&::after {
content: "";
position: absolute;
left: 50%;
top: 0;
right: 0;
bottom: 0;
z-index: 0;
}
&--top {
background: linear-gradient(to right, #fff calc(50% + 1px), var(--color-mustard) calc(50% + 1px));
&::after {
background: linear-gradient(to bottom, #fff 50%, var(--color-mustard) 50%);
}
}
&--bottom {
background-color: var(--color-blue);
&::after {
background-color: var(--color-mustard);
}
}
}
.nav {
background-color: var(--color-purple);
&-wrapper {
width: min(100%, var(--width-content));
padding-left: 1em;
padding-right: 1em;
margin: auto;
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
position: relative;
&::after {
content: "";
width: calc(100% - 2em);
display: block;
border-bottom: 1px solid #fff;
position: absolute;
bottom: 0;
}
}
&__logo {
color: #fff;
font-family: 'Open Sans Condensed', sans-serif;
font-size: 1.5em;
letter-spacing: 1.5px;
padding: .5em 0;
margin-right: 2em;
}
&__menu {
display: flex;
align-items: center;
overflow-x: auto;
&-item {
color: #fff;
font-size: .9em;
display: flex;
align-items: center;
border-top: 3px solid transparent;
border-bottom: 3px solid transparent;
padding: 1.5em 0;
margin: auto 1em;
&:hover,
&--active {
border-bottom: 3px solid #fff;
}
&:focus {
outline: none;
}
}
li {
border-top: 4px solid transparent;
white-space: nowrap;
// simulate line under menu when break menu on responsive
@media only screen and (hover: none) and (pointer: coarse) {
&:not(:last-of-type) {
border-bottom: 1px solid #fff;
}
}
// keyboard focus style
&:not(:last-of-type):focus-within {
background-color: #fff;
.nav__menu-item {
color: var(--color-purple);
}
}
}
}
}
.purple {
width: 100%;
max-width: var(--width-content);
padding: var(--grid) 1em 0;
margin: auto;
display: grid;
grid-template-columns: repeat(15, 1fr);
grid-gap: 0;
&__bg {
grid-area: 2 / 1 / 10 / 8;
background-color: var(--color-purple-light);
clip-path: polygon(0 59%, 100% 59%, 100% 100%, 0% 100%);
}
&__img {
grid-area: 2 / 2 / 8 / 7;
justify-content: center;
overflow: hidden;
height: 586px;
img {
height: 100%;
max-height: 750px;
object-fit: cover;
object-position: center;
border-bottom: var(--grid) solid transparent;
z-index: 1;
}
}
&__txt {
grid-area: 3 / 9 / 5 / 16;
display: flex;
flex-direction: column;
justify-content: center;
color: #fff;
}
}
.green {
width: 100%;
max-width: var(--width-content);
padding: var(--grid) 1em;
margin: auto;
display: grid;
grid-template-columns: repeat(15, 1fr);
grid-template-rows: repeat(11, 1fr);
grid-gap: 0;
&__txt {
grid-area: 3 / 2 / 9 / 7;
padding-right: 1em;
}
&__bg {
grid-area: 1 / 7 / 10 / 15;
background-color: var(--color-green-light);
}
&__img-left {
grid-area: 3 / 8 / 12 / 12;
justify-content: flex-start;
align-self: flex-start;
img {
width: 96%;
}
}
&__img-right {
grid-area: 3 / 12 / 9 / 16;
justify-content: flex-end;
align-self: center;
img {
width: 94%;
}
}
}
.blue {
padding-top: clamp(3em, 7vw, 8em);
&__header {
display: flex;
justify-content: space-between;
width: var(--width-content);
max-width: 100%;
padding: 0 1em;
margin: auto;
}
&__content {
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
width: var(--width-content);
max-width: 100%;
padding: 0 1em 0;
margin: auto;
&-left,
&-right {
width: 50%;
z-index: 1;
}
&-left {
padding: 0 2em 1em 0;
}
&-right {
img {
padding-left: 2em;
}
}
}
&__img-bottom {
padding-top: 3em;
}
}
.footer {
height: 400px;
background-color: var(--color-blue);
padding-top: 3em;
div {
display: flex;
justify-content: center;
align-items: center;
color: #fff;
width: 100%;
height: 100%;
border-top: 1px solid #fff;
font-size: 1.5em;
}
}
// typos
.purple-title {
color: #fff;
font-family: 'Open Sans Condensed', sans-serif;
font-size: clamp(1.8em, 6vw, 70px);
font-weight: 300;
letter-spacing: .2px;
line-height: 1.2;
margin-bottom: clamp(.3em, 2vw, .8em);
}
.purple-subtitle {
color: #fff;
font-size: clamp(.9em, 2vw, 1.1em);
font-weight: 300;
letter-spacing: .4px;
line-height: 1.4;
margin-bottom: clamp(2em, 2vw, 3em);
}
.green-title {
color: #242424;
font-family: 'Open Sans Condensed', sans-serif;
font-size: clamp(1.5em, 5vw, 45px);
font-weight: 300;
letter-spacing: .2px;
line-height: 1;
margin-bottom: clamp(1em, 2vw, 2em);
}
.green-subtitle {
color: #242424;
font-size: clamp(.9em, 2vw, 1.1em);
font-weight: 300;
letter-spacing: .4px;
line-height: 1.2;
margin-bottom: clamp(2em, 2vw, 2.5em);
}
.blue-title {
color: var(--color-blue);
font-family: 'Open Sans Condensed', sans-serif;
font-size: clamp(1.5em, 5vw, 50px);
font-weight: 300;
letter-spacing: .2px;
line-height: 1;
margin-bottom: clamp(1em, 2vw, 2em);
}
.blue-subtitle {
color: var(--color-blue);
font-size: clamp(.9em, 2vw, 1.1em);
font-weight: 400;
letter-spacing: .4px;
line-height: 1.2;
text-align: center;
margin-bottom: clamp(2em, 2vw, 2.5em);
}
.list {
color: #fff;
&-item:not(:last-of-type) {
margin-bottom: clamp(1.5em, 5vw, 5em);
}
li > span {
display: flex;
}
&__title {
font-family: 'Open Sans Condensed', sans-serif;
font-size: clamp(1.5em, 4vw, 3em);
line-height: 1;
margin-bottom: .5em;
}
&__subtitle {
font-family: 'Montserrat', sans-serif;
font-size: clamp(.9em, 2vw, 1.2em);
line-height: 1.4;
}
}
.btn-subscribe {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
input {
background-color: transparent;
color: #fff;
}
.label {
flex: 0 0 55%;
padding: 1em 0;
border-bottom: 1px solid #fff;
margin-bottom: .5em;
position: relative;
.text {
letter-spacing: .8px;
font-size: .9em;
width: 100%;
&:focus,
&:not(:placeholder-shown) {
+ .placeholder {
transform: translateY(-2em);
}
}
}
.placeholder {
position: absolute;
left: 2px;
transition: all .1s ease;
}
}
.submit {
flex: 0 0 30%;
font-size: 1em;
letter-spacing: .4px;
font-weight: 400;
background-color: #fff;
color: var(--color-purple);
padding: 1em 3em;
border: 2px solid transparent;
margin-bottom: .5em;
transition: all .3s linear .1s;
&:focus,
&:hover {
color: #fff;
background-color: var(--color-purple-light);
border: 2px solid #fff;
transition: all .4s linear .2s;
}
}
@media (max-width: $breakpoint-mobile) {
flex-direction: column;
.label,
.submit {
flex: 1;
}
.submit {
padding-top: .8em;
padding-bottom: .8em;
}
}
}
.btn-signin {
font-size: .9em;
letter-spacing: .4px;
font-weight: 300;
background-color: darken(#70163C, 15%);
color: #fff;
padding: 1em 1.5em;
margin-left: 2em;
border: 2px solid transparent;
&:focus,
&:hover {
background-color: rgba(0,0,0,.6);
border: 2px solid #fff;
}
}
.btn-register {
font-size: 1em;
letter-spacing: .4px;
font-weight: 400;
background-color: var(--color-green);
color: #fff;
padding: 1em 4em;
border: 2px solid transparent;
transition: all .3s linear .1s;
&:focus,
&:hover {
color: var(--color-green);
background-color: rgba(255,255,255,.3);
border: 2px solid var(--color-green);
transition: all .4s linear .2s;
}
@media (max-width: $breakpoint-mobile) {
padding-top: .8em;
padding-bottom: .8em;
width: 100%;
}
}
.shadow {
filter: drop-shadow(0px 0px 3px rgba(0,0,0,.6));
}
.shadow-light {
filter: drop-shadow(0px 0px 8px rgba(0,0,0,.4));
}
@media (max-width: $breakpoint-desktop) {
.purple {
display: flex;
flex-wrap: wrap;
background: var(--color-purple);
padding-top: 2em;
padding-bottom: 2.5em;
position: relative;
&__bg {
width: calc(100% - 2em);
height: 55%;
position: absolute;
top: 0;
}
&__img {
img {
width: 80%;
margin-right: auto;
height: auto;
border-bottom-width: 20px;
}
}
}
.green {
grid-template-columns: repeat(2, 5px) repeat(2, 1fr) repeat(2, 5px);
grid-template-rows: 0 auto 10px auto 10px 0;
grid-gap: 1em;
padding-top: 2em;
padding-bottom: 2em;
&__txt {
grid-area: 2 / 1 / 3 / 7;
padding: 0 0 2em;
}
&__bg {
grid-area: 3 / 2 / 6 / 5;
}
&__img-left {
grid-area: 4 / 1 / 5 / 4;
}
&__img-right {
grid-area: 4 / 4 / 5 / 7;
}
&__img-left,
&__img-right {
img {
width: auto;
max-width: 100%;
}
}
}
}
@media (max-width: $breakpoint-tablet) {
.purple {
&__img {
img {
width: 100%;
}
}
}
.wrapper-blue {
position: relative;
&--top {
//background: linear-gradient(to right, var(--color-blue) calc(50% + 1px), var(--color-mustard) calc(50% + 1px));
&::after {
left: 0;
}
.blue {
&__content {
&-right {
padding-bottom: 1em;
}
}
}
}
&--bottom {
&::after {
left: 36%;
}
}
}
.blue {
&__content {
&-left,
&-right {
width: 100%;
}
&-left {
padding-right: 0;
}
&-right {
img {
padding-left: 0;
}
}
}
&__img-bottom {
padding-top: 0;
margin-top: -2.5em;
}
}
.list {
background-color: var(--color-blue);
padding: 4em 2em 4em 0;
}
}
// counter css
.counter {
font-size: 3em;
font-family: 'Open Sans Condensed';
display: flex;
justify-content: center;
&__minute,
&__second {
width: 2ch;
background-color: var(--color-blue);
padding: .2em .4em;
color: #fff;
border-bottom: calc(var(--counter-legend-size) * 1px) solid rgba(255,255,255,1);
box-sizing: content-box;
position: relative;
&::after {
position: absolute;
bottom: calc(var(--counter-legend-size) * -1px);
left: 0;
right: 0;
color: var(--color-blue);
font-size: calc(var(--counter-legend-size) * 1px);
height: calc(var(--counter-legend-size) * 1px);
line-height: 1;
text-align: center;
}
span::before,
span::after {
text-shadow: 1px 1px 1px rgba(0,0,0,.8);
animation-fill-mode: forwards;
animation-iteration-count: infinite;
animation-timing-function: step-end;
}
}
&__minute {
&::after {
content: "min";
}
}
&__second {
&::after {
content: "sec";
}
}
&__separator {
width: 1ch;
color: var(--color-blue);
padding: .2em 0;
text-align: center;
}
}
.counter__second span {
&::before {
counter-reset: second-unit-of-tens 5;
content: counter(second-unit-of-tens);
animation-duration: 60s;
animation-name: counter-second-unit-of-tens;
}
&::after {
counter-reset: second-unit 9;
content: counter(second-unit);
animation-duration: 10s;
animation-name: counter-second-unit;
}
}
@keyframes counter-second-unit {
10% { counter-increment: second-unit -1; }
20% { counter-increment: second-unit -2; }
30% { counter-increment: second-unit -3; }
40% { counter-increment: second-unit -4; }
50% { counter-increment: second-unit -5; }
60% { counter-increment: second-unit -6; }
70% { counter-increment: second-unit -7; }
80% { counter-increment: second-unit -8; }
90% { counter-increment: second-unit -9; }
100% { counter-reset: second-unit 0; }
}
@keyframes counter-second-unit-of-tens {
16.67% { counter-increment: second-unit-of-tens -1; }
33.33% { counter-increment: second-unit-of-tens -2; }
50.00% { counter-increment: second-unit-of-tens -3; }
66.67% { counter-increment: second-unit-of-tens -4; }
83.33% { counter-increment: second-unit-of-tens -5; }
100% { counter-reset: second-unit-of-tens 0; }
}
.counter__minute span {
&::before {
counter-reset: minute-unit-of-tens 5;
content: counter(minute-unit-of-tens);
animation-duration: 3600s;
animation-name: counter-minute-unit-of-tens;
}
&::after {
counter-reset: minute-unit 9;
content: counter(minute-unit);
animation-duration: 600s;
animation-name: counter-minute-unit;
}
}
@keyframes counter-minute-unit {
10% { counter-increment: minute-unit -1; }
20% { counter-increment: minute-unit -2; }
30% { counter-increment: minute-unit -3; }
40% { counter-increment: minute-unit -4; }
50% { counter-increment: minute-unit -5; }
60% { counter-increment: minute-unit -6; }
70% { counter-increment: minute-unit -7; }
80% { counter-increment: minute-unit -8; }
90% { counter-increment: minute-unit -9; }
100% { counter-reset: minute-unit 0; }
}
@keyframes counter-minute-unit-of-tens {
16.67% { counter-increment: minute-unit-of-tens -1; }
33.33% { counter-increment: minute-unit-of-tens -2; }
50.00% { counter-increment: minute-unit-of-tens -3; }
66.67% { counter-increment: minute-unit-of-tens -4; }
83.33% { counter-increment: minute-unit-of-tens -5; }
100% { counter-reset: minute-unit-of-tens 0; }
}
// ANIMATIONS
// ----------
// if data-animate exists, then set initial opacity to 0
// when its on viewport set opacity to 1
[data-animate] {
opacity: 0;
&[class*='animate-'] {
opacity: 1;
}
}
// Animate PURPLE section
.animate-split-word {
[data-letter] {
display: inline-flex;
opacity: 0;
transform: rotateY(0deg);
animation: data-letter 2s ease-in calc(var(--global-index) * .2s) forwards;
}
[data-space="true"] {
width: .8ch;
}
}
@keyframes data-letter {
0% {
transform: rotateY(0deg);
}
60% {
opacity: 1;
}
100% {
transform: rotateY(1080deg);
opacity: 1;
}
}
.animate-nav-wrapper {
&::after {
width: 0;
animation: nav-wrapper 1s linear 0s forwards;
}
}
@keyframes nav-wrapper {
0% { width: 0; }
100% { width: calc(100% - 2em); }
}
.animate-nav__menu {
position: relative;
li {
&::after {
content: "";
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
background-color: var(--color-purple);
animation: nav__menu 1s ease 1s forwards;
}
}
}
@keyframes nav__menu {
0% { height: 100%; }
100% { height: 0; }
}
.animate-purple__bg {
clip-path: polygon(0 0%, 100% 0%, 100% 0%, 0% 0%);
animation: purple__bg 1.5s ease-in-out 2s forwards;
@media (max-width: $breakpoint-desktop) {
animation-delay: .2s;
}
}
@keyframes purple__bg {
0% { clip-path: polygon(0 0%, 100% 0%, 100% 0%, 0% 0%); }
100% { clip-path: polygon(0 59%, 100% 59%, 100% 100%, 0% 100%); }
}
.animate-purple__img {
position: relative;
clip-path: polygon(0 0%, 100% 0%, 100% 0%, 0% 0%);
animation: purple__img 3s ease-in-out 2s forwards;
&::after {
content: "";
position: absolute;
top: 0;
bottom: 90px;
width: 100%;
height: calc(100% - 90px);
}
@media (max-width: $breakpoint-desktop) {
animation-delay: .2s;
}
}
@keyframes purple__img {
0% { clip-path: polygon(0 0%, 100% 0%, 100% 0%, 0% 0%); }
50% { clip-path: polygon(0 59%, 100% 59%, 100% 100%, 0% 100%); }
100% { clip-path: polygon(0 0%, 100% 0%, 100% 100%, 0% 100%); }
}
.animate-purple__txt {
position: relative;
&::after {
content: "";
position: absolute;
background-color: var(--color-purple);
left: 0;
top: 0;
right: 0;
bottom: 0;
animation: purple__txt 1s linear 1s forwards;
@media (max-width: $breakpoint-desktop) {
animation-delay: .2s;
}
}
}
@keyframes purple__txt {
0% { clip-path: circle(140.9% at 100% 100%); }
100% { clip-path: circle(0.0% at 100% 100%); }
}
.animate-label {
position: relative;
&::after {
content: "";
position: absolute;
background-color: var(--color-purple);
left: 0;
top: 0;
right: 0;
bottom: -1px;
animation: label 1s linear 2s forwards;
@media (max-width: $breakpoint-desktop) {
animation-delay: 1.2s;
}
}
}
@keyframes label {
0% {
clip-path: polygon(0 0, 100% 0%, 100% 100%, 0% 100%);
background-color: #fff;
}
100% {
clip-path: polygon(0 100%, 100% 100%, 100% 100%, 0% 100%);
}
}
.animate-submit {
position: relative;
&::after {
content: "";
position: absolute;
background-color: var(--color-purple);
left: 0;
top: 0;
right: 0;
bottom: 0;
animation: submit .5s linear 2.5s forwards;
@media (max-width: $breakpoint-desktop) {
animation-delay: 1.2s;
}
}
}
@keyframes submit {
0% { clip-path: polygon(0 0, 100% 0%, 100% 100%, 0% 100%); }
100% { clip-path: polygon(0 100%, 100% 100%, 100% 100%, 0% 100%); }
}
// Animate GREEN section
.animate-green__txt {
position: relative;
&::after {
content: "";
position: absolute;
background-color: var(--color-gray);
left: 0;
top: 0;
right: 0;
bottom: 0;
animation: green__txt 1s linear .5s forwards;
@media (max-width: $breakpoint-desktop) {
animation-delay: .2s;
}
}
}
@keyframes green__txt {
0% { clip-path: circle(70.7% at 50% 50%); }
100% { clip-path: circle(0% at 50% 50%); }
}
.animate-green__bg {
clip-path: polygon(0 0, 0 0, 0 100%, 0 100%);
animation: green__bg 1.5s cubic-bezier(0.51, 0.26, 0.82, 0.53) .3s forwards;
}
@keyframes green__bg {
0% { clip-path: polygon(0 0, 0 0, 0 100%, 0 100%); }
100% { clip-path: polygon(0 0, 100% 0, 100% 100%, 0% 100%); }
}
.green__img-left,
.green__img-right {
img {
visibility: visible;
opacity: 0;
}
}
.animate-green__img-left {
transform: translateY(-90px);
visibility: hidden;
animation: green__img-left 1s ease 2s forwards;
img {
opacity: 1;
transition: opacity 1s linear 2s;
}
}
@keyframes green__img-left {
0% {
transform: translateY(-90px);
visibility: visible;
}
100% {
transform: translateY(0);
visibility: visible;
}
}
.animate-green__img-right {
transform: translateX(-120px);
visibility: hidden;
animation: green__img-right 1s ease 2.3s forwards;
img {
opacity: 1;
transition: opacity 1s linear 2.3s;
}
}
@keyframes green__img-right {
0% {
transform: translateX(-120px);
visibility: visible;
}
100% {
transform: translateX(0);
visibility: visible;
}
}
// Animate BLUE section
.animate-blue__img-top {
position: relative;
&::after {
content: "";
position: absolute;
background: linear-gradient(to bottom, #fff 50%, var(--color-mustard) 50%);
left: 2em;
top: 0;
right: 0;
bottom: 0;
animation: blue__img-top 1s linear .5s forwards;
}
filter: drop-shadow(0px 0px 8px rgba(0,0,0,.4));
transition: filter .3s linear 1.5s;
@media (max-width: $breakpoint-tablet) {
&::after {
left: 0;
}
}
}
@keyframes blue__img-top {
0% { clip-path: circle(70.7% at 50% 50%); }
100% { clip-path: circle(0% at 50% 50%); }
}
.list {
.list-item {
transform: translateX(2em);
opacity: 0;
}
}
.animate-list {
.list-item {
transform: translateX(2em);
animation: list .5s ease .1s forwards;
&:nth-child(2) {
animation-delay: .6s;
}
&:nth-child(3) {
animation-delay: 1.2s;
}
}
}
@keyframes list {
0% {
transform: translateX(2em);
}
80% {
opacity: 1;
}
100% {
opacity: 1;
transform: translateX(0);
}
}
.animate-filter {
animation: filter-blur 2s linear 0s forwards, filter-hue 15s linear 2s alternate infinite;
}
@keyframes filter-hue {
0% { filter: hue-rotate(0deg); }
100% { filter: hue-rotate(360deg); }
}
@keyframes filter-blur {
0% { filter: blur(30px); }
100% { filter: blur(0); }
}
View Compiled
document.addEventListener('DOMContentLoaded', () => {
if (CSS.supports('content-visibility', 'auto')) {
const blocks = document.querySelectorAll('[data-content-visibility]')
const io = new IntersectionObserver(ioHandlerContentVisibility);
[].forEach.call(blocks, block => io.observe(block))
}
let splits = document.querySelectorAll('[data-animate="split-word"]');
splits.forEach(split => {
let splitTextContent = split.textContent;
split.innerHTML = '';
split.appendChild(sliptWords(splitTextContent))
})
const dataAnimates = document.querySelectorAll("[data-animate]")
const ioAnimate = new IntersectionObserver(ioHandlerAnimate, ioConfigAnimate);
[].forEach.call(dataAnimates, dataAnimate => ioAnimate.observe(dataAnimate))
})
const ioHandlerContentVisibility = (entries, self) => {
for (let entry of entries) {
if (entry.isIntersecting) {
entry.target.setAttribute('data-content-visibility', 'true')
self.unobserve(entry.target)
}
}
}
const ioHandlerAnimate = (entries, self) => {
for (let entry of entries) {
const target = entry.target
if (entry.intersectionRatio > .2) {
target.classList.add(`animate-${target.getAttribute("data-animate")}`)
self.unobserve(target);
}
}
}
const ioConfigAnimate = {
threshold: .2
}
const elFactory = (type, attributes, ...children) => {
const el = document.createElement(type)
for (key in attributes) {
el.setAttribute(key, attributes[key])
}
children.forEach(child => {
if (typeof child === 'string') el.appendChild(document.createTextNode(child))
else el.appendChild(child)
})
return el
}
const sliptWords = words => {
const fragment = new DocumentFragment();
let globalIndex = 0;
words.split(' ').forEach((word, iWord) => {
const fragmentLetter = new DocumentFragment();
word.split('').forEach((letter, iLetter) => {
globalIndex++;
const el = elFactory(
'span',
{
'data-letter': `${letter}`,
class: `letter`,
style: `--letter-index:${iLetter+1}; --global-index: ${globalIndex};`
},
`${letter}`
)
fragmentLetter.appendChild(el);
})
const space = elFactory(
'span',
{
'data-space': true,
class: `space`
},
` `
)
fragmentLetter.appendChild(space);
const el = elFactory(
'span',
{
'data-word': `${word}`,
class: `word`,
style: `--word-index:${iWord+1}`
},
fragmentLetter
)
fragment.appendChild(el);
})
return fragment;
}
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.