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() {
...