JSFiddle - React, Tailwind, and code Playground
HTML
<div id="block-for-slider">
<div id="viewport">
<ul id="slidewrapper">
<li class="slide"><img src="https://hsto.org/files/8d4/b19/80d/8d4b1980d48c418090e2c4466d8c06e1.jpg" alt="1" class="slide-img"></li>
<li class="slide"><img src="https://hsto.org/files/ef1/3d7/97e/ef13d797e4c642c7a1d4b2b91f7ad7b3.jpg" alt="2" class="slide-img"></li>
<li class="slide"><img src="https://hsto.org/files/ec5/592/f1e/ec5592f1e814401eb38305682a8e88d4.jpg" alt="3" class="slide-img"></li>
<li class="slide"><img src="https://hsto.org/files/eda/61a/3c5/eda61a3c53db408d820643998d9acd81.jpg" alt="4" class="slide-img"></li>
</ul>
<div id="prev-next-btns">
<div id="prev-btn"></div>
<div id="next-btn"></div>
</div>
<ul id="nav-btns">
<li class="slide-nav-btn"></li>
<li class="slide-nav-btn"></li>
<li class="slide-nav-btn"></li>
<li class="slide-nav-btn"></li>
</ul>
</div>
</div>
CSS
body {
margin: 0;
padding: 0;
}
#block-for-slider {
width: 80%;
margin: 0 auto;
margin-top: 100px;
}
#viewport {
width: 100%;
position: relative;
overflow: hidden;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;
text-align: center;
}
#slidewrapper {
position: relative;
width: calc(100% * 4);
-webkit-transition: 1s;
-o-transition: 1s;
transition: 1s;
-webkit-transition-timing-function: cubic-bezier(.67,.01,.23,1);
-o-transition-timing-function: cubic-bezier(.67,.01,.23,1);
transition-timing-function: cubic-bezier(.67,.01,.23,1);
}
#slidewrapper, #slidewrapper ul, #slidewrapper li {
margin: 0;
padding: 0;
}
.slide {
width: calc(100%/4);
list-style: none;
display: inline;
float: left;
}
.slide-img {
width: 100%;
}
#prev-btn, #next-btn {
position: absolute;
width: 50px;
height: 50px;
background-color: #fff;
border-radius: 50%;
top: calc(50% - 25px);
}
#prev-btn:hover, #next-btn:hover {
cursor: pointer;
}
#prev-btn {
left: 20px;
}
#next-btn {
right: 20px;
}
#nav-btns {
position: absolute;
width: 100%;
bottom: 20px;
padding: 0;
margin: 0;
text-align: center;
}
.slide-nav-btn {
position: relative;
display: inline-block;
list-style: none;
width: 20px;
height: 20px;
background-color: #fff;
border-radius: 50%;
margin: 3px;
}
.slide-nav-btn:hover {
cursor: pointer;
}
JavaScript
var slideNow = 1;
var slideCount = $('#slidewrapper').children().length;
var slideInterval = 3000;
var navBtnId = 0;
var translateWidth = 0;
$(document).ready(function() {
var switchInterval = setInterval(nextSlide, slideInterval);
$('#viewport').hover(function() {
clearInterval(switchInterval);
}, function() {
switchInterval = setInterval(nextSlide, slideInterval);
});
$('#next-btn').click(function() {
nextSlide();
});
$('#prev-btn').click(function() {
prevSlide();
});
$('.slide-nav-btn').click(function() {
navBtnId = $(this).index();
if (navBtnId + 1 != slideNow) {
translateWidth = -$('#viewport').width() * (navBtnId);
$('#slidewrapper').css({
'transform': 'translate(' + translateWidth + 'px, 0)',
'-webkit-transform': 'translate(' + translateWidth + 'px, 0)',
'-ms-transform': 'translate(' + translateWidth + 'px, 0)',
});
slideNow = navBtnId + 1;
}
});
});
function nextSlide() {
if (slideNow == slideCount || slideNow <= 0 || slideNow > slideCount) {
$('#slidewrapper').css('transform', 'translate(0, 0)');
slideNow = 1;
} else {
translateWidth = -$('#viewport').width() * (slideNow);
$('#slidewrapper').css({
'transform': 'translate(' + translateWidth + 'px, 0)',
'-webkit-transform': 'translate(' + translateWidth + 'px, 0)',
'-ms-transform': 'translate(' + translateWidth + 'px, 0)',
});
slideNow++;
}
}
function prevSlide() {
if (slideNow == 1 || slideNow <= 0 || slideNow > slideCount) {
translateWidth = -$('#viewport').width() * (slideCount - 1);
$('#slidewrapper').css({
'transform': 'translate(' + translateWidth + 'px, 0)',
'-webkit-transform': 'translate(' + translateWidth + 'px, 0)',
'-ms-transform': 'translate(' +...