Bootstrap 4 card-deck with number of columns based on viewport

后端 未结 11 1190
無奈伤痛
無奈伤痛 2020-11-28 06:10

I\'m trying to implement the card-deck feature in bootstrap 4 to make all of my cards the same height.

The examples that bootstrap provides show 4 nice cards, but it

11条回答
  •  刺人心
    刺人心 (楼主)
    2020-11-28 07:13

    Using Bootstrap 4.4.1, I was able to set the number of cards per deck using simple classes by adding some scss into the mix.

    HTML

    Card 1

    Card body

    Card 2

    Card body

    Card 3

    Card body

    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; } }
    

提交回复
热议问题