Skantzy Ответов: 1

Как сделать мой образ карусельной петлей


В настоящее время я пытаюсь Создать карусель изображений для веб-сайта, и у меня возникла проблема. Карусель не петляет, вместо этого, когда она достигает последнего изображения, она скользит назад к первому изображению, открывая изображения между ними. Я хочу, чтобы он вернулся к первому, не скользя полностью назад.

HTML:
<pre> ...<div class="carousel-container">
    
    
    <div class="carousel-slide">
        <img src="./img/testpic3.jpg" id="lastClone" alt="">
        <img src="./img/testpic1.jpg" alt="">
        <img src="./img/testpic2.jpg" alt="">
        <img src="./img/testpic3.jpg" alt="">
        <img src="./img/testpic1.jpg" id="firstClone" alt="">
    </div>
</div>


CSS
.carousel-container {
     width: 70%;
     max-height: 800px;
     margin: auto;
     margin-top: 1%;
     overflow: hidden;
     border: 5px solid white;
 }
 
 .carousel-slide {
     display: flex;
     width: 100%;
     height: 400px;
 }
 
 #prevBtn {
     position: absolute;
     top: 45%;
     z-index: 10;
     left: 20%;
     font-size: 50px;
     color: white;
     opacity: 0.5;
     cursor: pointer;
 }
 
 #nextBtn {
     position: absolute;
     top: 45%;
     z-index: 10;
     right: 20%;
     font-size: 50px;
     color: white;
     opacity: 0.5;
     cursor: pointer;
 }

язык JavaScript:
const carouselSlide = document.querySelector('.carousel-slide');
const carouselImages = document.querySelectorAll('.carousel-slide img');


const prevBtn = document.querySelector('#prevBtn');
const nextBtn = document.querySelector('#nextBtn');


let counter = 1;
const size = carouselImages[0].clientWidth;

carouselSlide.style.transform = 'translateX(' + (-carouselImages[0].clientWidth * counter) + 'px)';

var interval = 3000;
setInterval(function() {
    var offset = counter % (carouselImages.length - 2);
    carouselSlide.style.transition = "transform 0.4s ease-in-out";
    carouselSlide.style.transform = 'translateX(' + (-carouselImages[0].clientWidth * counter) + 'px)';
    counter++;


    if (offset == 0) counter = 1; // to reset counter so next and prev button should work 

}, interval);


Что я уже пробовал:

Я попытался добавить идентификатор счетчика, который я абсолютно уверен, что это неправильно

var interval = 3000;
setInterval(function() {
    var offset = counter % (carouselImages.length - 2);
    carouselImages[counter].id === 'firstClone';
    carouselSlide.style.transition = "transform 0.4s ease-in-out";
    carouselSlide.style.transform = 'translateX(' + (-carouselImages[0].clientWidth * counter) + 'px)';
    counter++;


    if (offset == 0) counter = 1; // to reset counter so next and prev button should work 

}, interval);

1 Ответов

Рейтинг:
2

Luc Pattyn

Привет,

да, длина-2 не будет сокращать его.


если вам нужен счетчик, который идет 0, 1, 2, ... N-1, 0, 1, 2 и т. д. Просто используйте:

counter=(counter+1)%N;

он явно увеличивается/оборачивается и остается в интервале [0, N-1].


Если вам понадобится счетчик, который идет 1, 2, ... N, 1, 2 (я не ожидаю, что вам это понадобится), то используйте:
counter=(counter%N)+1;

который также увеличивает/оборачивает и остается в интервале [1, N].


Кстати: использование списка изображений с дубликатами несколько усложняет отладку; вы должны использовать простой список изображений, которые вы можете сразу распознать.


Почему бы вам не взглянуть на то, что уже работает?
Карусель · Загрузочный[^] является примером, и вы можете увидеть весь его код, используя "View Source" или любую другую команду, вызываемую в вашем браузере.

:)