CSS Slide Animation on Fullscreen Images
I was inspired by this answer and created the following snippet:
It uses multiple backgrounds, puts the top-layer one a screen-size to the right and then moves it in.
Very simple and you can add more images easily. The code comments show you how :)
* {
margin: 0;
padding: 0;
}
.container {
width: 100%;
height: 100%;
}
.lead {
font-size: 1.5rem;
}
.navbar {
position: fixed;
top: 0;
z-index: 1;
display: flex;
width: 100%;
height: 60px;
background: rgba(0, 0, 0, 0.7);
}
.navbar ul {
display: flex;
list-style: none;
width: 100%;
justify-content: center;
}
.navbar ul li {
margin: 0 1rem;
padding: 1rem;
}
.navbar ul li a {
text-decoration: none;
text-transform: uppercase;
color: #f4f4f4;
}
.navbar ul li a:hover {
color: skyblue;
}
section {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
width: 100%;
}
section h1 {
font-size: 4rem;
}
/* Section Images */
section#home {
background: black;
min-height: 100vh;
}
section#gallery {
background: red;
min-height: 100vh;
}
section#about {
background: green;
min-height: 100vh;
}
section#contact {
background: blue;
min-height: 100vh;
}
/* LandingPage.css */
* {
margin: 0;
padding: 0;
}
body {
margin: 0;
padding: 0;
font-family: "Montserrat";
font-size: 17px;
color: #fff;
line-height: 1.6;
}
#showcase {
/*/ Last image first, add 100vw for each additional image. For infinite, make first picture the last /*/
background: url("https://images.unsplash.com/photo-1597390520089-9f46046ea040?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1041&q=80")
300vw 0 no-repeat,
url("https://images.unsplash.com/photo-1521020781921-ce0d582b7665?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1350&q=80")
200vw 0 no-repeat,
url("https://images.unsplash.com/photo-1597368208802-2bec16fba411?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1051&q=80")
100vw 0 no-repeat,
url("https://images.unsplash.com/photo-1597390520089-9f46046ea040?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1041&q=80")
0 0 no-repeat;
/*/ For every image, one cover /*/
background-size: cover, cover, cover, cover;
height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
padding: 0 20px;
animation: slide-right 8s forwards 1s infinite;
}
/*/ For four pictures, make keyframes at 0%, 25%, 75%, 100%, for 6 pictures make 0%, 20%, 40%, 60%, 80%, 100% etc./*/
@keyframes slide-right {
0% {
/*/ Add one 100vw 0 for each picture at every stage. It's always like a reverse stairway downwards /*/
/* 3 100vw's*/
background-position: 100vw 0, 100vw 0, 100vw 0, 0 0;
}
33% {
/*2 100vw's*/
background-position: 100vw 0, 100vw 0, 0 0, 0 0;
}
66% {
/* 1 100vw'*/
background-position: 100vw 0, 0 0, 0 0, 0 0;
}
100% {
/* The end - none left :)*/
background-position: 0 0, 0 0, 0 0;
}
}
#showcase h1 {
font-size: 50px;
line-height: 1.2;
}
#showcase p {
font-size: 20px;
color: #fff;
}
#showcase .button {
font-size: 18px;
text-decoration: none;
color: #fff;
border: #fff 1px solid;
padding: 10px 20px;
border-radius: 10px;
margin-top: 20px;
}
.main-section div.iScrollIndicator {
background: white !important;
}
.navbar {
position: fixed;
top: 0;
z-index: 1;
display: flex;
width: 100%;
height: 70px;
background: rgba(57, 77, 95, 0.7);
z-index: 2;
}
.navbar ul {
display: flex;
list-style: none;
width: 100%;
justify-content: center;
}
.navbar ul li {
margin: 10px;
padding: 5px;
}
.navbar ul li a {
text-decoration: none;
text-transform: uppercase;
color: #f4f4f4;
font-size: 30px;
}
.buttons {
display: flex;
justify-content: center;
}
.buttons .button {
margin: 10px;
display: grid;
place-items: center;
}
<div class="container">
<!-- <nav class="navbar">
<ul>
<li><a href="#home">Home</a></li>
<li><a href="#about">About</a></li>
<li><a href="#service">Service</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</nav> -->
<header id="showcase">
<h1>Welcome!</h1>
<div class="buttons">
<a href="#about" class="button"><span>About</span></a>
<a href="#gallery" class="button"><span>Gallery</span></a>
</div>
</header>
<section id="about">
<h1>About</h1>
</section>
<section id="gallery">
<h1>Gallery</h1>
</section>
<section id="contact">
<h1>Contact</h1>
</section>
</div>
Try to rearrange background-position
in the animation
section which has numbers are in unit of Viewport Width(vw
) in manner way.
If there are 3 images in the background
arrangement will be like the following
100vw 0, 100vw 0, 0 0
100vw 0, 0 0, 0 0
0 0, 0 0, 0 0
and also you can simply add scroll-behavior
property in your code on <html>
tag in order to make smooth
scroll which also makes page look nicer when scroll event takes place.
example
html{scroll-behavior: smooth;}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
color: #fff;
}
section,
#showcase {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
section#gallery,
section#home,
section#about,
section#contact,
#showcase{min-height: 100vh;}
section{width: 100%;}
section h1 {font-size: 4rem;}
section#home {background: black;}
section#gallery {background: red;}
section#about {background: green;}
section#contact {background: blue;}
#showcase {
background: url("https://images.unsplash.com/photo-1597390520089-9f46046ea040?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1041&q=80")
200vw 0 no-repeat,
url("https://images.unsplash.com/photo-1597368208802-2bec16fba411?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1051&q=80")
100vw 0 no-repeat,
url("https://images.unsplash.com/photo-1597390520089-9f46046ea040?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1041&q=80")
0 0 no-repeat;
background-size: cover;
animation: slide-right 5s ease-in-out infinite;
}
@keyframes slide-right {
0% {background-position: 100vw 0, 100vw 0, 0 0;}
60% {background-position: 100vw 0, 0 0, 0 0;}
100% {background-position: 0 0, 0 0, 0 0;}
}
#showcase h1 {font-size: 50px;}
#showcase .button {
font-size: 18px;
text-decoration: none;
border: #fff 1px solid;
padding: 10px 20px;
border-radius: 10px;
margin-top: 20px;
}
.buttons {
display: flex;
justify-content: center;
}
.buttons .button {margin: 10px;}
<html>
<div class="container">
<header id="showcase">
<h1>Welcome!</h1>
<div class="buttons">
<a href="#about" class="button"><span>About</span></a>
<a href="#gallery" class="button"><span>Gallery</span></a>
</div>
</header>
<section id="about">
<h1>About</h1>
</section>
<section id="gallery">
<h1>Gallery</h1>
</section>
<section id="contact">
<h1>Contact</h1>
</section>
</div>
</html>
I also edit too much to avoid unnecessary things which were in the code and DRY(Don't Repeat Yourself) as well but I hope you will find it helpful.