Карусель — отличный способ предоставить пользователям информацию. Это похоже на слайд-шоу данных, которые зритель может просмотреть. Это эффективный способ создать интерактивный пользовательский опыт.
В этом посте я поделюсь своим опытом использования каруселей. Я работал над приложением NextJS и использовал компоненты Bootstrap. Добавить простую карусель Bootstrap очень просто. Вы можете напрямую вставить код с Веб-сайта Bootstrap и обновить его данными, которые вы хотите отобразить под carousel-item
.
... <div id="singleCarousel" class="carousel slide carousel-dark" data-bs-ride="carousel" > <div class="carousel-inner" role="listbox"> <div class="carousel-item active"> <div class="col"> <div class="card-img"> <img src="https://via.placeholder.com/700x500.png/f87171/333333?text=1" class="img-fluid" /> </div> </div> </div> <div class="carousel-item"> <div class="col"> <div class="card-img"> <img src="https://via.placeholder.com/700x500.png/fdba74/333333?text=2" class="img-fluid" /> </div> </div> </div> ...
И результат:
В каруселях Bootstrap доступны различные варианты/функции. Вы можете проверить это здесь".
Но мне нужно было больше настройки. Мне нужно было отображать несколько слайдов одновременно. Итак, моей первой мыслью было добавить несколько элементов в div
с классом carousel-item
.
<div class="carousel-item active "> <div class="col"> <div class="card-img"> <img src="https://via.placeholder.com/300x300.png/f87171/333333?text=1" class="img-fluid m-1" /> <img src="https://via.placeholder.com/300x300.png/fdba74/333333?text=2" class="img-fluid m-1" /> <img src="https://via.placeholder.com/300x300.png/bef264/333333?text=3" class="img-fluid m-1" /> <img src="https://via.placeholder.com/300x300.png/f87171/333333?text=4" class="img-fluid m-1" /> </div> </div> </div> ...
И вот как это стало:
Но теперь одновременно прокручивались четыре слайда. Я хотел заставить его двигаться по одному слайду за раз. Для этого потребовалось некоторое дополнительное кодирование.
Во-первых, я снова разделил слайды на разные div's
с классом carousel-item
:
... <div class="carousel-inner" role="listbox"> <div class="carousel-item active"> <div class="col-md-3"> <div class="card"> <div class="card-img"> <img src="https://via.placeholder.com/700x500.png/f87171/333333?text=1" class="img-fluid"/> </div> </div> </div> </div> <div class="carousel-item" data-bs-interval="1000"> <div class="col-md-3"> <div class="card"> <div class="card-img"> <img src="https://via.placeholder.com/700x500.png/fdba74/333333?text=2" class="img-fluid"/> </div> </div> </div> </div> ...
Затем добавил код для добавления необходимого количества слайдов, которые я хотел отображать одновременно:
let items = document.querySelectorAll('.carousel .carousel-item') //Selects carousel items items.forEach((el) => { const minPerSlide = 4 // Number of slides per carousel item let next = el.nextElementSibling //selecting the next slide in carousel for (var i=1; i<minPerSlide; i++) { if (!next) { //checks if there is a next slide in carousel, else appends the first slide next = items[0] } let cloneChild = next.cloneNode(true) //clones the next node el.appendChild(cloneChild.children[0]) //appends the first slide in node to the current slide next = next.nextElementSibling //selects the next slide } }
Этот код необходимо выполнить сразу после рендеринга компонента. Итак, мы используем хук useEffect компонента.
После этого последний шаг — обновить код CSS, чтобы переходить слайды по одному:
/* To display slides in a row */ .carousel-inner .carousel-item.active, .carousel-inner .carousel-item-next, .carousel-inner .carousel-item-prev { display: flex; } /* For transition */ .carousel-inner .carousel-item-end.active, .carousel-inner .carousel-item-next { transform: translateX(25%); } .carousel-inner .carousel-item-start.active, .carousel-inner .carousel-item-prev { transform: translateX(-25%); } .carousel-inner .carousel-item-end, .carousel-inner .carousel-item-start { transform: translateX(0); }
И получаем окончательный результат:
Вот и все! В другой теме, в следующий раз :)