JSFiddle - React, Tailwind, and code Playground
by BurpmanJunior
HTML
<div data-slider>
<ul>
<li style="background-image: url(http://lorempixel.com/1280/800/nature/);"></li>
<li style="background-image: url(http://lorempixel.com/1280/800/abstract/);"></li>
<li style="background-image: url(http://lorempixel.com/1280/800/city/);"></li>
</ul>
</div>
CSS
/** DEMO ONLY CSS **/
body {
margin: 0;
padding: 0;
}
/** SLIDER **/
[data-slider], [data-slider] * {
box-sizing: border-box;
}
[data-slider] {
width: 100%;
position: relative;
transition: opacity 600ms;
-webkit-transition: opacity 600ms;
-moz-transition: opacity 600ms;
-ms-transition: opacity 600ms;
-o-transition: opacity 600ms;
opacity: 0;
}
[data-slider].slider-init {
opacity: 1;
}
[data-slider] > ul:not(.slider-controls) {
position: relative;
margin: 0;
padding: 0;
height: 100vh;
transition: height 300ms;
-webkit-transition: height 300ms;
-moz-transition: height 300ms;
-ms-transition: height 300ms;
-o-transition: height 300ms;
}
[data-slider] > ul:not(.slider-controls) > li {
list-style-type: none;
display: block;
position: absolute;
width: 100%;
height: 100%;
overflow: hidden;
background-size: cover;
background-position: center center;
padding: 15px;
color: #fff;
}
[data-slider] ul.slider-controls {
display: block;
position: absolute;
margin: 0;
padding: 0;
bottom: 4px;
width: 100%;
z-index: 3;
text-align: center;
line-height: 1.6;
}
[data-slider] ul.slider-controls li {
list-style-type: none;
display: inline-block;
font-size: 0;
text-indent: -9999px;
width: 12px;
height: 12px;
border-radius: 6px;
margin: 0 4px;
border: 2px solid #fff;
background-color: rgba(0, 0, 0, 0.3);
cursor: pointer;
box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);
transition: border-width 300ms;
-webkit-transition: border-width 300ms;
-moz-transition: border-width 300ms;
-ms-transition: border-width 300ms;
-o-transition: border-width 300ms;
vertical-align: middle;
}
[data-slider] ul.slider-controls li.active {
border-width: 6px;
}
JavaScript
/**
* Slider
* @type {Object}
*/
var slider = {
elems: $('[data-slider]'),
slideDelay: 6000,
animationDuration: 800,
sliderData: {},
init: function () {
var _s = this;
var i = 0;
_s.elems.each(function () {
var v = {
elem: $(this),
totalSlides: $('> ul:not(.slider-controls) > li', this).length,
currentSlide: 1
}
if (v.totalSlides > 0) {
var c = 1;
$('> ul:not(.slider-controls) > li', this).each(function () {
if (c == 1) {
$(this).addClass('active');
} else {
$(this).hide();
}
c++;
});
_s.sliderData[i] = v;
_s.sliderSetup(i);
_s.buildDOM(i);
i++;
} else {
$(this).remove();
}
v.elem.addClass('slider-init');
});
_s.bindControls();
},
buildDOM: function (i) {
var _s = slider;
var elem = _s.sliderData[i];
$(elem.elem).append($('<ul />').addClass('slider-controls'));
var controls = $('ul.slider-controls', elem.elem);
for (var c = 0; c < elem.totalSlides; c++) {
var n = (c + 1);
controls.append($('<li />').html(n).attr('data-slider-controls', i).attr('data-slide', n));
}
},
bindControls: function () {
var _s = slider;
var c = 1;
$('ul.slider-controls > li:not([data-bound])').each(function () {
$(this).attr('data-bound', true).click(function (e) {
e.preventDefault();
_s.goToSlide($(this).data('slider-controls'), $(this).data('slide'));
return false;
});
if (c == _s.sliderData[$(this).data('slider-controls')].currentSlide) {
...