I want to preview prev/last slide by hovering the prev/next buttons. The problem is I can’t target the last slide when I’m at first slide (or vice versa) and it breaks the feature. How can I fix it?
const swiper = new Swiper('.swiper', {
direction: 'horizontal',
loop: true,
pagination: {
el: '.swiper-pagination'
},
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev'
},
scrollbar: {
el: '.swiper-scrollbar'
},
});
const swiperWrapper = document.querySelector('.swiper-wrapper');
const prevButton = document.querySelector('.swiper-button-prev');
const nextButton = document.querySelector('.swiper-button-next');
function updateClassesAndTransforms(direction) {
const slides = Array.from(swiper.slides);
const activeIndex = swiper.activeIndex;
const slideCount = slides.length;
slides.forEach(slide => {
slide.classList.remove('swiper-slide-prev', 'swiper-slide-next');
slide.style.transition = 'transform 0.3s';
slide.style.transform = 'translateX(0px)';
});
const prevIndex = (activeIndex - 1 + slideCount) % slideCount;
const nextIndex = (activeIndex + 1) % slideCount;
const prevSlide = swiper.slides[prevIndex];
const nextSlide = swiper.slides[nextIndex];
const activeSlide = swiper.slides[activeIndex];
if (prevSlide) {
prevSlide.classList.add('swiper-slide-prev');
}
if (nextSlide) {
nextSlide.classList.add('swiper-slide-next');
}
requestAnimationFrame(() => {
if (direction === 'prev' && prevSlide) {
prevSlide.style.transform = 'translateX(5.5vw)';
activeSlide.style.transform = 'translateX(5.5vw)';
} else if (direction === 'next' && nextSlide) {
nextSlide.style.transform = 'translateX(-5.5vw)';
activeSlide.style.transform = 'translateX(-5.5vw)';
}
});
}
function handleButtonClick(direction) {
if (direction === 'prev') {
swiper.slidePrev();
} else if (direction === 'next') {
swiper.slideNext();
}
updateClassesAndTransforms(direction);
}
function handleButtonHover(direction) {
updateClassesAndTransforms(direction);
}
function resetTransforms() {
updateClassesAndTransforms('reset');
}
prevButton.addEventListener('click', () => handleButtonClick('prev'));
nextButton.addEventListener('click', () => handleButtonClick('next'));
prevButton.addEventListener('mouseover', () => handleButtonHover('prev'));
prevButton.addEventListener('mouseout', resetTransforms);
nextButton.addEventListener('mouseover', () => handleButtonHover('next'));
nextButton.addEventListener('mouseout', resetTransforms);
swiper.on('reachBeginning', () => {
updateClassesAndTransforms('prev');
});
swiper.on('reachEnd', () => {
updateClassesAndTransforms('next');
});
swiper.on('init', () => {
updateClassesAndTransforms('reset');
});
swiper.on('slideChange', () => {
updateClassesAndTransforms('reset');
});
.swiper {
width: 100%;
height: 100px;
}
.swiper-slide {
background-color: bisque;
transition: transform 0.3s;
}
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.css" />
<script src="https://cdn.jsdelivr.net/npm/swiper@11/swiper-bundle.min.js"></script>
<div class="swiper">
<div class="swiper-wrapper">
<div class="swiper-slide">Slide 1</div>
<div class="swiper-slide">Slide 2</div>
<div class="swiper-slide">Slide 3</div>
<div class="swiper-slide">Slide 4</div>
<div class="swiper-slide">Slide 5</div>
</div>
<div class="swiper-pagination"></div>
<div class="swiper-button-prev"></div>
<div class="swiper-button-next"></div>
<div class="swiper-scrollbar"></div>
</div>
I tried to use swiper API but couldn’t succeed. I know there is a much better way to solve this problem but I’m not that good with javascript.
tekne is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.