Bootstrap 4 карточная колода с количеством столбцов в зависимости от области просмотра

Я пытаюсь реализовать функцию колоды карт в bootstrap 4, чтобы все мои карты были одинаковой высоты.

Примеры, которые предоставляет bootstrap, показывают 4 хороших карты, но это 4 карты в строке, независимо от области просмотра. См. Код codeply здесь.

Для меня это не имеет смысла, поскольку, как я предполагаю, вам нужен минимальный размер, до которого будет уменьшаться ваша карточка, чтобы ваш контент по-прежнему выглядел хорошо.

Затем я попытался добавить некоторые классы области просмотра, чтобы разбить размеры экрана, но как только этот div добавляется, колода карт больше не применяется, что не делает карты равной высоты.

Как я могу этого добиться? Это недостающая функция, которая будет исправлена ​​в полной версии Bootstrap 4?

Вот сценарий: https://jsfiddle.net/crrm5q9m/

<div class="card-deck-wrapper">
  <div class="card-deck">
    <div class="card card-inverse card-success text-center col-xs-6 col-sm-4 col-md-3 col-lg-2 col-xl-1">
      <div class="card-block">
        <blockquote class="card-blockquote">
          <p>It's really good news that the new Bootstrap 4 now has support for CSS 3 flexbox.</p>
          <footer>Makes flexible layouts <cite title="Source Title">Faster</cite></footer>
        </blockquote>
      </div>
    </div>
    <div class="card card-inverse card-danger text-center col-xs-6 col-sm-4 col-md-3 col-lg-2 col-xl-1">
      <div class="card-block">
        <blockquote class="card-blockquote">
          <p>The Bootstrap 3.x element that was called "Panel" before, is now called a "Card".</p>
          <footer>All of this makes more <cite title="Source Title">Sense</cite></footer>
        </blockquote>
      </div>
    </div>
    <div class="card card-inverse card-warning text-center col-xs-6 col-sm-4 col-md-3 col-lg-2 col-xl-1">
      <div class="card-block">
        <blockquote class="card-blockquote">
          <p>There are also some interesting new text classes for uppercase and capitalize.</p>
          <footer>These handy utilities make it <cite title="Source Title">Easy</cite></footer>
        </blockquote>
      </div>
    </div>
    <div class="card card-inverse card-info text-center col-xs-6 col-sm-4 col-md-3 col-lg-2 col-xl-1">
      <div class="card-block">
        <blockquote class="card-blockquote">
          <p>If you want to use cool icons in Bootstrap 4, you'll have to find your own such as Font Awesome or Ionicons.</p>
          <footer>The Glyphicons are not <cite title="Source Title">Included</cite></footer>
        </blockquote>
      </div>
    </div>
        <div class="card card-inverse card-success text-center col-xs-6 col-sm-4 col-md-3 col-lg-2 col-xl-1">
      <div class="card-block">
        <blockquote class="card-blockquote">
          <p>It's really good news that the new Bootstrap 4 now has support for CSS 3 flexbox.</p>
          <footer>Makes flexible layouts <cite title="Source Title">Faster</cite></footer>
        </blockquote>
      </div>
    </div>
    <div class="card card-inverse card-danger text-center col-xs-6 col-sm-4 col-md-3 col-lg-2 col-xl-1">
      <div class="card-block">
        <blockquote class="card-blockquote">
          <p>The Bootstrap 3.x element that was called "Panel" before, is now called a "Card".</p>
          <footer>All of this makes more <cite title="Source Title">Sense</cite></footer>
        </blockquote>
      </div>
    </div>
    <div class="card card-inverse card-warning text-center col-xs-6 col-sm-4 col-md-3 col-lg-2 col-xl-1">
      <div class="card-block">
        <blockquote class="card-blockquote">
          <p>There are also some interesting new text classes for uppercase and capitalize.</p>
          <footer>These handy utilities make it <cite title="Source Title">Easy</cite></footer>
        </blockquote>
      </div>
    </div>
    <div class="card card-inverse card-info text-center col-xs-6 col-sm-4 col-md-3 col-lg-2 col-xl-1">
      <div class="card-block">
        <blockquote class="card-blockquote">
          <p>If you want to use cool icons in Bootstrap 4, you'll have to find your own such as Font Awesome or Ionicons.</p>
          <footer>The Glyphicons are not <cite title="Source Title">Included</cite></footer>
        </blockquote>
      </div>
    </div>
  </div>
</div>

person ganders    schedule 05.04.2016    source источник


Ответы (12)


Обновлено 2018 г.

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

адаптивная card-deck Bootstrap 4 (версия 4.1 )


Оригинальный ответ для Bootstrap 4 alpha 2:

Вы можете использовать сетку col-*-* для получения разной ширины (вместо карты-колоды), а затем установить одинаковую высоту столбцов с помощью flexbox.

.row > div[class*='col-'] {
  display: flex;
  flex:1 0 auto;
}

http://codeply.com/go/O0KdSG2YX2 (альфа 2)

Проблема в том, что без включения flexbox card-deck использует table-cell, где становится очень сложно контролировать ширину. Начиная с Bootstrap 4 Alpha 6, по умолчанию используется flexbox, поэтому дополнительный CSS для flexbox не требуется, а для создания карт в полную высоту можно использовать класс h-100: http://www.codeply.com/go/gnOzxd4Spk


Связанный вопрос: Bootstrap 4 - Отзывчивые карты в card- столбцы

person Zim    schedule 05.04.2016
comment
Я забыл, в Bootstrap 4 по умолчанию включен flexbox? - person ganders; 05.04.2016
comment
Попался, было интересно, почему это не работает на моей скрипке. Придется поиграться с ним, когда вернусь домой, чтобы включить флексбокс ... - person ganders; 05.04.2016
comment
Есть идеи, как сделать карточки в последнем ряду такой же ширины, как и любые другие ряды? - person lulalala; 24.01.2018
comment
Я начал с этого ответа, и было сложно создать такой динамический макет. Лучше использовать классы .row и .col для отзывчивости. См. Ответ ниже. - person Michael Cole; 22.02.2018
comment
В моем ответе уже говорилось об использовании сетки вместо колоды карт. - person Zim; 04.03.2018
comment
Я столкнулся с некоторой странностью, когда в этом примере карты не оборачивались должным образом с div. Избавление от w-100 исправило это за меня. используя bootstrap4.1.3 в Chrome - person CheeseMo; 10.11.2018
comment
Где в вашем примере вы используете класс util для указания количества столбцов? Я этого не вижу ... - person AlxVallejo; 02.04.2020
comment
Взгляните на codeply.com/go/nIB6oSbv6q и посмотрите на пустые разделители div, которые периодически используются между карты - например <div class="w-100 d-none d-sm-block d-md-none"><!-- wrap every 2 on sm--></div> - person Zim; 02.04.2020

Вот решение с Sass для настройки количества карт в строке в зависимости от точек останова: https://codepen.io/migli/pen/OQVRMw

Он отлично работает с Bootstrap 4 beta 3

// Bootstrap 4 breakpoints & gutter
$grid-breakpoints: (
    xs: 0,
    sm: 576px,
    md: 768px,
    lg: 992px,
    xl: 1200px
) !default;

$grid-gutter-width: 30px !default;

// number of cards per line for each breakpoint
$cards-per-line: (
    xs: 1,
    sm: 2,
    md: 3,
    lg: 4,
    xl: 5
);

@each $name, $breakpoint in $grid-breakpoints {
    @media (min-width: $breakpoint) {
        .card-deck .card {
            flex: 0 0 calc(#{100/map-get($cards-per-line, $name)}% - #{$grid-gutter-width});
        }
    }
}

ИЗМЕНИТЬ (2019/10)

Я работал над другим решением, в котором вместо карточной колоды используется группа горизонтальных списков + гибкие утилиты:

https://codepen.io/migli/pen/gOOmYLb

Это простое решение для организации любых элементов в адаптивную сетку.

<div class="container">
    <ul class="list-group list-group-horizontal align-items-stretch flex-wrap">
        <li class="list-group-item">Cras justo odio</li>
        <li class="list-group-item">Dapibus ac facilisis in</li>
        <li class="list-group-item">Morbi leo risus</li>
        <li class="list-group-item">Cras justo odio</li>
        <li class="list-group-item">Dapibus ac facilisis in</li>
        <!--= add as many items as you need  =-->
    </ul>
</div>
.list-group-item {
    width: 95%;
    margin: 1% !important;
}

@media (min-width: 576px) {
    .list-group-item {
        width: 47%;
        margin: 5px 1.5% !important;
    }
}

@media (min-width: 768px) {
    .list-group-item {
        width: 31.333%;
        margin: 5px 1% !important;
    }
}

@media (min-width: 992px) {
    .list-group-item {
        width: 23%;
        margin: 5px 1% !important;
    }
}

@media (min-width: 1200px) {
    .list-group-item {
        width: 19%;
        margin: 5px .5% !important;
    }
}
person migli    schedule 31.01.2018
comment
@trainoasis У меня ничего не сломалось. См. Ссылку CodePen в ответе: codepen.io/migli/pen/OQVRMw. Когда я меняю количество карточек на линию, количество карточек меняется соответственно. - person Boschman; 14.06.2018
comment
Понятно, ты. Возможно, у меня уже слишком много настраиваемого CSS и где-то возник конфликт. Постараюсь его найти. - person trainoasis; 14.06.2018
comment
Работает как шарм, также с bootstrap v 4.1.1. Спасибо. - person Tuom; 28.06.2018
comment
Прекрасно работает везде, кроме IE 11. Какое-нибудь решение? - person Ramesh Navi; 04.02.2019
comment
IE определенно мертв - person migli; 04.02.2019
comment
В документации по макету карт появляется это сообщение: эти параметры макета еще не работают. Может быть, пока не стоит их использовать - person gtamborero; 28.02.2019
comment
Именно поэтому я предложил это решение - теперь они реагируют. - person migli; 01.03.2019
comment
Да, @migli, но мой проект в основном предназначен для государственных нужд, им по-прежнему нравится использовать Windows 7 и IE. Меня выручил Bootstrap 4.1 с такой же высотой столбцов и классом h-100. - person Ramesh Navi; 04.03.2019
comment
Правительства всегда находятся в авангарде технологий! - person migli; 04.03.2019
comment
Это отличное и умное решение, оно работает как шарм. ОДНАКО я не могу хранить минимум 2 карты в строке на экранах xs (используя bootstrap 4). Любые идеи? - person Zavitoski; 29.08.2019
comment
Столбцы адаптивных карточек Bootstrap по умолчанию начинаются с 576px: (at) media (min-width: 576px) .card-deck {-ms-flex-flow: row wrap; flex-flow: перенос строк; маржа справа: -15 пикселей; маржа слева: -15 пикселей; } Замените на (at) media (min-width: 0) и установите для $ cards-per-line значение 2 для xs. Таким образом, все будет в порядке. - person migli; 30.08.2019
comment
Я предлагаю использовать $card-deck-margin вместо $grid-gutter-width: flex: 0 0 calc(#{100/map-get($cards-per-line, $name)}% - #{$card-deck-margin * 2}); - person Chris Peters; 28.10.2019
comment
лучшее решение для меня, использующее bootstrap-vue, которое все еще находится на 4.3.x - person weaveoftheride; 21.11.2019

Я заставил это работать, добавив min-width к карточкам:

<div class="card mb-3" style="min-width: 18rem;">
  <p>Card content</p>
</div>

Карты не опускаются ниже этой ширины, но все равно правильно заполняют каждую строку и имеют одинаковую высоту.

person Spanomaly    schedule 17.04.2019
comment
Отличное решение серьезной проблемы в Bootstrap - person JG Estiot; 10.09.2019
comment
Я также поставил ... max-width: 22rem; чтобы избежать слишком широких карточек на новой строке - person Netstep; 18.02.2020
comment
Это отлично сработало, не создавая сумасшедших условий для тегов в шаблонах django. - person 37dev; 21.02.2020
comment
это одно из лучших решений, аккуратное и эффективное - person Gianluca Ghettini; 23.05.2020

<div class="w-100 d-lg-none mt-4"></div>

Я создал 4 карты и поместил этот код между второй и третьей картой, попробуйте это.

person Mohammad Ayoub Khan    schedule 17.06.2018
comment
Хорошее решение, но чтобы оно заработало, вам нужно удалить класс d-lg-none, так что это будет <div class="w-100 mt-4"></div> - person Sid; 30.01.2019

Я использовал CSS Grid, чтобы исправить это. CSS Grid сделает все элементы в одной строке одинаковой высоты.

Однако я не пытался сделать все элементы во всех строках одинаковой высоты.

Во всяком случае, вот как это можно сделать:

HTML:

<div class="grid-container">

  <div class="card">...</div>
  <div class="card">...</div>
</div>

CSS:

.grid-container {
  display: grid;  
  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}

Вот полный JSFiddle. https://jsfiddle.net/bluegrounds/owjvhstq/4/

person bluegrounds    schedule 10.08.2019

Этот ответ предназначен для тех, кто использует Bootstrap 4.1+, а также для тех, кому небезразличен IE 11

Колода карт не адаптирует количество видимых карт в соответствии с размером области просмотра.

Вышеуказанные методы работают, но не поддерживают IE. С помощью приведенного ниже метода вы можете добиться аналогичной функциональности и отзывчивых карточек.

Вы можете управлять количеством карточек, которые нужно показать / скрыть в разных точках останова.

В Bootstrap 4.1+ столбцы по умолчанию имеют одинаковую высоту, просто убедитесь, что ваша карточка / контент использует все доступное пространство. Запустите фрагмент, и вы поймете

<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="container">
    <div class="row">
        <div class="col-sm-6 col-lg-4 mb-3">
            <div class="card mb-3 h-100">

                <div class="card-body">
                    <h5 class="card-title">Card title</h5>
                    <p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
                    <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
                </div>
            </div>
        </div>
        <div class="col-sm-6 col-lg-4 mb-3">
            <div class="card mb-3 h-100">
                <div class="card-body">
                    <h5 class="card-title">Card title</h5>
                    <p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
                    <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
                </div>
            </div>
        </div>
        <div class="col-sm-6 col-lg-4 mb-3">
            <div class="card mb-3 h-100">
                <div class="card-body">
                    <h5 class="card-title">Card title</h5>
                    <p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
                    <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
                </div>
            </div>
        </div>
    </div>
</div>

person Ramesh Navi    schedule 04.03.2019
comment
Вопрос требовал использования CardDeck - person Ian Warner; 21.07.2019
comment
Да, @IanWarner. Я использовал CardDeck с обновлениями, предложенными в приведенных выше ответах, но, к моему счастью, мне пришлось поддерживать IE, и, похоже, ничего не работало, я решил это с помощью этого метода. - person Ramesh Navi; 22.07.2019

Определите столбцы по минимальной ширине в зависимости от области просмотра:


    /* Number of Cards by Row based on Viewport */
    @media (min-width: 576px) {
        .card-deck .card {
            min-width: 50.1%; /* 1 Column */
            margin-bottom: 12px;
        }
    }

    @media (min-width: 768px) {
        .card-deck .card {
            min-width: 33.4%;  /* 2 Columns */
        }
    }

    @media (min-width: 992px) {
        .card-deck .card {
            min-width: 25.1%;  /* 3 Columns */
        }
    }

    @media (min-width: 1200px) {
        .card-deck .card {
            min-width: 20.1%;  /* 4 Columns */
        }
    }
person Pyetro    schedule 06.11.2019

@Zim предоставил отличное решение выше (заслуженное голосование с моей стороны), однако оно не совсем соответствовало тому, что мне было нужно, так как я реализовал это в Jekyll и хотел, чтобы моя колода карт автоматически обновлялась каждый раз, когда я добавляю сообщение в мой сайт. В Jekyll наращивать такую ​​колоду карт с каждым новым постом просто, задача заключалась в том, чтобы правильно расставить точки останова. В моем решении используются дополнительные жидкие теги и математика по модулю.

Хотя это старый вопрос, я наткнулся на него и нашел его полезным, и, возможно, когда-нибудь кто-нибудь захочет сделать это с Джекилом.

<div class = "container">
  <div class = "card-deck">

    {% for post in site.posts %}
      <div class = "card border-0 mt-2">
        <a href = "{{ post.url }}"><img src = "{{ site.baseurl }}{{ post.image }}" class = "mx-auto" alt = "..."></a>
        <div class = "card-body">
          <h5 class = "card-title"><a href = "{{ post.url }}">{{ post.title }}</a></h5>
          <span>Published: {{ post.date | date_to_long_string }} </span>
          <p class = "text-muted">{{ post.excerpt }}</p>
        </div>
        <div class = "card-footer bg-white border-0"><a href = "{{ post.url }}" class = "btn btn-primary">Read more</a></div>
      </div>

      <!-- Use modulo to add divs to handle break points -->
      {% assign sm = forloop.index | modulo: 2 %}
      {% assign md = forloop.index | modulo: 3 %}
      {% assign lg = forloop.index | modulo: 4 %}
      {% assign xl = forloop.index | modulo: 5 %}

      {% if sm == 0 %}
        <div class="w-100 d-none d-sm-block d-md-none"><!-- wrap every 2 on sm--></div>
      {% endif %}

      {% if md == 0 %}
        <div class="w-100 d-none d-md-block d-lg-none"><!-- wrap every 3 on md--></div>
      {% endif %}

      {% if lg == 0 %}
        <div class="w-100 d-none d-lg-block d-xl-none"><!-- wrap every 4 on lg--></div>
      {% endif %}

      {% if xl == 0 %}
        <div class="w-100 d-none d-xl-block"><!-- wrap every 5 on xl--></div>
      {% endif %}

    {% endfor %}
  </div>
</div>

Весь этот блок кода можно использовать непосредственно на веб-сайте или сохранить в папке _includes проекта Jekyll.

person edsandorf    schedule 21.12.2019

Используя Bootstrap 4.4.1, я смог установить количество карт в колоде, используя простые классы, добавив немного scss в микс.

HTML

<div class="card-deck deck-1 deck-md-2 deck-lg-3">
   <div class="card">
      <h2 class="card-header">Card 1</h3>
      <div class="card-body">
          Card body
      </div>
      <div class="card-footer">
          Card footer
      </div>
   </div>
   <div class="card">
      <h2 class="card-header">Card 2</h3>
      <div class="card-body">
          Card body
      </div>
      <div class="card-footer">
          Card footer
      </div>
   </div>
   <div class="card">
      <h2 class="card-header">Card 3</h3>
      <div class="card-body">
          Card body
      </div>
      <div class="card-footer">
          Card footer
      </div>
   </div>
</div>

SCSS

// _card_deck_columns.scss
// add deck-X and deck-BP-X classes to select the number of cards per line
@for $i from 1 through $grid-columns {
  .deck-#{$i} > .card {
    $percentage: percentage(1 / $i);
    @if $i == 1 {
      $width: $percentage;
      flex-basis: $width;
      max-width: $width;
      margin-left: 0;
      margin-right: 0;
    } @else {
      $width: unquote("calc(#{$percentage} - #{$grid-gutter-width})");
      flex-basis: $width;
      max-width: $width;
    }
  }
}
@each $breakpoint in map-keys($grid-breakpoints) {
  $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
  @include media-breakpoint-up($breakpoint) {
    @for $i from 1 through $grid-columns {
      .deck#{$infix}-#{$i} > .card {
        $percentage: percentage(1 / $i);
        @if $i == 1 {
          $width: $percentage;
          flex-basis: $width;
          max-width: $width;
          margin-left: 0;
          margin-right: 0;
        } @else {
          $width: unquote("calc(#{$percentage} - #{$grid-gutter-width})");
          flex-basis: $width;
          max-width: $width;
          margin-left: $grid-gutter-width / 2;
          margin-right: $grid-gutter-width / 2;
        }
      }
    }
  }
}

CSS

.deck-1 > .card {
  flex-basis: 100%;
  max-width: 100%;
  margin-left: 0;
  margin-right: 0; }

.deck-2 > .card {
  flex-basis: calc(50% - 30px);
  max-width: calc(50% - 30px); }

.deck-3 > .card {
  flex-basis: calc(33.3333333333% - 30px);
  max-width: calc(33.3333333333% - 30px); }

.deck-4 > .card {
  flex-basis: calc(25% - 30px);
  max-width: calc(25% - 30px); }

.deck-5 > .card {
  flex-basis: calc(20% - 30px);
  max-width: calc(20% - 30px); }

.deck-6 > .card {
  flex-basis: calc(16.6666666667% - 30px);
  max-width: calc(16.6666666667% - 30px); }

.deck-7 > .card {
  flex-basis: calc(14.2857142857% - 30px);
  max-width: calc(14.2857142857% - 30px); }

.deck-8 > .card {
  flex-basis: calc(12.5% - 30px);
  max-width: calc(12.5% - 30px); }

.deck-9 > .card {
  flex-basis: calc(11.1111111111% - 30px);
  max-width: calc(11.1111111111% - 30px); }

.deck-10 > .card {
  flex-basis: calc(10% - 30px);
  max-width: calc(10% - 30px); }

.deck-11 > .card {
  flex-basis: calc(9.0909090909% - 30px);
  max-width: calc(9.0909090909% - 30px); }

.deck-12 > .card {
  flex-basis: calc(8.3333333333% - 30px);
  max-width: calc(8.3333333333% - 30px); }

.deck-1 > .card {
  flex-basis: 100%;
  max-width: 100%;
  margin-left: 0;
  margin-right: 0; }

.deck-2 > .card {
  flex-basis: calc(50% - 30px);
  max-width: calc(50% - 30px);
  margin-left: 15px;
  margin-right: 15px; }

.deck-3 > .card {
  flex-basis: calc(33.3333333333% - 30px);
  max-width: calc(33.3333333333% - 30px);
  margin-left: 15px;
  margin-right: 15px; }

.deck-4 > .card {
  flex-basis: calc(25% - 30px);
  max-width: calc(25% - 30px);
  margin-left: 15px;
  margin-right: 15px; }

.deck-5 > .card {
  flex-basis: calc(20% - 30px);
  max-width: calc(20% - 30px);
  margin-left: 15px;
  margin-right: 15px; }

.deck-6 > .card {
  flex-basis: calc(16.6666666667% - 30px);
  max-width: calc(16.6666666667% - 30px);
  margin-left: 15px;
  margin-right: 15px; }

.deck-7 > .card {
  flex-basis: calc(14.2857142857% - 30px);
  max-width: calc(14.2857142857% - 30px);
  margin-left: 15px;
  margin-right: 15px; }

.deck-8 > .card {
  flex-basis: calc(12.5% - 30px);
  max-width: calc(12.5% - 30px);
  margin-left: 15px;
  margin-right: 15px; }

.deck-9 > .card {
  flex-basis: calc(11.1111111111% - 30px);
  max-width: calc(11.1111111111% - 30px);
  margin-left: 15px;
  margin-right: 15px; }

.deck-10 > .card {
  flex-basis: calc(10% - 30px);
  max-width: calc(10% - 30px);
  margin-left: 15px;
  margin-right: 15px; }

.deck-11 > .card {
  flex-basis: calc(9.0909090909% - 30px);
  max-width: calc(9.0909090909% - 30px);
  margin-left: 15px;
  margin-right: 15px; }

.deck-12 > .card {
  flex-basis: calc(8.3333333333% - 30px);
  max-width: calc(8.3333333333% - 30px);
  margin-left: 15px;
  margin-right: 15px; }

@media (min-width: 576px) {
  .deck-sm-1 > .card {
    flex-basis: 100%;
    max-width: 100%;
    margin-left: 0;
    margin-right: 0; }

  .deck-sm-2 > .card {
    flex-basis: calc(50% - 30px);
    max-width: calc(50% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-sm-3 > .card {
    flex-basis: calc(33.3333333333% - 30px);
    max-width: calc(33.3333333333% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-sm-4 > .card {
    flex-basis: calc(25% - 30px);
    max-width: calc(25% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-sm-5 > .card {
    flex-basis: calc(20% - 30px);
    max-width: calc(20% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-sm-6 > .card {
    flex-basis: calc(16.6666666667% - 30px);
    max-width: calc(16.6666666667% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-sm-7 > .card {
    flex-basis: calc(14.2857142857% - 30px);
    max-width: calc(14.2857142857% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-sm-8 > .card {
    flex-basis: calc(12.5% - 30px);
    max-width: calc(12.5% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-sm-9 > .card {
    flex-basis: calc(11.1111111111% - 30px);
    max-width: calc(11.1111111111% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-sm-10 > .card {
    flex-basis: calc(10% - 30px);
    max-width: calc(10% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-sm-11 > .card {
    flex-basis: calc(9.0909090909% - 30px);
    max-width: calc(9.0909090909% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-sm-12 > .card {
    flex-basis: calc(8.3333333333% - 30px);
    max-width: calc(8.3333333333% - 30px);
    margin-left: 15px;
    margin-right: 15px; } }
@media (min-width: 768px) {
  .deck-md-1 > .card {
    flex-basis: 100%;
    max-width: 100%;
    margin-left: 0;
    margin-right: 0; }

  .deck-md-2 > .card {
    flex-basis: calc(50% - 30px);
    max-width: calc(50% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-md-3 > .card {
    flex-basis: calc(33.3333333333% - 30px);
    max-width: calc(33.3333333333% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-md-4 > .card {
    flex-basis: calc(25% - 30px);
    max-width: calc(25% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-md-5 > .card {
    flex-basis: calc(20% - 30px);
    max-width: calc(20% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-md-6 > .card {
    flex-basis: calc(16.6666666667% - 30px);
    max-width: calc(16.6666666667% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-md-7 > .card {
    flex-basis: calc(14.2857142857% - 30px);
    max-width: calc(14.2857142857% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-md-8 > .card {
    flex-basis: calc(12.5% - 30px);
    max-width: calc(12.5% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-md-9 > .card {
    flex-basis: calc(11.1111111111% - 30px);
    max-width: calc(11.1111111111% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-md-10 > .card {
    flex-basis: calc(10% - 30px);
    max-width: calc(10% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-md-11 > .card {
    flex-basis: calc(9.0909090909% - 30px);
    max-width: calc(9.0909090909% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-md-12 > .card {
    flex-basis: calc(8.3333333333% - 30px);
    max-width: calc(8.3333333333% - 30px);
    margin-left: 15px;
    margin-right: 15px; } }
@media (min-width: 992px) {
  .deck-lg-1 > .card {
    flex-basis: 100%;
    max-width: 100%;
    margin-left: 0;
    margin-right: 0; }

  .deck-lg-2 > .card {
    flex-basis: calc(50% - 30px);
    max-width: calc(50% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-lg-3 > .card {
    flex-basis: calc(33.3333333333% - 30px);
    max-width: calc(33.3333333333% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-lg-4 > .card {
    flex-basis: calc(25% - 30px);
    max-width: calc(25% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-lg-5 > .card {
    flex-basis: calc(20% - 30px);
    max-width: calc(20% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-lg-6 > .card {
    flex-basis: calc(16.6666666667% - 30px);
    max-width: calc(16.6666666667% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-lg-7 > .card {
    flex-basis: calc(14.2857142857% - 30px);
    max-width: calc(14.2857142857% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-lg-8 > .card {
    flex-basis: calc(12.5% - 30px);
    max-width: calc(12.5% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-lg-9 > .card {
    flex-basis: calc(11.1111111111% - 30px);
    max-width: calc(11.1111111111% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-lg-10 > .card {
    flex-basis: calc(10% - 30px);
    max-width: calc(10% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-lg-11 > .card {
    flex-basis: calc(9.0909090909% - 30px);
    max-width: calc(9.0909090909% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-lg-12 > .card {
    flex-basis: calc(8.3333333333% - 30px);
    max-width: calc(8.3333333333% - 30px);
    margin-left: 15px;
    margin-right: 15px; } }
@media (min-width: 1200px) {
  .deck-xl-1 > .card {
    flex-basis: 100%;
    max-width: 100%;
    margin-left: 0;
    margin-right: 0; }

  .deck-xl-2 > .card {
    flex-basis: calc(50% - 30px);
    max-width: calc(50% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-xl-3 > .card {
    flex-basis: calc(33.3333333333% - 30px);
    max-width: calc(33.3333333333% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-xl-4 > .card {
    flex-basis: calc(25% - 30px);
    max-width: calc(25% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-xl-5 > .card {
    flex-basis: calc(20% - 30px);
    max-width: calc(20% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-xl-6 > .card {
    flex-basis: calc(16.6666666667% - 30px);
    max-width: calc(16.6666666667% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-xl-7 > .card {
    flex-basis: calc(14.2857142857% - 30px);
    max-width: calc(14.2857142857% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-xl-8 > .card {
    flex-basis: calc(12.5% - 30px);
    max-width: calc(12.5% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-xl-9 > .card {
    flex-basis: calc(11.1111111111% - 30px);
    max-width: calc(11.1111111111% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-xl-10 > .card {
    flex-basis: calc(10% - 30px);
    max-width: calc(10% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-xl-11 > .card {
    flex-basis: calc(9.0909090909% - 30px);
    max-width: calc(9.0909090909% - 30px);
    margin-left: 15px;
    margin-right: 15px; }

  .deck-xl-12 > .card {
    flex-basis: calc(8.3333333333% - 30px);
    max-width: calc(8.3333333333% - 30px);
    margin-left: 15px;
    margin-right: 15px; } }
person Goulven    schedule 15.06.2020

Я не помню конкретный источник, но использую:

    /* Number of Cards by Row based on Viewport */
    @media (min-width: 576px) {
        .card-deck .card {
            min-width: 50.1%; /* 1 Column */
            margin-bottom: 12px;
        }
    }
    @media (min-width: 768px) {
        .card-deck .card {
            min-width: 33.4%;  /* 2 Columns */
        }
    }
    @media (min-width: 1200px) {
        .card-deck .card {
            min-width: 25.1%;  /* 3 Columns */
        }
    }

Возможно, вы захотите поработать с конкретными значениями, чтобы они соответствовали вашим потребностям.

person ALZlper    schedule 14.02.2021

Для этого есть более простое решение - установить фиксированную высоту элементов карточки - заголовка и тела. Таким образом, мы можем установить ответный макет со стандартной сеткой столбцов Boostrap.

Вот мой пример: http://codeply.com/go/RHDawRSBol

 <div class="card-deck text-center">
    <div class="col-sm-6 col-md-4 col-lg-3">
        <div class="card mb-4">
            <img class="card-img-top img-fluid" src="//placehold.it/500x280" alt="Card image cap">
            <div class="card-body" style="height: 20rem">
                <h4 class="card-title">1 Card title</h4>
                <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>
                <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
            </div>
        </div>
person Bart Gluszak    schedule 09.06.2018
comment
Но это не стандартный способ. - person Mohammad Ayoub Khan; 17.06.2018
comment
Если вы сделаете это таким образом, вам нужно будет всегда знать, сколько контента в ваших карточках. Это не работает для динамического контента. - person frankie4fingers; 27.12.2018

Мне потребовалось немного времени, чтобы понять это, но ответ - не использовать колоду карт, а вместо этого использовать .row и .cols.

Таким образом получается адаптивный набор карточек со спецификой для каждого размера экрана: 3 карточки для xl, 2 для lg и md и 1 для sm и xs. .my-3 кладет прокладку сверху и снизу, чтобы они выглядели красиво.

mixin postList(stuff)
  .row
    - site.posts.each(function(post, index){
      .col-sm-12.col-md-6.col-lg-6.col-xl-4
        .card.my-3
          img.card-img-top(src="...",  alt="Card image cap")
          .card-body
            h5.card-title Card title #{index}
            p.card-text Some quick example text to build on the card title and make up the bulk of the cards content.
            a.btn.btn-primary(href="#") Go somewhere
    - })
person Michael Cole    schedule 22.02.2018
comment
Этот метод не устанавливает высоту карт равной высоте, как это делает колода карт. - person frankie4fingers; 27.12.2018