Как сделать чтобы при наведении на элемент слайда он увеличивался, а остальные видимые элементы уменьшались?
Пытаюсь сделать карусель, который при наведении на слайд будет его увеличивать по ширине а остальные уменьшать. https://imgur.com/a/S13FBof вот скрин дизайна слайдера (не смог по какой то причине напрямую добавить скрин). Не смог в интернете найти такой же слайдер, чтобы посмотреть как они это реализовали. https://aliserb.github.io/liya/ вот как я его реализовал, но то что я сделал мне не нравится, потому что в консоли браузера выходят ошибки которых я не понимаю как исправить) и появляются проблемы при адаптиве этого слайдера. По сути я сделал так, чтобы при наведении на слайд выдается ширина 212px для слайдов которые в зоне видимости и имеют класс swiper-slide-visible и ширина 100% когда курсор уходит. Дальше в css добавил hover и 566px ширины.
let aboutSliderItem = document.querySelectorAll('.about_slider_item');
aboutSliderItem.forEach((aboutSliderLoop) => {
// let itemPar = querySelector(".about_info .p");
let sliderWidthReduce = () => {
for (let i = 0; aboutSliderItem.length; i++) {
if (aboutSliderItem[i].classList.contains("swiper-slide-visible")) {
aboutSliderItem[i].style.width = "212px";
}
}
}
let sliderWidthreturn = () => {
for (let i = 0; aboutSliderItem.length; i++) {
aboutSliderItem[i].style.width = "100%";
}
}
aboutSliderLoop.addEventListener('mouseover', sliderWidthReduce);
aboutSliderLoop.addEventListener('mouseout', sliderWidthreturn);
})
Как можно сделать этот слайдер лучше и адаптивным))
Ответы (1 шт):
У Swiper'а есть параметр watchSlidesProgress, включив который на слайдах будет появляться класс .swiper-slide-visible (по дефолту, можно изменить параметром slideVisibleClass), которое странно себя ведёт при использование числовых значений в параметре slidesPerView, которое указывает кол-во отображаемых слайдов (странность заключается в том, что при slidesPerView: 3 есть только один .swiper-slide-visible), при этом всё работает как нужно, когда slidesPerView: 'auto', с этого я и начал.
Отступы сделал не через spaceBetween, а через обёртку (.swiper-slide-wrapper), которой задал ширину width: calc(100% - *отступ*).
Анимация работает следующим образом:
- Дефолтное состояние: ширина
.swiper-slideравнаwidth: calc(100% / 3)- что отобразит 3 слайда. - При наведении: ширина всех
.swiper-slide-visible, кроме того, на котором:hover, равнаwidth: 25%, тот что имеет:hover-width: 50%.
const swiper = new Swiper('.swiper', {
slidesPerView: 'auto',
spaceBetween: 0,
watchSlidesProgress: true
});
@import url(https://cdn.jsdelivr.net/npm/swiper@8/swiper-bundle.min.css);
.swiper {
display: block;
width: 500px;
height: 150px;
margin: 0 auto;
}
.swiper-slide {
width: calc(100% / 3);
height: 100%;
transition: width .3s ease;
}
.swiper-wrapper:hover .swiper-slide-visible:not(:hover) {
width: 25%;
}
.swiper-slide-visible:hover {
width: 50%;
}
.swiper-slide-wrapper {
display: flex;
justify-content: center;
align-items: center;
width: calc(100% - 20px);
height: 100%;
background: #ccc;
}
<script src="https://cdn.jsdelivr.net/npm/swiper@8/swiper-bundle.min.js"></script>
<div class="swiper">
<div class="swiper-wrapper">
<div class="swiper-slide">
<div class="swiper-slide-wrapper">Slide 1</div>
</div>
<div class="swiper-slide">
<div class="swiper-slide-wrapper">Slide 2</div>
</div>
<div class="swiper-slide">
<div class="swiper-slide-wrapper">Slide 3</div>
</div>
<div class="swiper-slide">
<div class="swiper-slide-wrapper">Slide 4</div>
</div>
<div class="swiper-slide">
<div class="swiper-slide-wrapper">Slide 5</div>
</div>
<div class="swiper-slide">
<div class="swiper-slide-wrapper">Slide 6</div>
</div>
<div class="swiper-slide">
<div class="swiper-slide-wrapper">Slide 7</div>
</div>
</div>
</div>