Fullscreen Background Image Slideshow with CSS3

Happy new year, everybody! Today we will create a CSS-only fullscreen background image slideshow. We'll create different image transitions and also make a title appear using CSS animations.

CSS3FullscreenSlideshow

View demo Download source

Happy new year, everybody! Today we will create a CSS-only fullscreen background image slideshow. We’ll create different image transitions and also make a title appear using CSS animations.

The images are by Mark Sebastian and they are licensed under the Creative Commons Attribution-ShareAlike 2.0 Generic License.

Note that this will only work in browsers supporting CSS animations.

This tutorial is a part of our latest CSS3 experiments; you can find more of those here:

The Markup

We’ll use an unordered list for the slideshow and we’ll add a span for each image and a division with a heading:

<ul class="cb-slideshow">
	<li>
		<span>Image 01</span>
		<div>
			<h3>re·lax·a·tion</h3>
		</div>
	</li>
	<li><!--...--></li>
	<li><!--...--></li>
</ul>

The spans are going to be the elements that will have the background images of the slideshow.

The CSS

Let’s style the unordered list first. It will be fixed and we will stretch it over the viewport. We’ll also use a :after pseudo-element in order to place a pattern on top of the image:

.cb-slideshow,
.cb-slideshow:after { 
    position: fixed;
    width: 100%;
    height: 100%;
    top: 0px;
    left: 0px;
    z-index: 0; 
}
.cb-slideshow:after { 
    content: '';
    background: transparent url(../images/pattern.png) repeat top left; 
}

We’ll use a repeated dot pattern but you could as well use, for example, a css gradient with some transparency.

The span that will contain a slideshow image will be positioned absolutely and have a width and height of 100%. Since we have some text inside, we’ll make the color transparent because we don’t want to see it. The background-size property value “cover” will make sure that the background image covers all the area of the element and hence it is the size of the screen, it will cover all the visible viewport. The opacity is set to 0. We’ll then change that in our animation:

.cb-slideshow li span { 
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0px;
    left: 0px;
    color: transparent;
    background-size: cover;
    background-position: 50% 50%;
    background-repeat: none;
    opacity: 0;
    z-index: 0;
    animation: imageAnimation 36s linear infinite 0s; 
}

The animation for each span will last 36 seconds and run an inifinite number of times. But let’s look at the details in a while, first, we will style the division with the headline:

.cb-slideshow li div { 
    z-index: 1000;
    position: absolute;
    bottom: 30px;
    left: 0px;
    width: 100%;
    text-align: center;
    opacity: 0;
    color: #fff;
    animation: titleAnimation 36s linear infinite 0s; 
}
.cb-slideshow li div h3 { 
    font-family: 'BebasNeueRegular', 'Arial Narrow', Arial, sans-serif;
    font-size: 240px;
    padding: 0;
    line-height: 200px; 
}

The animation for the title division will also take 36 seconds.

Now, we will define the background images for all the spans and the animation delay, so that each following slideshow image and title appear after 6 second of the previous one:

.cb-slideshow li:nth-child(1) span { 
    background-image: url(../images/1.jpg) 
}
.cb-slideshow li:nth-child(2) span { 
    background-image: url(../images/2.jpg);
    animation-delay: 6s; 
}
.cb-slideshow li:nth-child(3) span { 
    background-image: url(../images/3.jpg);
    animation-delay: 12s; 
}
.cb-slideshow li:nth-child(4) span { 
    background-image: url(../images/4.jpg);
    animation-delay: 18s; 
}
.cb-slideshow li:nth-child(5) span { 
    background-image: url(../images/5.jpg);
    animation-delay: 24s; 
}
.cb-slideshow li:nth-child(6) span { 
    background-image: url(../images/6.jpg);
    animation-delay: 30s; 
}

.cb-slideshow li:nth-child(2) div { 
    animation-delay: 6s; 
}
.cb-slideshow li:nth-child(3) div { 
    animation-delay: 12s; 
}
.cb-slideshow li:nth-child(4) div { 
    animation-delay: 18s; 
}
.cb-slideshow li:nth-child(5) div { 
    animation-delay: 24s; 
}
.cb-slideshow li:nth-child(6) div { 
    animation-delay: 30s; 
}

Now, let’s have a look at the slideshow animation. Each span will have an animation time of 36 seconds. In those 36 seconds we will change the opacity from 0 to 1 when the animation reaches 8%. And then this opacity gets kept until 17% are reached. When reaching 25% the opacity should already be 0 again and stay like that until the end.

Now, why those values? We want each image to be visible for 6 seconds and we know that at the end of a cycle, we want the first image to show again. We have 6 images, so we will need 36 seconds for a whole cycle to finish. Now, we need to “time” the opacity values accordingly. Knowing that our second image will start animating at 6 seconds, we need to know at what percentile of the animation this will require the first image to fade out. Dividing 6 by 36 gives us 0.166… which would be 16% for our keyframe step. Now, because we don’t want our image to just fade all the time, we’ll define an inbetween step, which we’ll set at half of what we calculated, i.e. 8%. That’s the point that we want to show the image completely and we only want to start fading it out at 17%, making it disappear completely at 25%.

@keyframes imageAnimation { 
    0% { opacity: 0; animation-timing-function: ease-in; }
    8% { opacity: 1; animation-timing-function: ease-out; }
    17% { opacity: 1 }
    25% { opacity: 0 }
    100% { opacity: 0 }
}

We have the same reasoning for the title, just that we want it to disappear a bit quicker, hence the opacity 0 at 19%:

@keyframes titleAnimation { 
    0% { opacity: 0 }
    8% { opacity: 1 }
    17% { opacity: 1 }
    19% { opacity: 0 }
    100% { opacity: 0 }
}

For browsers that don’t support animations, we’ll simply show the last slideshow image by setting the opacity of the span to 1:

.no-cssanimations .cb-slideshow li span{
	opacity: 1;
}

The no-cssanimations class is added by Modernizr.

Let’s as well take care of the title’s font size when the viewport is smaller. We’ll use media queries in order to set the font size smaller at specific widths:

@media screen and (max-width: 1140px) { 
    .cb-slideshow li div h3 { font-size: 140px }
}
@media screen and (max-width: 600px) { 
    .cb-slideshow li div h3 { font-size: 80px }
}

And that’s all for the simple version of the slideshow! Now, let’s see how we can spice up the transitions a bit.

Alternative animation example

Now, we can play a bit with the animations for showing the images and their titles.

The following animation will make the image scale up a bit and rotate it slightly:

@keyframes imageAnimation { 
	0% {
	    opacity: 0;
	    animation-timing-function: ease-in;
	}
	8% {
	    opacity: 1;
	    transform: scale(1.05);
	    animation-timing-function: ease-out;
	}
	17% {
	    opacity: 1;
	    transform: scale(1.1) rotate(3deg);
	}
	25% {
	    opacity: 0;
	    transform: scale(1.1) rotate(3deg);
	}
	100% { opacity: 0 }
}

The title will slide in from the right (we’ll have to change the text-align for the title division to “right”), and disappear by sliding to the left and fading out:

@keyframes titleAnimation { 
	0% {
	    opacity: 0;
	    transform: translateX(200px);
	}
	8% {
	    opacity: 1;
	    transform: translateX(0px);
	}
	17% {
	    opacity: 1;
	    transform: translateX(0px);
	}
	19% {
	    opacity: 0;
	    transform: translateX(-400px);
	}
	25% { opacity: 0 }
	100% { opacity: 0 }
}

There are many possibilities for the image and title transitions, just experiment!

Demos

Here you can find some demos with alternative animations:

  1. Demo 1: Simple Fade in, fade out
  2. Demo 2: Slight rotation, title slides from the right
  3. Demo 3: Image moves up, title moves down
  4. Demo 4: Image scales, title moves up, scales and fades out

Currently, the animations are smoothest in Webkit broswers like Chrome and especially Safari.

I hope you enjoyed this tutorial and find it useful and inspiring!

View demo Download source

Previous:
Next:

Tagged with:

ML is a freelance web designer and developer with a passion for interaction design. She studied Cognitive Science and Computational Logic and has a weakness for the smell of freshly ground peppercorns.

View all contributions by

Website: http://www.codrops.com

Related Articles

CSS Reference

Learn about all important CSS properties from the basics with our extensive and easy-to-read CSS Reference.

It doesn't matter if you are a beginner or intermediate, start learning CSS now.

Feedback 147

Comments are closed.
  1. 1

    Pls how can I reduce the images to three or four? Please help I’m find it difficult

    • 2

      it really isn’t that difficult. Open the css file and under the .cb-slideshow li span { and .cb-slideshow li div { section adjust the total seconds for the duration of the slideshow from 36s to a total of 24s (for 4 images with 6 seconds) – then you remove the two code blocks for the images .cb-slideshow li:nth-child(5) span { and .cb-slideshow li:nth-child(6) span { , and then the two code blocks for the text animation .cb-slideshow li:nth-child(5) div { and .cb-slideshow li:nth-child(6) div { .
      Next open up the html file. Here you’d have to remove the lines for images 5 and 6 in the section:
      Image 05com·po·sure
      Image 06se·ren·i·ty
      and that should do it.
      Hope that helps ;)

  2. 4

    Firefox ok – Chrome ok – Safari ok – Opera ok
    It’s not work in IE 9 :(

    Please help me !

    • 5

      as far as I know there’s no fix for it unless microsoft implements full css3 support in their browsers… you might be able to find a workaround with javascript transitions – just google it. Good luck

  3. 6

    i have 18 images in the slideshow but i can see the slideshow start over in the background after the 6th image.
    can you please help me with this. i’d greatly appreciate it.

    here’s an example of the problem: werunthisonline.net

    • 7

      your site works perfectly in firefox 10. I didn’t count all background images but it looks like there’s all 18 showing.

  4. 8

    all 18 are showing but i can see the slideshow start over in the background after the 6th image.
    For example, on the 7th image i can see traces of the first image. On the 8th image i can see traces of the 2nd image. On the 9th image i can see traces of the 3rd image and so on…

  5. 9

    I Love this!

    What would be the easiest way to just have one image fade in and it stay at that image?

    Sharing this around :)

    Thanks!

  6. 10

    i’ve been working on it as individual file..with using index 2 html, but the images and the slideshow wont come out.. can anyone help me, please?? thx..

  7. 11

    Is there a way of using only one background? Like having a fullscreen background without it having the slideshow?

  8. 12

    Thanks much for this. In the browsers where it works, it works great. Is there a way to use MORE than 6 images? I tried increasing the nthchild and adding ‘s in the html, but no luck. Thanks in advance.

    Michael

  9. 13

    i dont no if anyone else has experienced this but rendered out in safari and iv got more then 10 images and it pre loades image 10 in place of image 2. Works fine in FF but in safari it causes a few problems.

  10. 15

    all 18 are showing but i can see the slideshow start over in the background after the 6th image.
    For example, on the 7th image i can see traces of the first image. On the 8th image i can see traces of the 2nd image. On the 9th image i can see traces of the 3rd image and so on…PLEASE HELP

  11. 16

    This is a great tutorial for a full background image slideshow. I haven’t many tutorials on this topic that work well. I noticed the images get cropped a bit a the tops and bottom. Is it possible to avoid this crop to show 100% of the image area?
    cordially,

  12. 17

    Hi there, i am just starting to learn webdesign and love this effect but I was just wondering how to put a fixed list item (my menu bar) over the top? Every time i try it fades with the background.

    Apologies for the potentially stupid question, im new to this.
    Any help much appreciated

    Thanks

  13. 18

    @Michael Wassil read previous comments, it’s all been covered!

    @jDucksey
    here’s a hint: move the code for your menu bar outside (before) the div that contains the instructions for the slide in the html file

  14. 19

    Great Tutorial, as always!
    I’ve a problem, like Mario, i’ve 17images to show, but on the 7th image i see the 1st image, when turns on 8th image i see also the 2nd image.
    How we can change the timing of the animation?
    I have changed the total time from 36s to 102s (6s x 17images) and i’ve changed the % of the animation, but it still don’t work properly!
    Anyone have an idea for fix it????
    Thanks in advance!

    Sabrina

  15. 22

    Hello — thank you for this tutorial.

    I had a question. I turned this into a featured slider for WordPress using custom fields to populate content on each separate slide. Here’s a glimpse of the code:

    <span style="background-image: url('ID), array( 905,400 ), false, '' );
    echo $src[0];
    ?>');">

    ID, "h1", true); ?>

    ID, "h2", true); ?>

    ID, "h3", true); ?>

    ID, "h4", true); ?>

    ID, "button", true); ?>

    The button custom field includes a linked image such as:



    I have three of the six slides with a linked image (generally in the same area with slight displacement based on content). Something that I have run into is that I’ll be on the first slide but I am able to click the links from slides 3 and 5.

    Is there anyway to ensure that the only link that is clickable is the current slide?

    Is it a z-index issue?

    Thanks for any help. I am working on a site for a client and appreciate any insight.

  16. 24

    Hi..it’s kind of works ready!! :) but there’s a little bit problem here…( ; – ; )
    The image slideshow works perfectly on chrome and mozilla as well..
    but the text seems to be appear overlapping to one and another at the first 10s, then its works perfectly at the end…
    Can anyone tell me why?? Can anyone help me to fixed the overlapping text problem?

    notes: its doesn’t work at all on IE..

    Thx…

Comments are closed.