【问题标题】:Bootstrap 4 - Responsive cards in card-columnsBootstrap 4 - 卡片列中的响应式卡片
【发布时间】:2016-03-12 11:34:12
【问题描述】:

我正在使用 Bootstrap 4,但在 divclass="card-columns" 中我找不到添加响应能力的解决方案(此类将类似砌体的效果应用于具有此功能的 div 内的卡片类)。

在 Bootstrap 3 中,容易设置样式并使“卡片”具有响应性,因为可以将 class="col-md-3 col-sm-6 col-xs-12" 之类的内容应用于包含 thumbnailcaption 等的 div。

如何在 Bootstrap 4 中使用卡片时也有同样的效果?

这是 HTML:

<body>

<div class="container-fluid">
    <div class="row">

        <div class="col-md-4 hidden-sm-down" id="map_container">
            <p>here we put the map</p>
        </div>

        <div class="col-md-8 col-sm-12 right_box">

            <div class="row">

                // here there's code for navbar

            </div><!-- row -->

            <div class=row">
                <div class="card-columns">
                    <?php
                    // Create and check connection
                    
                    if ($result->num_rows > 0) {

                        // output card design
                        while($row = $result->fetch_assoc()) {

                            echo '<div class="card">
                                    <img class="card-img-top" src="dance' . $row["id"] . '.jpg" alt="' . $row["name"] . '">
                                    <div class="card-block">
                                        <h4 class="card-title">' . $row["name"] . '</h4>
                                        <p class="card-text">Text. Card content.</p>
                                    </div>
                                    <div class="card-footer text-muted">
                                        <ul class="list-inline">
                                            <li><i class="fa fa-user"></i></li>
                                            <li>14</li>
                                        </ul>
                                    </div>
                                  </div><!-- card -->';
                        }
                    } else {
                        echo "0 results";
                    }

                    $conn->close();
                    ?>
                </div><!-- container card-columns -->
            </div><!-- row -->
        </div><!-- col-md-8 right_box -->
    </div><!-- row -->
</div><!-- container-fluid -->
</body>

这是我使用的 CSS:

#map_container {
background-image: url(map.png);
height: 100vh;
}

.right_box {
-webkit-box-shadow: -2px 0px 2px 0px rgba(0,0,0,0.75);
-moz-box-shadow: -2px 0px 2px 0px rgba(0,0,0,0.75);
box-shadow: -2px 0px 2px 0px rgba(0,0,0,0.75);
}

.card {
border-radius: 0 !important;
border: 0 none;
-webkit-box-shadow: 0px 2px 5px 0px rgba(0,0,0,0.5);
-moz-box-shadow: 0px 2px 5px 0px rgba(0,0,0,0.5);
box-shadow: 0px 2px 5px 0px rgba(0,0,0,0.5);
margin-left: 1px;
margin-right: 1px;
}

.card-img-top {
width: 100%;
border-radius: 0 !important;
}

.card-columns {
padding-top: 15px;
}

下面是两张图片,让我的情况更清楚:

Large screen

Smaller screen

我希望卡片在较小的屏幕上垂直堆叠。

感谢您的建议!

【问题讨论】:

    标签: html css twitter-bootstrap bootstrap-4


    【解决方案1】:

    Bootstrap 4 (4.0.0-alpha.2) 使用 card-columns 类中的 css 属性 column-count 来定义将在 div 元素内显示多少列卡片。
    但是这个属性只有两个值:

    • 小屏幕的默认值 1 (max-width: 34em)
    • 所有其他尺寸的值 3 (min-width: 34em)

    这是在 bootstrap.min.css 中的实现方式:

    @media (min-width: 34em) {
        .card-columns {
            -webkit-column-count:3;
            -moz-column-count:3;
            column-count:3;
            ⋮
        }
        ⋮
    }
    

    要使卡片堆叠响应,您可以将以下媒体查询添加到您的 css 文件并根据您的要求修改 min-width 的值:

    @media (min-width: 34em) {
        .card-columns {
            -webkit-column-count: 2;
            -moz-column-count: 2;
            column-count: 2;
        }
    }
    
    @media (min-width: 48em) {
        .card-columns {
            -webkit-column-count: 3;
            -moz-column-count: 3;
            column-count: 3;
        }
    }
    
    @media (min-width: 62em) {
        .card-columns {
            -webkit-column-count: 4;
            -moz-column-count: 4;
            column-count: 4;
        }
    }
    
    @media (min-width: 75em) {
        .card-columns {
            -webkit-column-count: 5;
            -moz-column-count: 5;
            column-count: 5;
        }
    }
    

    【讨论】:

    • 我发现这只适用于您的代码。以我的经验,默认值 3 未在 alpha4 中正确应用。谢谢!
    • 感谢您的帖子。我最终制作了一个小于 34em 的东西,我需要在最小的尺寸上添加 3 个东西:column-gap: 1.25rem; orphans: 1; widows: 1;
    【解决方案2】:

    如果你使用的是 Sass:

    $card-column-sizes: (
        xs: 2,
        sm: 3,
        md: 4,
        lg: 5,
    );
    
    @each $breakpoint-size, $column-count in $card-column-sizes {
        @include media-breakpoint-up($breakpoint-size) {
          .card-columns {
            column-count: $column-count;
            column-gap: 1.25rem;
    
            .card {
              display: inline-block;
              width: 100%; // Don't let them exceed the column width
            }
          }
        }
    }
    

    【讨论】:

    • 我尝试将其包含在我的项目中,但我不断收到错误消息,指出“没有名为 media-breakpoint-up 的 mixin”我正在使用“bootstrap”:“^4.0.0-alpha. 2",但我也在使用带有 webpack 的 bootstrap-loader 和 sass-loader ...我需要任何其他包来完成这项工作吗?
    • Nm,在这里找到了我的问题的解决方案,如果其他人有同样的问题:github.com/shakacode/bootstrap-loader/issues/9
    【解决方案3】:

    2019 年更新 - Bootstrap 4

    您可以简单地使用 SASS mixin 来更改每个断点/网格层中的卡片数量。

    .card-columns {
      @include media-breakpoint-only(xl) {
        column-count: 5;
      }
      @include media-breakpoint-only(lg) {
        column-count: 4;
      }
      @include media-breakpoint-only(md) {
        column-count: 3;
      }
      @include media-breakpoint-only(sm) {
        column-count: 2;
      }
    }
    

    SASS 演示:http://www.codeply.com/go/FPBCQ7sOjX

    或者,CSS only 像这样...

    @media (min-width: 576px) {
        .card-columns {
            column-count: 2;
        }
    }
    
    @media (min-width: 768px) {
        .card-columns {
            column-count: 3;
        }
    }
    
    @media (min-width: 992px) {
        .card-columns {
            column-count: 4;
        }
    }
    
    @media (min-width: 1200px) {
        .card-columns {
            column-count: 5;
        }
    }
    

    纯 CSS 演示:https://www.codeply.com/go/FIqYTyyWWZ

    【讨论】:

    • 非常感谢纯 CSS 版本。编辑:在 Bootstrap beta 2 中工作
    • 你知道如何用卡片组做到这一点吗?我正在寻找一种方法来做到这一点,但找不到任何解决方案。
    • 你看到this answer了吗?您必须在不同的断点处使用空 div 才能使卡片组卡片换行:codeply.com/go/k2zBsujRhJ
    【解决方案4】:

    我创建了一个卡片布局 - 使用 Bootstrap 4 / CSS3 连续 3 张卡片(当然它是响应式的)。以下示例使用基本的 Bootstrap 4 类,例如 containerrowcol-xlist-grouplist-group-item。如果有人对这种布局感兴趣,想在这里分享。

    HTML

    <div class="container">
      <div class="row">
        <div class="col-sm-12 col-md-4">
          <div class="custom-column">
            <div class="custom-column-header">Header</div>
            <div class="custom-column-content">
              <ul class="list-group">
                <li class="list-group-item"><i class="fa fa-check"></i> Cras justo odio</li>
                <li class="list-group-item"><i class="fa fa-check"></i> Dapibus ac facilisis in</li>
                <li class="list-group-item"><i class="fa fa-check"></i> Morbi leo risus</li>
                <li class="list-group-item"><i class="fa fa-check"></i> Porta ac consectetur ac</li>
                <li class="list-group-item"><i class="fa fa-check"></i> Vestibulum at eros</li>
              </ul>
            </div>
            <div class="custom-column-footer"><button class="btn btn-primary btn-lg">Click here</button></div>
          </div>
        </div>
        <div class="col-sm-12 col-md-4">
          <div class="custom-column">        
            <div class="custom-column-header">Header</div>
            <div class="custom-column-content">
              <ul class="list-group">
                <li class="list-group-item"><i class="fa fa-check"></i> Cras justo odio</li>
                <li class="list-group-item"><i class="fa fa-check"></i> Dapibus ac facilisis in</li>
                <li class="list-group-item"><i class="fa fa-check"></i> Morbi leo risus</li>
                <li class="list-group-item"><i class="fa fa-check"></i> Porta ac consectetur ac</li>
                <li class="list-group-item"><i class="fa fa-check"></i> Vestibulum at eros</li>
              </ul>
            </div>
            <div class="custom-column-footer"><button class="btn btn-primary btn-lg">Click here</button></div>
          </div>
        </div>
        <div class="col-sm-12 col-md-4">
          <div class="custom-column">
            <div class="custom-column-header">Header</div>
            <div class="custom-column-content">
              <ul class="list-group">
                <li class="list-group-item"><i class="fa fa-check"></i> Cras justo odio</li>
                <li class="list-group-item"><i class="fa fa-check"></i> Dapibus ac facilisis in</li>
                <li class="list-group-item"><i class="fa fa-check"></i> Morbi leo risus</li>
                <li class="list-group-item"><i class="fa fa-check"></i> Porta ac consectetur ac</li>
                <li class="list-group-item"><i class="fa fa-check"></i> Vestibulum at eros</li>
              </ul>
            </div>
            <div class="custom-column-footer"><button class="btn btn-primary btn-lg">Click here</button></div>
          </div>
        </div>
      </div>
    </div>
    

    CSS / SCSS

    $primary-color: #ccc;
    $col-bg-color: #eee;
    $col-footer-bg-color: #eee;
    $col-header-bg-color: #007bff;
    $col-content-bg-color: #fff;
    
    body {
      background-color: $primary-color;
    }  
    
    .custom-column {  
      background-color: $col-bg-color;
      border: 5px solid $col-bg-color;    
      padding: 10px;
      box-sizing: border-box;  
    }
    
    .custom-column-header {
      font-size: 24px;
      background-color: #007bff;  
      color: white;
      padding: 15px;  
      text-align: center;
    }
    
    .custom-column-content {
      background-color: $col-content-bg-color;
      border: 2px solid white;  
      padding: 20px;  
    }
    
    .custom-column-footer {
      background-color: $col-footer-bg-color;   
      padding-top: 20px;
      text-align: center;
    }
    

    链接:- https://codepen.io/anjanasilva/pen/JmdOpb

    【讨论】:

    • 很好,但与问题完全无关。
    【解决方案5】:

    我知道这个问题是不久前发布的;尽管如此,Bootstrap v4.0 提供了开箱即用的卡片布局支持。您可以在此处找到文档:Bootstrap Card Layouts

    我最近在一个严重依赖卡片布局 UI 的项目中重新使用 Bootstrap。我发现跨标准断点的以下实现取得了成功:

    <link href="https://unpkg.com/tachyons@4.10.0/css/tachyons.min.css" rel="stylesheet"/>
    <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet"/>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div class="flex justify-center" id="cars" v-cloak>
        <!-- RELEVANT MARKUP BEGINS HERE -->
        <div class="container mh0 w-100">
            <div class="page-header text-center mb5">
                <h1 class="avenir text-primary mb-0">Cars</h1>
                <p class="text-secondary">Add and manage your cars for sale.</p>
                <div class="header-button">
                    <button class="btn btn-outline-primary" @click="clickOpenAddCarModalButton">Add a car for sale</button>
                </div>
            </div>
            <div class="container pa0 flex justify-center">
                <div class="listings card-columns">
                    <div class="card mv2">
                        <img src="https://farm4.staticflickr.com/3441/3361756632_8d84aa8560.jpg" class="card-img-top"
                            alt="Mazda hatchback">
                        <div class="card-body">
                            <h5 class="card-title">Card title</h5>
                            <p class="card-text">Some quick example text to build on the card title and make up the bulk of the card's
                                content.
                            </p>
                            <a href="#" class="btn btn-primary">Go somewhere</a>
                        </div>
                        <div class="card-footer">
                            buttons here
                        </div>
                    </div>
                    <div class="card mv2">
                        <img src="https://farm4.staticflickr.com/3441/3361756632_8d84aa8560.jpg" class="card-img-top"
                            alt="Mazda hatchback">
                        <div class="card-body">
                            <h5 class="card-title">Card title</h5>
                            <p class="card-text">Some quick example text to build on the card title and make up the bulk of the card's
                                content.
                            </p>
                            <a href="#" class="btn btn-primary">Go somewhere</a>
                        </div>
                        <div class="card-footer">
                            buttons here
                        </div>
                    </div>
                    <div class="card mv2">
                        <img src="https://farm4.staticflickr.com/3441/3361756632_8d84aa8560.jpg" class="card-img-top"
                            alt="Mazda hatchback">
                        <div class="card-body">
                            <h5 class="card-title">Card title</h5>
                            <p class="card-text">Some quick example text to build on the card title and make up the bulk of the card's
                                content.
                            </p>
                            <a href="#" class="btn btn-primary">Go somewhere</a>
                        </div>
                        <div class="card-footer">
                            buttons here
                        </div>
                    </div>
                    <div class="card mv2">
                        <img src="https://farm4.staticflickr.com/3441/3361756632_8d84aa8560.jpg" class="card-img-top"
                            alt="Mazda hatchback">
                        <div class="card-body">
                            <h5 class="card-title">Card title</h5>
                            <p class="card-text">Some quick example text to build on the card title and make up the bulk of the card's
                                content.
                            </p>
                            <a href="#" class="btn btn-primary">Go somewhere</a>
                        </div>
                        <div class="card-footer">
                            buttons here
                        </div>
                    </div>
                    <div class="card mv2">
                        <img src="https://farm4.staticflickr.com/3441/3361756632_8d84aa8560.jpg" class="card-img-top"
                            alt="Mazda hatchback">
                        <div class="card-body">
                            <h5 class="card-title">Card title</h5>
                            <p class="card-text">Some quick example text to build on the card title and make up the bulk of the card's
                                content.
                            </p>
                            <a href="#" class="btn btn-primary">Go somewhere</a>
                        </div>
                        <div class="card-footer">
                            buttons here
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

    在尝试了 Bootstrap .card-group.card-deck 卡片布局类之后,在标准断点上最好的结果是古怪的,我最终决定试一试 .card-columns 类。它奏效了!

    您的结果可能会有所不同,但.card-columns 似乎是这里最稳定的实现。

    【讨论】:

      【解决方案6】:

      另一个迟到的答案,但我正在玩这个并想出了一个通用的 Sass 解决方案,我发现它很有用,其他许多人也可能这样做。概括地说,这引入了新类,这些类可以修改 .card-columns 元素的列数,其方式与 .col-4.col-lg-3 的列非常相似:

      @import "bootstrap";
      
      $card-column-counts: 1, 2, 3, 4, 5;
      
      .card-columns {
          @each $column-count in $card-column-counts {
              &.card-columns-#{$column-count} {
                  column-count: $column-count;
              }
          }
      
          @each $breakpoint in map-keys($grid-breakpoints) {
              @include media-breakpoint-up($breakpoint) {
                  $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
                  @each $column-count in $card-column-counts {
                      &.card-columns#{$infix}-#{$column-count} {
                          column-count: $column-count;
                      }
                  }
              }
          }
      }
      

      如果您有以下情况,则最终结果是:

      <div class="card-columns card-columns-2 card-columns-md-3 card-columns-xl-4">
         ...
      </div>
      

      那么默认情况下您将有 2 列,3 列用于中型设备及以上,4 列用于 xl 设备及以上。此外,如果您更改网格断点,这将自动支持这些断点,并且可以覆盖 $card-column-counts 以更改允许的列数。

      【讨论】: