Infinite Looping Image Slider In Pure JavaScript

Category: Javascript , Slider | July 21, 2018
Author: soliniak
Views Total: 4,477 views
Official Page: Go to website
Last Update: July 21, 2018
License: MIT

Preview:

Infinite Looping Image Slider In Pure JavaScript

Description:

A minimal, infinite-looping image slider that slides through any number of images just like a carousel.

With support for navigation, autoplay, image counter, loading indicator, CSS3 animations, etc.

How to use it:

Add images and slider controls to the webpage.

<div class="slider_container">
  <div class="slides">
    <img src="1.jpg" alt="one" class="pic" name="1">
    <img src="2.jpg" alt="two" class="pic" name="2">
    <img src="3.jpg" alt="three" class="pic" name="3">
    <img src="4.jpg" alt="four" class="pic" name="4">
  </div>
  <nav class="slider_navigation">
    <div class="navigation-buttons">
      <button class="button button-left"></button>
      <button class="button button-right"></button>
      <label class="autoplay-controls">
        <input type="checkbox" name="autoplay" checked>
        <div class="checkmark"></div>
        <div class="autoplay-sub">Autoplay</div>
      </label>
    </div>
    <span class="slide_counter"></span>
  </nav>
</div>

The necessary CSS styles for the slider.

.button, .checkmark {
  background-color: #dedede;
  border: 0;
  border-radius: 50%;
  box-shadow: 0 0 0 0 rgba(190, 190, 220, 0.2);
  color: white;
  height: 30px;
  margin: 0 0.5rem 0 0;
  cursor: pointer;
  position: relative;
  transition: box-shadow 0.2s;
  width: 30px;
}

.button:hover, .checkmark:hover { background-color: #ccc; }

.button:active, .checkmark:active {
  background: #2196F3;
  box-shadow: 0 0 15px 40px rgba(220, 220, 250, 0);
}

.autoplay-controls { cursor: pointer; }

.autoplay-controls:active > .checkmark {
  background: #2196F3;
  box-shadow: 0 0 15px 40px rgba(220, 220, 250, 0);
}

.slider_container {
  align-items: center;
  display: flex;
  flex-direction: column;
  min-height: 400px;
  width: 900px;
}

.slide_counter {
  float: right;
  margin: 0 1rem;
}

.slides {
  height: 400px;
  overflow: hidden;
  position: relative;
  width: 900px;
}

.navigation-buttons {
  display: inherit;
  align-items: center;
  flex-direction: row;
  justify-content: center;
}

.slider_navigation {
  margin-top: 1rem;
  display: flex;
  flex-direction: row;
  height: 20px;
  justify-content: space-between;
  position: relative;
  width: 100%;
}

.loader {
  background-color: white;
  background-image: url("loading.gif");
  background-position: center center;
  background-repeat: no-repeat;
  background-size: 150px;
  height: 100%;
  position: absolute;
  width: 100%;
  z-index: 300;
}

input { display: none; }

input:checked ~ .checkmark:after { display: block; }

input:checked ~ .checkmark { background-color: #2196F3; }

.autoplay-sub {
  float: left;
  line-height: 30px;
  font-size: 0.7rem;
}

.checkmark { float: left; }

.checkmark:after {
  content: "";
  position: absolute;
  display: none;
  left: 11px;
  top: 7px;
  width: 5px;
  height: 10px;
  border: solid white;
  border-width: 0 3px 3px 0;
  -webkit-transform: rotate(45deg);
  transform: rotate(45deg);
}

.button-left:after, .button-right:after {
  border: solid white;
  border-width: 0 3px 3px 0;
  content: "";
  display: block;
  height: 8px;
  position: absolute;
  width: 8px;
}

.button-left:after {
  left: 11px;
  top: 10px;
  -webkit-transform: rotate(135deg);
  transform: rotate(135deg);
}

.button-right:after {
  left: 7px;
  top: 10px;
  -webkit-transform: rotate(-45deg);
  transform: rotate(-45deg);
}

.inright {
  -webkit-animation: goInL 0.5s cubic-bezier(1, 1.59, 0.61, 0.74);
  animation: goInL 0.5s cubic-bezier(1, 1.59, 0.61, 0.74);
  position: relative;
  z-index: 300 !important;
}

@-webkit-keyframes 
goInL {  0% {
 left: -900px;
}
 100% {
 left: 0;
}
}

@keyframes 
goInL {  0% {
 left: -900px;
}
 100% {
 left: 0;
}
}

.outright {
  -webkit-animation: goOutL 0.5s cubic-bezier(1, 1.59, 0.61, 0.74);
  animation: goOutL 0.5s cubic-bezier(1, 1.59, 0.61, 0.74);
  position: relative;
  z-index: 200;
}

@-webkit-keyframes 
goOutL {  0% {
 left: 0;
}
 100% {
 left: 900px;
}
}

@keyframes 
goOutL {  0% {
 left: 0;
}
 100% {
 left: 900px;
}
}

.inleft {
  -webkit-animation: goInR 0.5s cubic-bezier(1, 1.59, 0.61, 0.74);
  animation: goInR 0.5s cubic-bezier(1, 1.59, 0.61, 0.74);
  position: relative;
  z-index: 300 !important;
}

@-webkit-keyframes 
goInR {  0% {
 left: 900px;
}
 100% {
 left: 0;
}
}

@keyframes 
goInR {  0% {
 left: 900px;
}
 100% {
 left: 0;
}
}

.outleft {
  -webkit-animation: goOutR 0.5s cubic-bezier(1, 1.59, 0.61, 0.74);
  animation: goOutR 0.5s cubic-bezier(1, 1.59, 0.61, 0.74);
  position: relative;
  z-index: 200;
}

@-webkit-keyframes 
goOutR {  0% {
 left: 0;
}
 100% {
 left: -900px;
}
}

@keyframes 
goOutR {  0% {
 left: 0;
}
 100% {
 left: -900px;
}
}

.pic {
  left: 0;
  min-height: 400px;
  -o-object-fit: cover;
  object-fit: cover;
  position: absolute;
  top: 0;
  width: 900px;
}

.pic:first-child { z-index: 100; }

Load the necessary JavaScript file at the end of the document. Done.

<script src="script.js"></script>

Override the default variables to customize the slider.

const autoBox = document.querySelector("input[name=autoplay]"),
      autoDir   = "left", // left or right
      btnLeft   = document.querySelector(".button-left"),
      btnRight  = document.querySelector(".button-right"),
      loader    = document.createElement("div"),
      counter   = document.querySelector(".slide_counter"),
      slider    = document.querySelector(".slides"),
      slides    = document.querySelectorAll(".slides img"),
      speed     = 2000; // = 2s

You Might Be Interested In:


Leave a Reply