如何使Bootstrap 4卡的卡柱高度相同?


134

我正在使用Bootstrap 4 alpha 2并利用卡上的优势。具体来说,我正在使用从官方文档中获取的此示例。如何使所有卡的高度相同?

我现在所能想到的就是设置以下CSS规则:

.card {
    min-height: 200px;
}

但这只是一个硬编码的解决方案,在一般情况下不起作用。我认为代码与文档中的代码相同,即:

<div class="card-columns">
  <div class="card">
    <img class="card-img-top" data-src="..." alt="Card image cap">
    <div class="card-block">
      <h4 class="card-title">Card title that wraps to a new line</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>
    </div>
  </div>
  <div class="card card-block">
    <blockquote class="card-blockquote">
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.</p>
      <footer>
        <small class="text-muted">
          Someone famous in <cite title="Source Title">Source Title</cite>
        </small>
      </footer>
    </blockquote>
  </div>
  <div class="card">
    <img class="card-img-top" data-src="..." alt="Card image cap">
    <div class="card-block">
      <h4 class="card-title">Card title</h4>
      <p class="card-text">This card has supporting text below as a natural lead-in to additional content.</p>
      <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
    </div>
  </div>
  <div class="card card-block card-inverse card-primary text-xs-center">
    <blockquote class="card-blockquote">
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat.</p>
      <footer>
        <small>
          Someone famous in <cite title="Source Title">Source Title</cite>
        </small>
      </footer>
    </blockquote>
  </div>
  <div class="card card-block text-xs-center">
    <h4 class="card-title">Card title</h4>
    <p class="card-text">This card has supporting text below as a natural lead-in to additional content.</p>
    <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
  </div>
  <div class="card">
    <img class="card-img" data-src="..." alt="Card image">
  </div>
  <div class="card card-block text-xs-right">
    <blockquote class="card-blockquote">
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.</p>
      <footer>
        <small class="text-muted">
          Someone famous in <cite title="Source Title">Source Title</cite>
        </small>
      </footer>
    </blockquote>
  </div>
  <div class="card card-block">
    <h4 class="card-title">Card title</h4>
    <p class="card-text">This is a wider card with supporting text below as a natural lead-in to additional content. This card has even longer content than the first to show that equal height action.</p>
    <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
  </div>
</div>

到目前为止有什么努力吗?有共享的代码吗?
baao

2
该示例适用于类似砌体的圆柱。该样式的全部要点是,卡的高度不同。如果您希望高度相等,请使用卡座并启用flexbox模式。
昆汀

1
卡座仅适用于连续的卡片。我想要的是card-columns保持相同高度的相同效果。
blueSurfer

Answers:


161

您可以将类放在“行”还是“列”上?如果在行上使用卡片,则在卡片(边框)上将不可见。 https://v4-alpha.getbootstrap.com/utilities/flexbox/#align-items

<div class="container">
    <div class="row">
          <div class="col-lg-4 d-flex align-items-stretch">

这里的其他一些答案似乎“古怪”。为什么要使用最小高度或什至更差的固定高度?

我认为这个问题(相等的高度)是远离浮动块div的原因之一?


3
h-100不是固定的高度,而是100%(该行的高度)的高度
konyak

这应该是ACED的答案
扑扑

这是真正的答案
Andrew Bullock

@konyak是的,我知道那个哥们。我指的不是h-100(向下滚动此页面)。
Kerry7777

139

我正在使用Bootstrap 4(测试版2)。同时,情况似乎已经改变。我遇到了同样的问题,找到了一个简单的解决方案。这是我的代码:

<div class="container-fluid content-row">
    <div class="row">
        <div class="col-sm-12 col-lg-6">
            <div class="card h-100">
                … content card …
            </div>
        </div>
        … all the other cards … 
    </div>
</div>

通过“ col-sm-12 col-lg-6”,我使卡具有响应能力。使用“卡片h-100”,我已将所有卡片设置为其父栏的高度。在我的系统上,这可行,但是我不是专业人士。所以,希望我能帮助某人。


16
如此简单的h-100
PNC

9
.h-100-辉煌
JCraine

2
d-flex导致IE问题(我必须支持)时,这为我解决了问题。我刚刚mb-4在父div上添加了,以将卡片分开。
查尔斯·帕斯克

你也可以使用.PRE-滚动,使其垂直滚动
莫哈末·瓦卡斯·阿齐兹

我会将.py-2类与.col- *类一起添加到所有div中,以在行之间添加填充。
konyak

93

最好的解决方案,Bootstrap 4满足您的所有需求:使用.d-flex.flex-fill类。不要使用,card-decks因为它们没有响应。我用过col-sm,您可以使用所需的.col类,或者col-lg-xx表示宽度列的数量,例如4或3以获得最佳视图(如果帖子每列有3或4个)

这是野兽,尝试将浏览器窗口缩小为XS,以查看其运行情况:

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet" />

<link href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,500,500i,700,700i" rel="stylesheet">
<div class="container">
  <div class="row my-4">
    <div class="col">
      <div class="jumbotron">
        <h1>Bootstrap 4 Cards all same height demo</h1>
        <p class="lead">by djibe.</p>
        <span class="text-muted">(thx to BS4)</span>
        <p>Dependencies : standard BS4</p>
        <p>
          Enjoy the magic of flexboxes and leave the useless card-decks.
        </p>
        <div class="container-fluid">
          <div class="row">
            <div class="col-sm d-flex">
              <div class="card card-body flex-fill">
                A small card content.
              </div>
            </div>
            <div class="col-sm d-flex">
              <div class="card card-body flex-fill">
                "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
                in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
              </div>
            </div>
            <div class="col-sm d-flex">
              <div class="card card-body flex-fill">
                Another small card content.
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>


1
这个答案很棒!如果您不能使用“ card-column”或“ card-deck”在所有视口中获得所需的响应行为。
Getsomepeaches

这对我有用。我有一列有一张大卡片,右边有另一列有两行。因此,左卡占据了相邻两行的高度,谢谢!
埃里希·加西亚

这是要走的路。我试过了,card-columns 但每行不能超过3列。感谢您的回答
Yeku Wilfred Chetat

卡座在我的情况下不起作用,您的回答成功了!
TBG


12

更新:Bootstrap 4中,flexbox现在是默认设置,每card-deck行将包含3张卡。卡片将满满。

http://www.codeply.com/go/x91w5Cl6ip

Bootstrap 4 alpha card-columns使用的CSS3列实际上并不支持相等的高度(仅在Firefox中支持的column-fill除外)。

如果改为启用Bootstrap 4 flexbox模式,则可以使用card-deck和一点CSS来使高度相等并每3列换行一次。

@media (min-width:34em) {
    .card-deck > .card
    {
        width: 29%;
        flex-wrap: wrap;
        flex: initial; 
    }
}

http://codeply.com/go/YFFFWHVoRB

上校相同高度的相关
引导卡


我已分叉您的代码来测试一些东西;我还需要标题延伸到相同的高度,这在这里不会发生:codeply.com/go/fqnQZ2ZGJy-知道以任何方式我都可以使我的“ Shorter标题”采用与更长的标题?我尝试过使用flexbox和grids,但似乎无法正确使用它。
davewoodhall

11

这是我的做法:

CSS:

.my-flex-card > div > div.card {
    height: calc(100% - 15px);
    margin-bottom: 15px;
}

HTML:

<div class="row my-flex-card">
    <div class="col-lg-3 col-sm-6">
        <div class="card">
            <div class="card-block">
                aaaa
            </div>
        </div>
    </div>
    <div class="col-lg-3 col-sm-6">
        <div class="card">
            <div class="card-block">
                bbbb
            </div>
        </div>
    </div>
    <div class="col-lg-3 col-sm-6">
        <div class="card">
            <div class="card-block">
                cccc
            </div>
        </div>
    </div>
    <div class="col-lg-3 col-sm-6">
        <div class="card">
            <div class="card-block">
                dddd
            </div>
        </div>
    </div>
</div>

4

把卡包在里面

<div class="card-group"></div>

要么

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


3

我采取了稍微不同的方法。使用卡座包装纸

我添加了一个样式规则,该规则限制了卡片块的高度:

.card .card-block {max-height:300px;overflow:auto;}

得到以下结果: 在此处输入图片说明


3

您可以使用卡座,它将对齐所有卡...这来自bootstrap 4官方页面。

<div class="card-deck">
  <div class="card">
    <img class="card-img-top" src="..." alt="Card image cap">
    <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>
      <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
    </div>
  </div>
  <div class="card">
    <img class="card-img-top" src="..." alt="Card image cap">
    <div class="card-body">
      <h5 class="card-title">Card title</h5>
      <p class="card-text">This card has supporting text below as a natural lead-in to additional content.</p>
      <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
    </div>
  </div>
  <div class="card">
    <img class="card-img-top" src="..." alt="Card image cap">
    <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 card has even longer content than the first to show that equal height action.</p>
      <p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
    </div>
  </div>
</div>

2

另一个有用的方法是Card Grids

<div class="row row-cols-1 row-cols-md-2">
  <div class="col mb-4">
    <div class="card">
      <img src="..." 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 class="col mb-4">
    <div class="card">
      <img src="..." 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 class="col mb-4">
    <div class="card">
      <img src="..." 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.</p>
      </div>
    </div>
  </div>
  <div class="col mb-4">
    <div class="card">
      <img src="..." 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>


1

实现这一目标(我知道)的最简单方法:

  • 套用.text-monospace卡片中的所有文字。
  • 将卡片中的所有文本限制为相同的字符数。

更新

添加.text-truncate卡的标题和/或其他文本。这将文本强制为一行。使卡片具有相同的高度。


我认为您的答案还差得远。正常工作的网页上的每个卡片或部分显然将具有不同数量的文本(字符),并使用非等宽字体/字体。您为什么要截断访问者(无法)阅读的文本内容?
Kerry7777 '19

@ Kerry7777,您可能想截断一个长字符串,并在其末尾添加一个“ ...”,以使用户知道它已被截断。为了让他们阅读整个字符串,他们将不得不单击或将其悬停。这样,我们可以使显示的内容一致。因为内容不一样。有些很短,有些很长,而且我们的屏幕空间有限。
doncadavona

1
在某些情况下,仅文本长度会导致卡的高度不相等。所以这个答案很有用。
Mohammed Shareef C

1

我是新手,因此,如果我一起缺少任何东西,请原谅。

我尝试了以上许多方法。如果将高度设置为100%,则卡将始终扩展为最长卡的最大长度。容器将约束所有相同的长度。

我想看一下容器,所以我使用背景色来帮助我看看发生了什么。

<div class="col-lg-3"  style="background-color: rosybrown;">
    <div class="card w-100" Style="height: 100%">
        <div class="card-body">
            <img src="images/beHappy.png" alt="" class="img-fluid rounded-circle w-25 mb-3">
            <h4>CBe Happy</h2>

0

这对我来说很好:

<div class="card card-body " style="height:80% !important">

在引导程序常规CSS上强制我们的CSS。


0

我遇到了这个问题,大多数人都使用jQuery ...这是我的解决方案。“别介意,我只是这个领域的初学者。”

.cards-collection {
    .card-item { 
        width: 100%;
        margin: 20px 20px;
        padding:0 ;
        .card {
            border-radius: 10px;
                button {
                    border: inherit;
                }
        }
    }
}
     .container-fluid
         .row.cards-collection.justify-content-center
           .card-item.col-lg-3.col-md-4.col-sm-6.col-11
              .card.h-100

如果任何卡片项目的高度为例如400px(基于其内容),因为flex-align的默认值为拉伸,则.card-item(行或卡片收集类的子级)将被拉伸。使得卡的高度为父代的100%将占据此全高。

我希望我是正确的。是吗


-3

如果有人感兴趣,那么有一个名为jquery.matchHeight.js的jquery插件。

https://github.com/liabru/jquery-match-height

matchHeight使所有选定元素的高度完全相等。它处理导致相似插件失败的许多极端情况。

对于一行卡,我使用:

<div class="row match-height">

然后在整个网站范围内启用:

$('.row.match-height').each(function() {
   $(this).find('.card').not('.card .card').matchHeight(); // Not .card .card prevents collapsible cards from taking height
});

-12

jsfiddle

只需使用CSS添加所需的高度,例如:

.card{
    height: 350px;
}

您将必须添加自己的CSS。

如果您查看文档,这是砖石风格的-重点是它们的高度不同。


似乎卡中的内容未正确对齐。这个解决方案太手工了,我想知道是否还有其他“智能”产品
blueSurfer

您可以尝试使用jQuery来动态创建高度。取决于您要如何处理它们。
PlatinumJay

只是非常好奇地知道为什么会有这么多的否决票?因为它似乎有效
Kick Buttowski

2
这不是说卡保持固定高度,而不是响应高度相等吗?
罗伯特·安德鲁斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.