Как сделать чтобы при наведении на элемент слайда он увеличивался, а остальные видимые элементы уменьшались?

Пытаюсь сделать карусель, который при наведении на слайд будет его увеличивать по ширине а остальные уменьшать. 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 шт):

Автор решения: De.Minov

У 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>

→ Ссылка