<div class="container">
  
  <div data-am-fadeshow="next-prev-navigation">

    <!-- Radio -->
    <input type="radio" name="css-fadeshow" id="slide-1" />
    <input type="radio" name="css-fadeshow" id="slide-2" />
    <input type="radio" name="css-fadeshow" id="slide-3" />

    <!-- Slides -->
    <div class="fs-slides">
      <div class="fs-slide" style="background-image: url(https://images.unsplash.com/photo-1460500063983-994d4c27756c?crop=entropy&fit=crop&fm=jpg&h=1325&ixjsv=2.1.0&ixlib=rb-0.3.5&q=80&w=2550);">
        <!-- Add content to images (sample) -->
        <div style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: white; font-family: sans-serif; text-align: center; text-shadow: 0 0 20px rgba(0,0,0,0.5);">
          <h1 style="margin-top: 0; margin-bottom: 0.8vw; font-size: 5vw; font-weight: bold;">CSS Fadeshow</h1>
          <p style="font-size: 2vw; font-weight: 100; margin-top: 0;">Easy to implement and use on <strong>your</strong> site!</p>
        </div>
      </div>
      <div class="fs-slide" style="background-image: url(https://images.unsplash.com/photo-1440557653082-e8e186733eeb?crop=entropy&fit=crop&fm=jpg&h=1325&ixjsv=2.1.0&ixlib=rb-0.3.5&q=80&w=2500);"></div>
      <div class="fs-slide" style="background-image: url(https://images.unsplash.com/photo-1449057528837-7ca097b3520c?crop=entropy&fit=crop&fm=jpg&h=1325&ixjsv=2.1.0&ixlib=rb-0.3.5&q=80&w=2500);"></div>
    </div>

    <!-- Quick Navigation -->
    <div class="fs-quick-nav">
      <label class="fs-quick-btn" for="slide-1"></label>
      <label class="fs-quick-btn" for="slide-2"></label>
      <label class="fs-quick-btn" for="slide-3"></label>
    </div>
    
    <!-- Prev Navigation -->
    <div class="fs-prev-nav">
      <label class="fs-prev-btn" for="slide-1"></label>
      <label class="fs-prev-btn" for="slide-2"></label>
      <label class="fs-prev-btn" for="slide-3"></label>
    </div>
    
    <!-- Next Navigation -->
    <div class="fs-next-nav">
      <label class="fs-next-btn" for="slide-1"></label>
      <label class="fs-next-btn" for="slide-2"></label>
      <label class="fs-next-btn" for="slide-3"></label>
    </div>

  </div>
  
</div>
/*
 * CSS Fadeshow by @alexerlandsson
 * This is a fadeshow built in CSS and with customization in focus.
 * Supports quick navigation, prev/next navigation and autoplay.
 * 
 * For better documentation and implementation guide, check out the GitHub repository:
 * https://github.com/alexerlandsson/css-fadeshow
*/


/*
 * ===== VARIABLES =====
 *
 * Change these variables to match your preferences. For a more detailed
 * description of what each variable do, visit https://github.com/alexerlandsson/css-fadeshow
 */

$max-slides:          5;
$prefix:              true;
$responsive:          true;
$breakpoint-small:      500px;
$fade-time:           1;
$prev-next-fontfamily:    sans-serif;
$prev-next-icon-size:   3vw;
$prev-next-icon-color:    rgba(255,255,255,0.5);
$prev-next-bg:          rgba(255,255,255,0);
$prev-next-bg-hover:      rgba(255,255,255,0.1);
$prev-icon:           '❮';
$next-icon:           '❯';
$autohide-next-prev:      true;
$quick-nav-color:       rgba(255,255,255,0.8);
$quick-nav-active-color:  coral;
$fade-color:          #fff;
$autoplay:            true;
$autoplay-duration:     5;


/*
 * ===== MIXINS =====
 *
 * This section contains mixin used
 * Do not change anything here unless you know what you are doing.
 */

/* Mixins to handle prefixes */

@mixin fadeshow-transition($value...) {
  @if length($value) < 1 {
    $value: all 150ms linear;
  }
  @if $prefix == true {
    -webkit-transition: $value;
  }
          transition: $value;
}

@mixin fadeshow-transform($value...) {
  @if length($value) < 1 {
    $value: all 150ms linear;
  }
  @if $prefix == true {
    -webkit-transform: $value;
       -ms-transform: $value;
  }
          transform: $value;
}

@mixin fadeshow-animation($value...) {
  @if $prefix == true {
    -webkit-animation: $value;
  }
          animation: $value;
}

@mixin fadeshow-animation-delay($value) {
  @if $prefix == true {
    -webkit-animation-delay: $value;
  }
          animation-delay: $value;
}

@mixin fadeshow-unselectable() {
  @if $prefix == true {
    -webkit-user-select: none;
       -moz-user-select: none;
       -ms-user-select: none;
  }
          user-select: none;
}

/* Mixins to handle Quick Navigation Button states */

@mixin quickNavBtnActive() {
  background-color: $quick-nav-active-color;
}

@mixin quickNavBtnInactive() {
  background-color: $quick-nav-color;
}


/*
 * ===== FADESHOW =====
 *
 * Base functionality for the fadeshow.
 * Do not change anything here unless you know what you are doing.
 */

[data-am-fadeshow] {
  position: relative;
  width: 100%;
  height: 100%;
  overflow: hidden;
  background-color: $fade-color;

  /* Slides */
  .fs-slide {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    opacity: 0;
    background-size: cover;
    background-position: center;
    background-repeat: no-repeat;
    @include fadeshow-transition(opacity #{$fade-time}s ease);

    /* Display first child on load */
    &:first-child {
      opacity: 1;
    }
  }

  /* Quick Navigation */
  .fs-quick-nav {
    position: absolute;
    bottom: 15px;
    left: 50%;
    z-index: 1;
    @include fadeshow-unselectable();
    @include fadeshow-transform(translateX(-50%));
  }

  .fs-quick-btn {
    display: inline-block;
    width: 15px;
    height: 15px;
    margin: 0 2px;
    border-radius: 50%;
    cursor: pointer;
    @include fadeshow-transition(opacity 200ms ease);
    @include quickNavBtnInactive();

    &:hover {
      opacity: 0.8;
    }

    /* Set active state to first button on load */
    &:first-child {
      @include quickNavBtnActive();
    }
  }

  /* Prev/Next Navigation */
  %prev-next {
    position: absolute;
    display: none;
    top: 0;
    bottom: 0;
    width: 100px;
    cursor: pointer;
    font-family: $prev-next-fontfamily;
    background-color: $prev-next-bg;
    -webkit-tap-highlight-color: rgba(0,0,0,0);
    @include fadeshow-transition(all 200ms ease);

    @if $responsive == true {
      @media (max-width: $breakpoint-small) {
        width: 50%;
      }
    }

    &:before {
      position: absolute;
      top: 50%;
      font-size: $prev-next-icon-size;
      color: $prev-next-icon-color;
    }

    &:hover {
      background-color: $prev-next-bg-hover;
      @if $responsive == true {
        @media (max-width: $breakpoint-small) {
          background-color: rgba(255,255,255,0);
        }
      }
    }
  }

  .fs-prev-btn {
    @extend %prev-next;
    left: 0;

    &:before {
      content: "#{$prev-icon}";
      left: 50%;
      @include fadeshow-transform(translate(-50%, -50%));
      @if $responsive == true {
        @media (max-width: $breakpoint-small) {
          left: 30px;
        }
      }
    }

    @if $autohide-next-prev == true {
      @include fadeshow-transform(translateX(-100%));
      @if $responsive == true {
        @media (max-width: $breakpoint-small) {
          @include fadeshow-transform(translate(0));
        }
      }
    }
  }

  .fs-next-btn {
    @extend %prev-next;
    right: 0;

    &:before {
      content: "#{$next-icon}";
      right: 50%;
      @include fadeshow-transform(translate(50%, -50%));
      @if $responsive == true {
        @media (max-width: $breakpoint-small) {
          right: 30px;
        }
      }
    }

    @if $autohide-next-prev == true {
      @include fadeshow-transform(translateX(100%));
      @if $responsive == true {
        @media (max-width: $breakpoint-small) {
          @include fadeshow-transform(translate(0));
        }
      }
    }
  }

  /* Base functionality */
  input[type="radio"] {
    position: fixed;
    top: -9999px;

    &:checked {

      /* This loop handles the slide switching and quick navigation active state */
      $i: $max-slides;

      @while $i > 0 {

        &:nth-of-type(#{$i}) {
          /* Show slide */
          ~ .fs-slides {
            .fs-slide {
              //Cancel autoplay
              opacity: 0;
              @include fadeshow-animation(none !important);
            }
            .fs-slide:nth-child(#{$i}) {
              opacity: 1;
            }
          }

          /* Add active state to dot */
          ~ .fs-quick-nav {
            .fs-quick-btn {
              @include quickNavBtnInactive();
              /* Cancel autoplay */
              @include fadeshow-animation(none !important);
            }
            .fs-quick-btn:nth-child(#{$i}) {
              background-color: $quick-nav-active-color;
              &:hover {
                opacity: 1;
              }
            }
          }

        }
        $i: $i - 1;
      }

      /* Hide navigation if only one slide */
      &:first-of-type:last-of-type {
        ~ .fs-quick-nav,
        ~ .fs-prev-nav,
        ~ .fs-next-nav {
          display: none !important;
        }
      }

    }
  }

  /* Autohide Prev/Next Navigation */
  @if $autohide-next-prev == true {
    &:hover {
      .fs-prev-btn,
      .fs-next-btn {
        @include fadeshow-transform(translateX(0));
      }
    }
  }

}


/*
 * ===== PREV/NEXT NAVIGATION =====
 *
 * This section handles the prev/next navigation.
 */

/* Handle Prev/Next buttons */
[data-am-fadeshow~="next-prev-navigation"] {
  input[type="radio"] {

    &:checked {

      $i: $max-slides;

      @while $i > 0 {

        &:nth-of-type(#{$i}) {

          $prev: ($i - 1);
          $next: ($i + 1);

          /* Show previous button */
          @if $prev > 0 {
            ~ .fs-prev-nav {
              .fs-prev-btn {
                display: none;
              }
              .fs-prev-btn:nth-child(#{$prev}) {
                display: block;
              }
            }
          }

          /* Show next button */
          @if $next < ($max-slides + 1) {
            ~ .fs-next-nav {
              .fs-next-btn {
                display: none;
              }
              .fs-next-btn:nth-child(#{$next}) {
                display: block;
              }
            }
          }

          /* Show last prev button if first slide */
          &:first-of-type {
            ~ .fs-prev-nav {
              .fs-prev-btn:last-child {
                display: block;
              }
            }
          }

          /* Show first next button if last slide */
          &:last-of-type {
            ~ .fs-next-nav {
              .fs-next-btn:first-child {
                display: block;
              }
            }
          }

        }
        $i: $i - 1;
      }
    }
  }

  /* Display first pair of Prev/Next Buttons on load */
  .fs-prev-btn:last-child {
    display: block;
  }

  .fs-next-btn:nth-child(2) {
    display: block
  }

}


/*
 * ===== AUTOPLAY =====
 *
 * Functions to handle autoplay.
 * If you're not going to use autoplay, set $autoplay to false.
 * This part tends to compile into a lot of uneccesary CSS otherwise.
 */

@if $autoplay == true {

  $i: $max-slides;

  @while $i > 1 {

    $total-duration: $autoplay-duration * $i;

    @keyframes quickNavAnimation-#{$i} {
      0% { @include quickNavBtnInactive();  }
      #{100% * $fade-time / $total-duration},
      #{100% * $autoplay-duration / $total-duration} { @include quickNavBtnActive(); }
      #{100% * ($autoplay-duration + $fade-time) / $total-duration},
      100% { @include quickNavBtnInactive(); }
    }
    @if $prefix == true {
      @-webkit-keyframes quickNavAnimation-#{$i} {
        0% { @include quickNavBtnInactive();  }
        #{100% * $fade-time / $total-duration},
        #{100% * $autoplay-duration / $total-duration} { @include quickNavBtnActive(); }
        #{100% * ($autoplay-duration + $fade-time) / $total-duration},
        100% { @include quickNavBtnInactive(); }
      }
    }

    @keyframes slidesAnimation-#{$i} {
      0% { opacity: 0; }
      #{100% * $fade-time / $total-duration},
      #{100% * $autoplay-duration / $total-duration} { opacity: 1; }
      #{100% * ($autoplay-duration + $fade-time) / $total-duration},
      100% { opacity: 0; }
    }
    @if $prefix == true {
      @-webkit-keyframes slidesAnimation-#{$i} {
        0% { opacity: 0; }
        #{100% * $fade-time / $total-duration},
        #{100% * $autoplay-duration / $total-duration} { opacity: 1; }
        #{100% * ($autoplay-duration + $fade-time) / $total-duration},
        100% { opacity: 0; }
      }
    }

    [data-am-fadeshow~="autoplay"] {
      input[type="radio"]:nth-of-type(#{$i}):last-of-type {

        /* Slide animation */
        ~ .fs-slides {
          .fs-slide {
            @include fadeshow-animation(slidesAnimation-#{$i} #{$total-duration}s infinite);
          }
        }

        /* Quick navigation animation */
        ~ .fs-quick-nav {
          .fs-quick-btn {
            @include fadeshow-animation(quickNavAnimation-#{$i} #{$total-duration}s infinite);
          }
        }

        /* Animation Delay */
        @for $j from 1 through $i {
          ~ .fs-slides .fs-slide:nth-child(#{$j}),
          ~ .fs-quick-nav .fs-quick-btn:nth-child(#{$j}) {
            $animation-delay: #{($j - 1) * ($autoplay-duration) - $fade-time}s;
            @include fadeshow-animation-delay(#{$animation-delay});
          }
        }

      }
      $i: $i - 1;
    }
  }
}

/* Base Styling */

body {
  margin: 0;
}

.container {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  box-shadow: 0 0 20px rgba(0,0,0,0.1);
  overflow: hidden;
}
View Compiled

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.