Swiper.js Изменить размер слайда слева и справа от центра

Я только изучаю JavaScript и столкнулся с проблемой.

Ниже я попытался описать структуру и как должно отображаться.

Структура слайдера:

  • На странице отображается 5 слайдов в ряд из общего количества N.
  • Центральный слайд всегда активен.
  • По бокам от центрального расположены 4 неактивных слайда (по два с каждой стороны).

Активный слайд (центр):

  • Размер: 320 × 536 px

  • Отображается картинка и контент (описание)

Неактивные слайды:

  • Контент скрыт (видна только картинка).

  • Ближайшие к центру (2 слайда): Размер: 200 × 200 px

  • Крайние (2 слайда): Размер: 100 × 100 px

При переключении активный слайд становится меньше, а не активный перемещается в центр и принимает правила активного(становится больше и появляется текст) и все слайды подстраиваются под заданные размеры.

Если я пробую изменить размеры неактивных слайдов через scale, слайдер ломается.

Прикрепляю скриншот, что именно я хочу сделать..

Центральный слайд активный. Не активные меньше

Спасибо заранее. На данном этапе мне все это кажется сложным.

 <div class="container">
     <div class="swiper">
          <div class="swiper-wrapper">
            <div class="swiper-slide">
              <img class="slider__img" src="" alt="">
              <div class="slider__content"></div>
            </div>
            <div class="swiper-slide">
              <img class="slider__img" src="" alt="">
              <div class="slider__content"></div>
            </div>
            <div class="swiper-slide">
              <img class="slider__img" src="" alt="">
              <div class="slider__content"></div>
            </div>
            <div class="swiper-slide">
              <img class="slider__img" src="" alt="">
              <div class="slider__content"></div>
            </div>
            <div class="swiper-slide">
              <img class="slider__img" src="" alt="">
              <div class="slider__content"></div>
            </div>
            <div class="swiper-slide">
              <img class="slider__img" src="" alt="">
              <div class="slider__content"></div>
            </div>
        </div>
    </div>

Ответы (2 шт):

Автор решения: chxsk

Для реализации слайдера с таким поведением лучше всего использовать комбинацию CSS-трансформаций и JavaScript (или готовую библиотеку типа Swiper с кастомными модификациями)

→ Ссылка
Автор решения: Evgenii Evstafev

Для мобильных разрешений не оптимизировал (не знаю требования), но на desktop - вроде норм:

const slides = [{
    id: 1,
    image: 'https://placehold.co/320x536/EEE/31343C',
    title: 'Слайд 1',
    description: 'Описание слайда 1. Здесь может быть ваш текст.'
  },
  {
    id: 2,
    image: 'https://placehold.co/320x536/EEE/31343C',
    title: 'Слайд 2',
    description: 'Описание слайда 2. Здесь может быть ваш текст.'
  },
  {
    id: 3,
    image: 'https://placehold.co/320x536/EEE/31343C',
    title: 'Слайд 3',
    description: 'Описание слайда 3. Здесь может быть ваш текст.'
  },
  {
    id: 4,
    image: 'https://placehold.co/320x536/EEE/31343C',
    title: 'Слайд 4',
    description: 'Описание слайда 4. Здесь может быть ваш текст.'
  },
  {
    id: 5,
    image: 'https://placehold.co/320x536/EEE/31343C',
    title: 'Слайд 5',
    description: 'Описание слайда 5. Здесь может быть ваш текст.'
  },
  {
    id: 6,
    image: 'https://placehold.co/320x536/EEE/31343C',
    title: 'Слайд 6',
    description: 'Описание слайда 6. Здесь может быть ваш текст.'
  },
  {
    id: 7,
    image: 'https://placehold.co/320x536/EEE/31343C',
    title: 'Слайд 7',
    description: 'Описание слайда 7. Здесь может быть ваш текст.'
  },
  {
    id: 8,
    image: 'https://placehold.co/320x536/EEE/31343C',
    title: 'Слайд 8',
    description: 'Описание слайда 8. Здесь может быть ваш текст.'
  },
];

const swiperWrapper = document.querySelector('.swiper-wrapper');
slides.forEach(slide => {
  const slideElement = document.createElement('div');
  slideElement.className = 'swiper-slide';
  slideElement.innerHTML = `
                <img src="${slide.image}" alt="${slide.title}" class="slide-image">
                <div class="slide-content">
                    <h3>${slide.title}</h3>
                    <p>${slide.description}</p>
                </div>
            `;
  swiperWrapper.appendChild(slideElement);
});

const swiper = new Swiper('.swiper-container', {
  slidesPerView: 5,
  centeredSlides: true,
  initialSlide: 2,
  spaceBetween: 20,
  grabCursor: true,
  loop: true,
  pagination: {
    el: '.swiper-pagination',
    clickable: true,
  },
  navigation: {
    nextEl: '.swiper-button-next',
    prevEl: '.swiper-button-prev',
  },
  breakpoints: {
    // Когда ширина экрана <= 480px
    480: {
      slidesPerView: 3,
      spaceBetween: 10
    },
    // Когда ширина экрана <= 767px
    767: {
      slidesPerView: 3,
      spaceBetween: 15
    },
    // Когда ширина экрана <= 1024px
    1024: {
      slidesPerView: 5,
      spaceBetween: 15
    }
  },
  touchRatio: 1.5,
  slideToClickedSlide: true,
  keyboard: {
    enabled: true,
  },
});
body {
  font-family: Arial, sans-serif;
  margin: 0;
  padding: 0;
  background-color: #1e1c39;
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
}

.swiper-container {
  width: 100%;
  max-width: 1200px;
  padding: 50px 0;
  overflow: visible;
}

.swiper-wrapper {
  align-items: center;
}

.swiper-slide {
  background: #777;
  transition: all 0.3s ease;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  overflow: hidden;
  position: relative;
}

.slide-image {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.slide-content {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  padding: 15px;
  background-color: rgba(255, 255, 255, 0.9);
  opacity: 0;
  transform: translateY(100%);
  transition: all 0.3s ease;
  overflow: hidden;
}

.swiper-slide-active .slide-content {
  opacity: 1;
  transform: translateY(0);
}

.swiper-slide {
  width: 100px;
  height: 100px;
}

.swiper-slide-prev,
.swiper-slide-next {
  width: 200px;
  height: 200px;
}

.swiper-slide-active {
  width: 320px;
  height: 536px;
}

.swiper-button-next,
.swiper-button-prev {
  color: white;
}

.swiper-pagination-bullet {
  background: white;
}

.swiper-pagination-bullet-active {
  background: #fff;
}

@media (max-width: 1024px) {
  .swiper-slide {
    width: 80px;
    height: 80px;
  }

  .swiper-slide-prev,
  .swiper-slide-next {
    width: 160px;
    height: 160px;
  }

  .swiper-slide-active {
    width: 280px;
    height: 470px;
  }
}

@media (max-width: 767px) {
  .swiper-container {
    padding: 30px 0;
  }

  .swiper-slide {
    width: 60px;
    height: 60px;
  }

  .swiper-slide-prev,
  .swiper-slide-next {
    width: 120px;
    height: 120px;
  }

  .swiper-slide-active {
    width: 200px;
    height: 336px;
  }

  .slide-content {
    padding: 10px;
  }

  .slide-content h3 {
    font-size: 14px;
    margin: 0 0 5px;
  }

  .slide-content p {
    font-size: 12px;
    margin: 0;
  }

  .swiper-button-next,
  .swiper-button-prev {
    transform: scale(0.7);
  }
}

@media (max-width: 480px) {
  .swiper-slide {
    width: 40px;
    height: 40px;
  }

  .swiper-slide-prev,
  .swiper-slide-next {
    width: 80px;
    height: 80px;
  }

  .swiper-slide-active {
    width: 160px;
    height: 270px;
  }
}
<!DOCTYPE html>
<html lang="ru">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Swiper слайдер с разными размерами</title>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/10.2.0/swiper-bundle.min.css" />
</head>

<body>
  <div class="swiper-container">
    <div class="swiper-wrapper">
    </div>
    <div class="swiper-pagination"></div>

    <div class="swiper-button-next"></div>
    <div class="swiper-button-prev"></div>
  </div>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/10.2.0/swiper-bundle.min.js"></script>
</body>

</html>

→ Ссылка