Bootstrap 5: слайдер/карусель продуктов

Я пытаюсь создать слайдер / карусель, как показано ниже на экране, используя Bootstrap5:

Здесь я вставляю, это мой текущий код:

<style>
<!-- Temporary -->
.carousel-control-next-icon {
    background: black;
}
</style>
<!DOCTYPE html>
<html lang = "en">
<head>
  <title>Bootstrap 5 Example</title>
  <meta charset = "utf-8">
  <meta name = "viewport" content = "width=device-width, initial-scale=1">
  <link href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel = "stylesheet">
  <script src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>

<!-- Home Section End -->
<div class = "container-fluid mt-3">
    <div class = "row g-4">
      <div class = "col-xl-6 col-md-4 ratio_medium d-sm-block d-none"> 
      <div class = "home-section bg-white div-content" style = "height:236px;">
    <!-- With Captions -->
<div id = "carouselExampleCaption" class = "carousel slide" data-bs-ride = "carousel">
    <div class = "carousel-inner" role = "listbox">
        <div class = "carousel-item">
            <img src = "https://img.freepik.com/free-photo/elegant-watch-with-silver-golden-chain-isolated_181624-27080.jpg?w=740&t=st=1674127568~exp=1674128168~hmac=5ce04dff715884c11a1cddc3e0a50b7c625fedf703c03ed40824dd972da0f012" style = "width:20%;" alt = "" class = "d-block img-fluid mx-auto">
        </div>
        <div class = "carousel-item active">
            <img src = "https://img.freepik.com/free-photo/elegant-watch-with-silver-golden-chain-isolated_181624-27080.jpg?w=740&t=st=1674127568~exp=1674128168~hmac=5ce04dff715884c11a1cddc3e0a50b7c625fedf703c03ed40824dd972da0f012" style = "width:20%;" alt = "" class = "d-block img-fluid mx-auto">
        </div>
        <div class = "carousel-item">
            <img src = "https://img.freepik.com/free-photo/elegant-watch-with-silver-golden-chain-isolated_181624-27080.jpg?w=740&t=st=1674127568~exp=1674128168~hmac=5ce04dff715884c11a1cddc3e0a50b7c625fedf703c03ed40824dd972da0f012" style = "width:20%;" alt = "" class = "d-block img-fluid mx-auto">          
        </div>
    </div>
    <a class = "carousel-control-prev" href = "#carouselExampleCaption" role = "button" data-bs-slide = "prev">
        <span class = "carousel-control-prev-icon" aria-hidden = "true"></span>
        <span class = "sr-only">Previous</span>
    </a>
    <a class = "carousel-control-next" href = "#carouselExampleCaption" role = "button" data-bs-slide = "next">
        <span class = "carousel-control-next-icon" aria-hidden = "true"></span>
        <span class = "sr-only">Next</span>
    </a>
</div>
      </div>
      </div>
      <div class = "col-xl-6 ratio_65 d-xl-block d-none">
          <div class = "home-section bg-white div-content" style = "height:236px;">
    <!-- With Captions -->
<div id = "carouselExampleCaption2" class = "carousel slide" data-bs-ride = "carousel">
    <div class = "carousel-inner" role = "listbox">
        <div class = "carousel-item">
            <img src = "https://img.freepik.com/free-photo/elegant-watch-with-silver-golden-chain-isolated_181624-27080.jpg?w=740&t=st=1674127568~exp=1674128168~hmac=5ce04dff715884c11a1cddc3e0a50b7c625fedf703c03ed40824dd972da0f012" style = "width:20%;" alt = "" class = "d-block img-fluid mx-auto">
        </div>
        <div class = "carousel-item active">
            <img src = "https://img.freepik.com/free-photo/elegant-watch-with-silver-golden-chain-isolated_181624-27080.jpg?w=740&t=st=1674127568~exp=1674128168~hmac=5ce04dff715884c11a1cddc3e0a50b7c625fedf703c03ed40824dd972da0f012" style = "width:20%;" alt = "" class = "d-block img-fluid mx-auto">
        </div>
        <div class = "carousel-item">
            <img src = "https://img.freepik.com/free-photo/elegant-watch-with-silver-golden-chain-isolated_181624-27080.jpg?w=740&t=st=1674127568~exp=1674128168~hmac=5ce04dff715884c11a1cddc3e0a50b7c625fedf703c03ed40824dd972da0f012" style = "width:20%;" alt = "" class = "d-block img-fluid mx-auto">          
        </div>
    </div>
    <a class = "carousel-control-prev" href = "#carouselExampleCaption2" role = "button" data-bs-slide = "prev">
        <span class = "carousel-control-prev-icon" aria-hidden = "true"></span>
        <span class = "sr-only">Previous</span>
    </a>
    <a class = "carousel-control-next" href = "#carouselExampleCaption2" role = "button" data-bs-slide = "next">
        <span class = "carousel-control-next-icon" aria-hidden = "true"></span>
        <span class = "sr-only">Next</span>
    </a>
</div>
      </div>
      </div>
    </div>
  </div>
<!-- Home Section End -->

Но в настоящее время это выглядит плохо:

Отображать только один элемент, но мне нужно отобразить так 3 элемента и половину. Также я стараюсь добавить под фото цену и название продукта, а изображение должно быть адаптивным. Может ли кто-нибудь немного помочь мне исправить этот код?

Пожалуйста, измените заголовок сообщения, чтобы задать четкий, конкретный вопрос. Не добавляйте теги. См. Как спросить.

isherwood 19.01.2023 16:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы будете искать это, вы можете найти этот Codepen и этот Codeply.

Сочетание этих двух способов дает вам рабочий пример здесь (Codepen).

JS клонирует содержимое каждого .carousel-item, поэтому каждый .carousel-item будет содержать содержимое своих (5) братьев и сестер. CSS изменяет transform, поэтому ползунок перемещается соответствующим образом.

Он также отзывчив, показывая только один элемент перед наименьшей точкой останова, но это можно легко настроить (только CSS).

Вот фрагмент, откройте его в полноэкранном режиме по ссылке "На всю страницу":

Примечание: пришлось добавить кучу !important в CSS, которые не нужны, если вы загружаете свой CSS после Bootstrap, как в Codepen.

let items = document.querySelectorAll('.carousel .carousel-item')

items.forEach((el) => {
  const minPerSlide = 5
  let next = el.nextElementSibling
  for (var i = 1; i < minPerSlide; i++) {
    if (!next) {
      // wrap carousel by using first child
      next = items[0]
    }
    let cloneChild = next.cloneNode(true)
    el.appendChild(cloneChild.children[0])
    next = next.nextElementSibling
  }
})
.carousel-item .col {
  padding: 0 5px;
}

@media (max-width: 767px) {
  .carousel-inner .carousel-item>div {
    display: none !important;
  }
  .carousel-inner .carousel-item>div:first-child {
    display: block !important;
  }
}

.carousel-inner .carousel-item.active,
.carousel-inner .carousel-item-next,
.carousel-inner .carousel-item-prev {
  display: flex !important;
}


/* medium and up screens */

@media (min-width: 768px) {
  .carousel-inner .carousel-item-end.active,
  .carousel-inner .carousel-item-next {
    transform: translateX(20%) !important;
  }
  .carousel-inner .carousel-item-start.active,
  .carousel-inner .carousel-item-prev {
    transform: translateX(-20%) !important;
  }
  /*  half slides CSS */
  .carousel-inner:before {
    position: absolute;
    top: 0;
    bottom: 0;
    right: 85%;
    left: 0;
    content: "";
    display: block;
    background-color: #fff;
    z-index: 2;
  }
  .carousel-inner:after {
    position: absolute;
    top: 0;
    bottom: 0;
    right: 0;
    left: 85%;
    content: "";
    display: block;
    background-color: #fff;
    z-index: 2;
  }
  .carousel-control-prev {
    left: 12% !important;
  }
  .carousel-control-next {
    right: 12% !important;
  }
}

.carousel-inner .carousel-item-end,
.carousel-inner .carousel-item-start {
  transform: translateX(0) !important;
}
<link href = "https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel = "stylesheet" integrity = "sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin = "anonymous">
<script src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity = "sha384-w76AqPfDkMBDXo30jS1Sgez6pr3x5MlQ1ZAGC+nuZB+EYdgRZgiwxhTBTkF7CXvN" crossorigin = "anonymous"></script>

<div class = "container">
  <div class = "row justify-content-center">
    <div id = "carouselExampleControls" class = "carousel carousel-dark slide">
      <div class = "carousel-inner" role = "listbox">
        <div class = "carousel-item active">
          <div class = "col">
            <div class = "card">
              <img src = "https://via.placeholder.com/700x500.png/CB997E/333333?text=1" class = "card-img-top" alt = "...">
              <div class = "card-body">
                <h5 class = "card-title">Card title</h5>
                <p class = "card-text">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
              </div>
            </div>
          </div>
        </div>
        <div class = "carousel-item">
          <div class = "col">
            <div class = "card">
              <img src = "https://via.placeholder.com/700x500.png/DDBEA9/333333?text=2" class = "card-img-top" alt = "...">
              <div class = "card-body">
                <h5 class = "card-title">Card title</h5>
                <p class = "card-text">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
              </div>
            </div>

          </div>
        </div>
        <div class = "carousel-item">
          <div class = "col">
            <div class = "card">
              <img src = "https://via.placeholder.com/700x500.png/FFE8D6/333333?text=3" class = "card-img-top" alt = "...">
              <div class = "card-body">
                <h5 class = "card-title">Card title</h5>
                <p class = "card-text">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
              </div>
            </div>
          </div>
        </div>
        <div class = "carousel-item">
          <div class = "col">
            <div class = "card">
              <img src = "https://via.placeholder.com/700x500.png/B7B7A4/333333?text=4" class = "card-img-top" alt = "...">
              <div class = "card-body">
                <h5 class = "card-title">Card title</h5>
                <p class = "card-text">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
              </div>
            </div>
          </div>
        </div>
        <div class = "carousel-item">
          <div class = "col">
            <div class = "card">
              <img src = "https://via.placeholder.com/700x500.png/A5A58D/333333?text=5" class = "card-img-top" alt = "...">
              <div class = "card-body">
                <h5 class = "card-title">Card title</h5>
                <p class = "card-text">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
              </div>
            </div>
          </div>
        </div>
        <div class = "carousel-item">
          <div class = "col">
            <div class = "card">
              <img src = "https://via.placeholder.com/700x500.png/6B705C/eeeeee?text=6" class = "card-img-top" alt = "...">
              <div class = "card-body">
                <h5 class = "card-title">Card title</h5>
                <p class = "card-text">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
              </div>
            </div>
          </div>
        </div>
      </div>
      <a class = "carousel-control-prev bg-transparent w-aut" href = "#carouselExampleControls" role = "button" data-bs-slide = "prev">
        <span class = "carousel-control-prev-icon" aria-hidden = "true"></span>
      </a>
      <a class = "carousel-control-next bg-transparent w-aut" href = "#carouselExampleControls" role = "button" data-bs-slide = "next">
        <span class = "carousel-control-next-icon" aria-hidden = "true"></span>
      </a>
    </div>
  </div>
</div>

Другие вопросы по теме