In this tutorial, we are going to show you how to create a modern scroll down animation which you can easily add to any website.
These types of animations are typically used on websites that have a full-screen header in which you add an animated element to demonstrate that there is more content on the website if you scroll down.
You can have a look at how this animation works on this CodePen we created.
In a previous article, we created a different type of animation, if you want to check that one out then click here.
So let’s begin with this tutorial; for this we just need to add the following HTML and CSS code:
<div id="scroll-wrapper">
<div id="scroll-wrapper-inner">
<div id="scroll-title">Scroll</div>
<div id="scroll-down"></div>
</div>
</div>
body {
background: #20232c;
}
#scroll-wrapper {
position: absolute;
display: table;
width: 100%;
height: 100%;
z-index: 9;
pointer-events: none;
left: -30%;
}
#scroll-wrapper-inner {
display: table-cell;
vertical-align: bottom;
width: 100%;
height: 100%;
}
#scroll-down {
display: block;
position: relative;
padding-top: 79px;
text-align: center;
}
#scroll-title {
display: block;
text-transform: uppercase;
color: #FFF;
font-family: "Courier-Prime", sans-serif;
font-size: 14px;
font-weight: 600;
letter-spacing: 0.4em;
text-align: center;
transform: rotate(90deg);
margin-bottom: 45px;
}
#scroll-down::before {
-webkit-animation: elasticus 2.9s cubic-bezier(1, 0, 0, 1) infinite;
-moz-animation: elasticus 2.9s cubic-bezier(1, 0, 0, 1) infinite;
-o-animation: elasticus 2.9s cubic-bezier(1, 0, 0, 1) infinite;
animation: elasticus 2.9s cubic-bezier(1, 0, 0, 1) infinite;
position: absolute;
top: 0px;
left: 50%;
margin-left: -1px;
width: 2px;
height: 90px;
background: #FFF;
content: ' ';
}
@-webkit-keyframes elasticus {
0% {
-webkit-transform-origin: 0% 0%;
-ms-transform-origin: 0% 0%;
-moz-transform-origin: 0% 0%;
-o-transform-origin: 0% 0%;
transform-origin: 0% 0%;
-webkit-transform: scale(1, 0);
-ms-transform: scale(1, 0);
-moz-transform: scale(1, 0);
-o-transform: scale(1, 0);
transform: scale(1, 0);
}
50% {
-webkit-transform-origin: 0% 0%;
-ms-transform-origin: 0% 0%;
-moz-transform-origin: 0% 0%;
-o-transform-origin: 0% 0%;
transform-origin: 0% 0%;
-webkit-transform: scale(1, 1);
-ms-transform: scale(1, 1);
-moz-transform: scale(1, 1);
-o-transform: scale(1, 1);
transform: scale(1, 1);
}
50.1% {
-webkit-transform-origin: 0% 100%;
-ms-transform-origin: 0% 100%;
-moz-transform-origin: 0% 100%;
-o-transform-origin: 0% 100%;
transform-origin: 0% 100%;
-webkit-transform: scale(1, 1);
-ms-transform: scale(1, 1);
-moz-transform: scale(1, 1);
-o-transform: scale(1, 1);
transform: scale(1, 1);
}
100% {
-webkit-transform-origin: 0% 100%;
-ms-transform-origin: 0% 100%;
-moz-transform-origin: 0% 100%;
-o-transform-origin: 0% 100%;
transform-origin: 0% 100%;
-webkit-transform: scale(1, 0);
-ms-transform: scale(1, 0);
-moz-transform: scale(1, 0);
-o-transform: scale(1, 0);
transform: scale(1, 0);
}
}
@-moz-keyframes elasticus {
0% {
-webkit-transform-origin: 0% 0%;
-ms-transform-origin: 0% 0%;
-moz-transform-origin: 0% 0%;
-o-transform-origin: 0% 0%;
transform-origin: 0% 0%;
-webkit-transform: scale(1, 0);
-ms-transform: scale(1, 0);
-moz-transform: scale(1, 0);
-o-transform: scale(1, 0);
transform: scale(1, 0);
}
50% {
-webkit-transform-origin: 0% 0%;
-ms-transform-origin: 0% 0%;
-moz-transform-origin: 0% 0%;
-o-transform-origin: 0% 0%;
transform-origin: 0% 0%;
-webkit-transform: scale(1, 1);
-ms-transform: scale(1, 1);
-moz-transform: scale(1, 1);
-o-transform: scale(1, 1);
transform: scale(1, 1);
}
50.1% {
-webkit-transform-origin: 0% 100%;
-ms-transform-origin: 0% 100%;
-moz-transform-origin: 0% 100%;
-o-transform-origin: 0% 100%;
transform-origin: 0% 100%;
-webkit-transform: scale(1, 1);
-ms-transform: scale(1, 1);
-moz-transform: scale(1, 1);
-o-transform: scale(1, 1);
transform: scale(1, 1);
}
100% {
-webkit-transform-origin: 0% 100%;
-ms-transform-origin: 0% 100%;
-moz-transform-origin: 0% 100%;
-o-transform-origin: 0% 100%;
transform-origin: 0% 100%;
-webkit-transform: scale(1, 0);
-ms-transform: scale(1, 0);
-moz-transform: scale(1, 0);
-o-transform: scale(1, 0);
transform: scale(1, 0);
}
}
@-o-keyframes elasticus {
0% {
-webkit-transform-origin: 0% 0%;
-ms-transform-origin: 0% 0%;
-moz-transform-origin: 0% 0%;
-o-transform-origin: 0% 0%;
transform-origin: 0% 0%;
-webkit-transform: scale(1, 0);
-ms-transform: scale(1, 0);
-moz-transform: scale(1, 0);
-o-transform: scale(1, 0);
transform: scale(1, 0);
}
50% {
-webkit-transform-origin: 0% 0%;
-ms-transform-origin: 0% 0%;
-moz-transform-origin: 0% 0%;
-o-transform-origin: 0% 0%;
transform-origin: 0% 0%;
-webkit-transform: scale(1, 1);
-ms-transform: scale(1, 1);
-moz-transform: scale(1, 1);
-o-transform: scale(1, 1);
transform: scale(1, 1);
}
50.1% {
-webkit-transform-origin: 0% 100%;
-ms-transform-origin: 0% 100%;
-moz-transform-origin: 0% 100%;
-o-transform-origin: 0% 100%;
transform-origin: 0% 100%;
-webkit-transform: scale(1, 1);
-ms-transform: scale(1, 1);
-moz-transform: scale(1, 1);
-o-transform: scale(1, 1);
transform: scale(1, 1);
}
100% {
-webkit-transform-origin: 0% 100%;
-ms-transform-origin: 0% 100%;
-moz-transform-origin: 0% 100%;
-o-transform-origin: 0% 100%;
transform-origin: 0% 100%;
-webkit-transform: scale(1, 0);
-ms-transform: scale(1, 0);
-moz-transform: scale(1, 0);
-o-transform: scale(1, 0);
transform: scale(1, 0);
}
}
@keyframes elasticus {
0% {
-webkit-transform-origin: 0% 0%;
-ms-transform-origin: 0% 0%;
-moz-transform-origin: 0% 0%;
-o-transform-origin: 0% 0%;
transform-origin: 0% 0%;
-webkit-transform: scale(1, 0);
-ms-transform: scale(1, 0);
-moz-transform: scale(1, 0);
-o-transform: scale(1, 0);
transform: scale(1, 0);
}
50% {
-webkit-transform-origin: 0% 0%;
-ms-transform-origin: 0% 0%;
-moz-transform-origin: 0% 0%;
-o-transform-origin: 0% 0%;
transform-origin: 0% 0%;
-webkit-transform: scale(1, 1);
-ms-transform: scale(1, 1);
-moz-transform: scale(1, 1);
-o-transform: scale(1, 1);
transform: scale(1, 1);
}
50.1% {
-webkit-transform-origin: 0% 100%;
-ms-transform-origin: 0% 100%;
-moz-transform-origin: 0% 100%;
-o-transform-origin: 0% 100%;
transform-origin: 0% 100%;
-webkit-transform: scale(1, 1);
-ms-transform: scale(1, 1);
-moz-transform: scale(1, 1);
-o-transform: scale(1, 1);
transform: scale(1, 1);
}
100% {
-webkit-transform-origin: 0% 100%;
-ms-transform-origin: 0% 100%;
-moz-transform-origin: 0% 100%;
-o-transform-origin: 0% 100%;
transform-origin: 0% 100%;
-webkit-transform: scale(1, 0);
-ms-transform: scale(1, 0);
-moz-transform: scale(1, 0);
-o-transform: scale(1, 0);
transform: scale(1, 0);
}
}
And it’s as simple as that!
With this example, we are centring the scroll down animation. If you want to quickly move the position of this we can add left
positioning to the #scroll-wrapper
element with either a negative or positive percentage value (depending on where you want this displaying).
We hope you enjoyed this tutorial if you need any help implementing; drop us a comment below!