OP Slider

by studiomatrix

HTML

<!doctype html>
<html lang="en">

  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>OP Slider</title>
  </head>

  <body>
    <section id="op-container">
      <div class="op-wrapper">
        <section id="slide-1" class="slide-item slide-1">
          <div class="slide-content">
            <p>one</p>
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ab atque, distinctio doloremque esse eum fugiat iusto neque, officiis quo quod rem repellendus rerum sed. Inventore magnam modi tenetur unde ut.</p>
          </div>
        </section>
        <section id="slide-2" class="slide-item slide-2">
          <div class="slide-content">
            <p>two</p>
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ab atque, distinctio doloremque esse eum fugiat iusto neque, officiis quo quod rem repellendus rerum sed. Inventore magnam modi tenetur unde ut.</p>
          </div>
        </section>
        <section id="slide-3" class="slide-item slide-3">
          <div class="slide-content">
            <p>three</p>
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ab atque, distinctio doloremque esse eum fugiat iusto neque, officiis quo quod rem repellendus rerum sed. Inventore magnam modi tenetur unde ut.</p>
          </div>
        </section>
        <section id="slide-4" class="slide-item slide-3">
          <div class="slide-content">
            <p>four</p>
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ab atque, distinctio doloremque esse eum fugiat iusto neque, officiis quo quod rem repellendus rerum sed. Inventore magnam modi tenetur unde ut.</p>
          </div>
        </section>

      </div>
    </section>
  </body>

</html>

CSS

html,
body {
  margin: 0;
  padding: 0;
  height: 100%;
  width: 100%;
}

*,
*:after,
*:before {
  text-rendering: optimizeLegibility;
  box-sizing: border-box;
  -webkit-font-smoothing: antialiased
}

.op-nav div {
  height: 100%;
  width: 5%;
  position: fixed;
  top: 0;
  z-index: 1000;
  cursor: pointer;
}

.op-nav div.op-nav-right {
  right: 0;
}

.op-outer {
  overflow-x: hidden;
  position: relative;
  width: 100%;
  min-height: 100%;
}

.op-outer .op-wrapper .slide-item {
  position: absolute;
  width: 96%;
  top: 0;
  left: 96%;
  height: 100%;
  z-index: 1;
  padding: 0;
  visibility: hidden;
  -moz-transition: visibility calc(var(--transitiontime) * 1.5) ease;
  -webkit-transition: visibility calc(var(--transitiontime) * 1.5) ease;
  -o-transition: visibility calc(var(--transitiontime) * 1.5) ease;
  transition: visibility calc(var(--transitiontime) * 1.5) ease;
}


.op-outer .op-wrapper .active-item,
.op-outer .op-wrapper .prev-item,
.op-outer .op-wrapper .next-item {
  -moz-transition: left var(--transitiontime) ease, visibility calc(var(--transitiontime) * 1.5) ease;
  -webkit-transition: left var(--transitiontime) ease, visibility calc(var(--transitiontime) * 1.5) ease;
  -o-transition: left var(--transitiontime) ease, visibility calc(var(--transitiontime) * 1.5) ease;
  transition: left var(--transitiontime) ease, visibility calc(var(--transitiontime) * 1.5) ease;
}

.op-outer .op-wrapper .next-item {
  visibility: visible;
  z-index: 2;
}

.op-outer .op-wrapper .prev-item {
  left: 0;
}

.op-outer .op-wrapper .active-item {
  z-index: 3;
  left: 0;
  visibility: visible;
}

.moving-right {
  z-index: 4 !important;
}


.op-outer .op-wrapper .next-item {
  left: 96%;
}

.op-outer .op-wrapper #slide-1 {
  background: green;
}

.op-outer .op-wrapper #slide-2,
.op-outer .op-wrapper #slide-5 {
  background: blue;
}

.op-outer .op-wrapper #slide-3,
.op-outer .op-wrapper #slide-6 {
  background: red;
}

.op-outer .op-wrapper #slide-4 {
  background:...

JavaScript

var OPSlider = (function() {
  function OPSlider(selector, transitionTime) {
    this.selector = selector;
    this.transitionTime = transitionTime;
    this.isSliding = false;
    this.transitions = {
      "transition": "transitionend",
      "OTransition": "oTransitionEnd",
      "MozTransition": "transitionend",
      "WebkitTransition": "webkitTransitionEnd"
    };
    this.wrapper = this.selector.querySelector('.op-wrapper');
    var items = this.wrapper.querySelectorAll('.slide-item');
    this._itemsClone(items);
    this.sections = Array.prototype.slice.call(this.wrapper.querySelectorAll('.slide-item'));
    this.sectionsCount = this.sections.length;
    this.current = 0;
    this.init();
  }
  OPSlider.prototype.init = function() {
    var _this = this;
    if (this.sectionsCount < 2) {
      console.log('Need minimum two slides');
      return;
    }
    // set transition time to :root to be used by CSS
    document.documentElement.style.setProperty('--transitiontime', this.transitionTime.toString() + "ms");
    // find which transitionEnd is being used by the browser
    this.sectionTransition = this._transitionFinder();
    //Setup initial Classes to the slider
    this.selector.classList.add('op-outer');
    this.sections[this.current].classList.add('active-item');
    this.sections[this.current + 1].classList.add('next-item');
    this.sections[this.sectionsCount - 1].classList.add('prev-item');
    // Setup Left Right Navigation
    var navLeft = document.createElement('div'),
      navRight = document.createElement('div'),
      nav = document.createElement('nav');
    navLeft.className = 'op-nav-left';
    navRight.className = 'op-nav-right';
    nav.className = 'op-nav';
    nav.appendChild(navLeft);
    nav.appendChild(navRight);
    this.selector.insertBefore(nav, this.wrapper);
    navLeft.addEventListener('click', function() {
      _this._navigate('prev');
    });
    navRight.addEventListener('click', function() {
     ...