CSS Only Responsive Horizontal Slider

Category: CSS & CSS3 , Slider | December 23, 2016
Author: OlgaMendenhall
Views Total: 222
Official Page: Go to website
Last Update: December 23, 2016
License: MIT

Preview:

CSS Only Responsive Horizontal Slider

Description:

A responsive, fullscreen, horizontal slider which allows the user to switch between page slides using CSS3 transitions and transforms.

How to use it:

Create the slider header that contains our navigation elements:

<header> 
  <!-- slide-1-trigger -is the id name of our first radio button-->
  <label for="slide-1-trigger">Slide One</label>   
  <label for="slide-2-trigger">Slide Two</label>
  <label for="slide-3-trigger">Slide Three</label>
  <label for="slide-4-trigger">Slide Four</label>
</header>

Create the page sections as follow:

<input id="slide-1-trigger" type="radio" name="slides" checked>  <!-- this is our radio slider section combinations here -->
<section class="slide slide-one">
  <h1>Headline One</h1>
</section>

<input id="slide-2-trigger" type="radio" name="slides"> 
<section class="slide slide-two">
  <h1>Headline Two</h1>
</section>

<input id="slide-3-trigger" type="radio" name="slides">
<section class="slide slide-three">
  <h1>Headline Three</h1>
</section>

<input id="slide-4-trigger" type="radio" name="slides">
<section class="slide slide-four">
  <h1>Headline Four</h1>
</section>

Wrap them into a DIV container:

<div class="wrap">
  <header>   <!-- header contains our navigation elements -->
    <label for="slide-1-trigger">Slide One</label>   <!-- slide-1-trigger -is the id name of our first radio button-->
    <label for="slide-2-trigger">Slide Two</label>
    <label for="slide-3-trigger">Slide Three</label>
    <label for="slide-4-trigger">Slide Four</label>
  </header>
  
  <input id="slide-1-trigger" type="radio" name="slides" checked>  <!-- this is our radio slider section combinations here -->
  <section class="slide slide-one">
    <h1>Headline One</h1>
  </section>

  <input id="slide-2-trigger" type="radio" name="slides"> 
  <section class="slide slide-two">
    <h1>Headline Two</h1>
  </section>

  <input id="slide-3-trigger" type="radio" name="slides">
  <section class="slide slide-three">
    <h1>Headline Three</h1>
  </section>

  <input id="slide-4-trigger" type="radio" name="slides">
  <section class="slide slide-four">
    <h1>Headline Four</h1>
  </section>
  
</div>

The main CSS to style the slider.

.wrap {
  width: 100%;
  height: 100%;
  position: relative;
  overflow: hidden;       /* This is so we can position our slides absolutely off screen and we won't get any horizontal scroll bars */
  background: #120103;
  color: #fff;
  text-align: center;
}

header {
  background: #3E474F;
  box-shadow: 0 .5em 1em #111;
  position: absolute;    /* We position it absolutely to the top-left corner */
  top: 0;
  left: 0;
  z-index: 900;   /*And give it a z-index of 900 so that we are sure that's on top of the rest of the content.*/
  width: 100%;
}

header label {
  color: #788188;
  cursor: pointer;
  display: inline-block;   /* This way our labels will be side-by-side and centered in the middle of our header. Inline-block also allows for our line-height to be respected */
  line-height: 4.25em;    /* This gives us a larger clickable area*/
  font-size: .667em;
  font-weight: bold;
  padding: 0 1em;
}

header label:hover {
  background: #2e353b;
}

.slide {
  width: 100%;
  height: 100%;
  position:absolute;
  top: 0;
  left: 100%;     /* With these styles, we are pushing all of our slides off to the side of the window. */
  z-index: 10;
  padding: 8em 1em 0;
  background-color: #120103;
  background-position: 50% 50%;
  background-size:cover;     /* now our images fill up the entire slide */
  transition: left 0s .75s;   /* duration to 0.  delay it by 0.75 seconds. So these transition styles have the new slide coming in and afterwards our old slides, slides back out.*/
}

We are going to use an attribute selector to select any input that has an ID that starts with slide. Then we will further qualify the selector by adding the pseudo-class of “checked”. This will target any of our radio inputs as they all begin with “slide” Then by using the adjacent sibling combinator which is the “+” sign, we can finally target our slide.

[id^="slide"]:checked + .slide {
  left: 0;       /* When our radio element is checked, we want to position our slide back on the left corner of our wrapper, so we will set left to zero */
  z-index: 100;   /* we wanna raise the z-index to 100, to be sure our slide is on top of the previous one. */
  transition: left .65s ease-out;
}

.slide h1 {
  opacity: 0;
  transform: translateY(100%);
  transition: transform .5s .5s, opacity .5s;    /* This transition will allow us to see the opacity go down to zero, but it will delay the transform until the next slide is already covering it.*/
}

[id^="slide"]:checked + .slide h1 {  /* Now we target our headline when our input is in its checked state */
  opacity: 1;
  transform: translateY(0);
  transition: all .5s .5s;   /* This will have our headline appearing and rising as the slide is coming onto the screen. */
}

Add background images to the slides.

.slide-one {
  background-image: url('1.jpg');
}

.slide-two {
  background-image: url('2.jpg');
}

.slide-three {
  background-image: url('3.jpg');
}

.slide-four {
  background-image: url('4.jpg');
}