JSFiddle - React, Tailwind, and code Playground
by Jordan Sayner
HTML
<div class="slider" data-slider>
<div class="slider__slides">
<div class="slider__slide" style="background-color: #ff6347;">Slide 1</div>
<div class="slider__slide" style="background-color: #4682b4;">Slide 2</div>
<div class="slider__slide" style="background-color: #32cd32;">Slide 3</div>
</div>
<button class="prev">❮</button>
<button class="next">❯</button>
<div class="slider__info">
<span class="current-slide">1</span> / <span class="total-slides"></span>
</div>
</div>
<div class="slider" data-slider>
<div class="slider__slides">
<div class="slider__slide" style="background-color: #ffa500;">Slide 1</div>
<div class="slider__slide" style="background-color: #800080;">Slide 2</div>
<div class="slider__slide" style="background-color: #00ced1;">Slide 3</div>
</div>
<button class="prev">❮</button>
<button class="next">❯</button>
<div class="slider__info">
<span class="current-slide">1</span> / <span class="total-slides"></span>
</div>
</div>
CSS
body {
font-family: Arial, sans-serif;
display: flex;
flex-direction: column;
align-items: center;
gap: 20px;
margin: 0;
padding: 20px;
background-color: #f0f0f0;
}
.slider {
position: relative;
width: 80%;
max-width: 600px;
overflow: hidden;
border-radius: 10px;
box-shadow: 0 4px 10px rgba(0,0,0,0.1);
}
.slider__slides {
display: flex;
transition: transform 0.5s ease-in-out;
}
.slider__slide {
min-width: 100%;
aspect-ratio: 16/9;
padding: 40px;
box-sizing: border-box;
color: white;
text-align: center;
font-size: 24px;
}
button {
position: absolute;
top: 50%;
transform: translateY(-50%);
background-color: rgba(0,0,0,0.5);
color: white;
border: none;
padding: 10px;
cursor: pointer;
z-index: 1000;
}
button.prev {
left: 10px;
}
button.next {
right: 10px;
}
button:hover {
background-color: rgba(0,0,0,0.8);
}
JavaScript
const sliders = document.querySelectorAll('[data-slider]');
sliders.forEach(slider => {
const slides = slider.querySelector('.slider__slides');
const slideElements = slider.querySelectorAll('.slider__slide');
const slideCount = slideElements.length;
const currentSlideElement = slider.querySelector('.current-slide');
const totalSlidesElement = slider.querySelector('.total-slides');
let currentIndex = 0;
// Set the total number of slides in the slider__info element
totalSlidesElement.textContent = slideCount;
const updateSlidePosition = () => {
slides.style.transform = `translateX(-${currentIndex * 100}%)`;
// Update the current slide number
currentSlideElement.textContent = currentIndex + 1;
};
const handleResize = () => {
updateSlidePosition();
};
window.addEventListener('resize', handleResize);
slider.querySelector('.next').addEventListener('click', () => {
currentIndex = (currentIndex + 1) % slideCount;
updateSlidePosition();
});
slider.querySelector('.prev').addEventListener('click', () => {
currentIndex = (currentIndex - 1 + slideCount) % slideCount;
updateSlidePosition();
});
// Initial update to set the correct positions and slide number
updateSlidePosition();
});