【问题标题】:How can I make Bootstrap columns all the same height?如何使 Bootstrap 列的高度都相同?
【发布时间】:2013-11-10 19:48:26
【问题描述】:

我正在使用引导程序。如何使三列高度相同?

这是问题的屏幕截图。我希望蓝色和红色列与黄色列的高度相同。

代码如下:

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<div class="container-fluid">
<div class="row">
    <div class="col-xs-4 panel" style="background-color: red">
        some content
    </div>
    <div class="col-xs-4 panel" style="background-color: yellow">
        catz
        <img width="100" height="100" src="https://lorempixel.com/100/100/cats/">
    </div>
    <div class="col-xs-4 panel" style="background-color: blue">
        some more content
    </div>
</div>
</div>

【问题讨论】:

标签: css twitter-bootstrap


【解决方案1】:

最新解决方案 (2022)

使用 Bootstrap 4 或 5 的解决方案 4

Bootstrap 4 和 5 默认使用 Flexbox,因此不需要额外的 CSS。

Demo

<div class="container">
    <div class="row ">
        <div class="col-md-4" style="background-color: red">
          some content
        </div>
        <div class="col-md-4" style="background-color: yellow">
          catz
          <img width="100" height="100" src="https://placekitten.com/100/100/">
        </div>
        <div class="col-md-4" style="background-color: green">
          some more content
        </div>
    </div>
</div>

使用负边距的解决方案 1(不会破坏响应能力)

Demo

.row{
    overflow: hidden; 
}

[class*="col-"]{
    margin-bottom: -99999px;
    padding-bottom: 99999px;
}

使用表格的解决方案 2

Demo

.row {
    display: table;
}

[class*="col-"] {
    float: none;
    display: table-cell;
    vertical-align: top;
}

使用 flex 的解决方案 3 于 2015 年 8 月添加。在此之前发布的评论不适用于此解决方案。

Demo

.row {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display:         flex;
  flex-wrap: wrap;
}
.row > [class*='col-'] {
  display: flex;
  flex-direction: column;
}

【讨论】:

  • 把它想象成被吸进负空间的列。如果你移除溢出,你会看到发生了什么。
  • 如果专门针对引导列类,您可能应该使用锚 ^ 而不是通配符 *。使用 ^ 将表示该类必须以 col- 开头,因为显示的通配符将匹配字符串中任何带有 col- 的类,可能会对您可能使用约定 col- 的样式产生不良影响。 (即 stuff-col-morestuff)。
  • 不错的答案,但有一些注意事项。解决方案 1 禁用浮动,因此会破坏引导网格响应行为。解决方案 2(在 positioniseverything.net/articles/onetruelayout/equalheight 中有更深入的解释)不显示底部边框(因为它被剪裁在填充空间的某处)。
  • 解决方案 3 破坏了行响应性。
  • @Popnoodles 您应该在第三个示例中添加 flex-wrap: wrap; 以启用响应性。您还需要添加 display: flex;弹性方向:列;到列类。如果您打算使用 .row 而不是自定义类,则需要为旧版浏览器提供后备以更改显示 flex。这是example
【解决方案2】:

2021 年更新

引导 4 + 5

现在在 Bootstrap 4(和 Bootstrap 5)中默认使用 Flexbox,因此不需要额外的 CSS 来制作等高的列:https://www.codeply.com/go/IJYRI4LPwU

例子:

<div class="container">
    <div class="row">
        <div class="col-md-6"></div>
        <div class="col-md-6"></div>
    </div>
</div>

引导 3

Bootstap 3.x 的最佳方法 - 使用 CSS flexbox(并且需要最少的 CSS)...

.equal {
  display: flex;
  display: -webkit-flex;
  flex-wrap: wrap;
}

Bootstrap same height flexbox example

要仅在特定断点处应用相同高度的弹性框(响应式),请使用媒体查询。例如,这里是sm (768px) 及以上:

@media (min-width: 768px) {
  .row.equal {
    display: flex;
    flex-wrap: wrap;
  }
}

此解决方案也适用于多行(列换行):https://www.codeply.com/go/bp/gCEXzPMehZ

其他解决方法

其他人会推荐这些选项,但are not a good idea 用于响应式设计。这些仅适用于没有列换行的简单单行布局。

  1. 使用huge negative margins & padding

  2. 使用display:table-cell(此解决方案也会影响响应式网格,因此@media 查询可用于仅在列垂直堆叠之前将table 显示在更宽的屏幕上)

【讨论】:

  • 您可以使用媒体查询仅在更大/更宽的设备上应用 flexbox。我更新了 bootply:bootply.com/Cn6fA6LuTq
  • 如果有人感兴趣,我创建了a pen 来演示使用 flexbox 在表单上的类似效果。
  • 这是一个已知的 Safari flexbox 错误:证明:bugs.webkit.org/show_bug.cgi?id=137730
  • @Stanley 关于“不再响应”的评论已经过时且无关紧要。
  • 这是唯一对我有用的修复方法。谢谢 Zim,这太棒了!
【解决方案3】:

最好的:

Reflex - Docs

与引导程序一起使用

更新:

  1. 包含 CSS
  2. 更新您的代码:

/*!
 *
 * Reflex v1.0
 *
 * Reflex is a flexbox grid which provides a way to take advantage of emerging
 * flexbox support while providing a fall back to inline-block on older browsers
 *
 * Built by Lee Jordan G.C.S.E.
 * email: ldjordan@gmail.com
 * github: https://github.com/leejordan
 *
 * Structure and calculations are inspired by twitter bootstrap
 *
 */

.reflex-order-12 {
  -webkit-order: 12;
  -ms-flex-order: 12;
  order: 12;
}

.reflex-order-11 {
  -webkit-order: 11;
  -ms-flex-order: 11;
  order: 11;
}

.reflex-order-10 {
  -webkit-order: 10;
  -ms-flex-order: 10;
  order: 10;
}

.reflex-order-9 {
  -webkit-order: 9;
  -ms-flex-order: 9;
  order: 9;
}

.reflex-order-8 {
  -webkit-order: 8;
  -ms-flex-order: 8;
  order: 8;
}

.reflex-order-7 {
  -webkit-order: 7;
  -ms-flex-order: 7;
  order: 7;
}

.reflex-order-6 {
  -webkit-order: 6;
  -ms-flex-order: 6;
  order: 6;
}

.reflex-order-5 {
  -webkit-order: 5;
  -ms-flex-order: 5;
  order: 5;
}

.reflex-order-4 {
  -webkit-order: 4;
  -ms-flex-order: 4;
  order: 4;
}

.reflex-order-3 {
  -webkit-order: 3;
  -ms-flex-order: 3;
  order: 3;
}

.reflex-order-2 {
  -webkit-order: 2;
  -ms-flex-order: 2;
  order: 2;
}

.reflex-order-1 {
  -webkit-order: 1;
  -ms-flex-order: 1;
  order: 1;
}

.reflex-order-0 {
  -webkit-order: 0;
  -ms-flex-order: 0;
  order: 0;
}

.reflex-container {
  display: inline-block;
  display: -webkit-flex;
  display: flex;
  zoom: 1;
  *display: inline;
  margin: 0;
  padding: 0;
  position: relative;
  width: 100%;
  letter-spacing: -0.31em;
  *letter-spacing: normal;
  word-spacing: -0.43em;
  list-style-type: none;
}

.reflex-container *,
.reflex-container:before,
.reflex-container:after {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  max-width: 100%;
  letter-spacing: normal;
  word-spacing: normal;
  white-space: normal;
}

.reflex-container *:before,
.reflex-container *:after {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
}

[class*="reflex-col-"] {
  width: 100%;
  vertical-align: top;
  position: relative;
  display: inline-block;
  display: -webkit-flex;
  display: flex;
  zoom: 1;
  *display: inline;
  text-align: left;
  text-align: start;
}

.reflex-item {
  display: block;
  display: -webkit-flex;
  display: flex;
  -webkit-flex-direction: column;
  flex-direction: column;
  -webkit-flex: 1 1 auto;
  flex: 1 1 auto;
}

_:-ms-fullscreen,
:root .reflex-item {
  width: 100%;
}

.reflex-col-12 {
  width: 100%;
  *width: 99.9%;
}

.reflex-col-11 {
  width: 91.66666666666666%;
  *width: 91.56666666666666%;
}

.reflex-col-10 {
  width: 83.33333333333334%;
  *width: 83.23333333333335%;
}

.reflex-col-9 {
  width: 75%;
  *width: 74.9%;
}

.reflex-col-8 {
  width: 66.66666666666666%;
  *width: 66.56666666666666%;
}

.reflex-col-7 {
  width: 58.333333333333336%;
  *width: 58.233333333333334%;
}

.reflex-col-6 {
  width: 50%;
  *width: 49.9%;
}

.reflex-col-5 {
  width: 41.66666666666667%;
  *width: 41.56666666666667%;
}

.reflex-col-4 {
  width: 33.33333333333333%;
  *width: 33.23333333333333%;
}

.reflex-col-3 {
  width: 25%;
  *width: 24.9%;
}

.reflex-col-2 {
  width: 16.666666666666664%;
  *width: 16.566666666666663%;
}

.reflex-col-1 {
  width: 8.333333333333332%;
  *width: 8.233333333333333%;
}

@media (min-width: 480px) {
  .reflex-col-xs-12 {
    width: 100%;
    *width: 99.9%;
  }
  .reflex-col-xs-11 {
    width: 91.66666666666666%;
    *width: 91.56666666666666%;
  }
  .reflex-col-xs-10 {
    width: 83.33333333333334%;
    *width: 83.23333333333335%;
  }
  .reflex-col-xs-9 {
    width: 75%;
    *width: 74.9%;
  }
  .reflex-col-xs-8 {
    width: 66.66666666666666%;
    *width: 66.56666666666666%;
  }
  .reflex-col-xs-7 {
    width: 58.333333333333336%;
    *width: 58.233333333333334%;
  }
  .reflex-col-xs-6 {
    width: 50%;
    *width: 49.9%;
  }
  .reflex-col-xs-5 {
    width: 41.66666666666667%;
    *width: 41.56666666666667%;
  }
  .reflex-col-xs-4 {
    width: 33.33333333333333%;
    *width: 33.23333333333333%;
  }
  .reflex-col-xs-3 {
    width: 25%;
    *width: 24.9%;
  }
  .reflex-col-xs-2 {
    width: 16.666666666666664%;
    *width: 16.566666666666663%;
  }
  .reflex-col-xs-1 {
    width: 8.333333333333332%;
    *width: 8.233333333333333%;
  }
}

@media (min-width: 768px) {
  .reflex-col-sm-12 {
    width: 100%;
    *width: 99.9%;
  }
  .reflex-col-sm-11 {
    width: 91.66666666666666%;
    *width: 91.56666666666666%;
  }
  .reflex-col-sm-10 {
    width: 83.33333333333334%;
    *width: 83.23333333333335%;
  }
  .reflex-col-sm-9 {
    width: 75%;
    *width: 74.9%;
  }
  .reflex-col-sm-8 {
    width: 66.66666666666666%;
    *width: 66.56666666666666%;
  }
  .reflex-col-sm-7 {
    width: 58.333333333333336%;
    *width: 58.233333333333334%;
  }
  .reflex-col-sm-6 {
    width: 50%;
    *width: 49.9%;
  }
  .reflex-col-sm-5 {
    width: 41.66666666666667%;
    *width: 41.56666666666667%;
  }
  .reflex-col-sm-4 {
    width: 33.33333333333333%;
    *width: 33.23333333333333%;
  }
  .reflex-col-sm-3 {
    width: 25%;
    *width: 24.9%;
  }
  .reflex-col-sm-2 {
    width: 16.666666666666664%;
    *width: 16.566666666666663%;
  }
  .reflex-col-sm-1 {
    width: 8.333333333333332%;
    *width: 8.233333333333333%;
  }
}

@media (min-width: 992px) {
  .reflex-col-md-12 {
    width: 100%;
    *width: 99.9%;
  }
  .reflex-col-md-11 {
    width: 91.66666666666666%;
    *width: 91.56666666666666%;
  }
  .reflex-col-md-10 {
    width: 83.33333333333334%;
    *width: 83.23333333333335%;
  }
  .reflex-col-md-9 {
    width: 75%;
    *width: 74.9%;
  }
  .reflex-col-md-8 {
    width: 66.66666666666666%;
    *width: 66.56666666666666%;
  }
  .reflex-col-md-7 {
    width: 58.333333333333336%;
    *width: 58.233333333333334%;
  }
  .reflex-col-md-6 {
    width: 50%;
    *width: 49.9%;
  }
  .reflex-col-md-5 {
    width: 41.66666666666667%;
    *width: 41.56666666666667%;
  }
  .reflex-col-md-4 {
    width: 33.33333333333333%;
    *width: 33.23333333333333%;
  }
  .reflex-col-md-3 {
    width: 25%;
    *width: 24.9%;
  }
  .reflex-col-md-2 {
    width: 16.666666666666664%;
    *width: 16.566666666666663%;
  }
  .reflex-col-md-1 {
    width: 8.333333333333332%;
    *width: 8.233333333333333%;
  }
}

@media (min-width: 1200px) {
  .reflex-col-lg-12 {
    width: 100%;
    *width: 99.9%;
  }
  .reflex-col-lg-11 {
    width: 91.66666666666666%;
    *width: 91.56666666666666%;
  }
  .reflex-col-lg-10 {
    width: 83.33333333333334%;
    *width: 83.23333333333335%;
  }
  .reflex-col-lg-9 {
    width: 75%;
    *width: 74.9%;
  }
  .reflex-col-lg-8 {
    width: 66.66666666666666%;
    *width: 66.56666666666666%;
  }
  .reflex-col-lg-7 {
    width: 58.333333333333336%;
    *width: 58.233333333333334%;
  }
  .reflex-col-lg-6 {
    width: 50%;
    *width: 49.9%;
  }
  .reflex-col-lg-5 {
    width: 41.66666666666667%;
    *width: 41.56666666666667%;
  }
  .reflex-col-lg-4 {
    width: 33.33333333333333%;
    *width: 33.23333333333333%;
  }
  .reflex-col-lg-3 {
    width: 25%;
    *width: 24.9%;
  }
  .reflex-col-lg-2 {
    width: 16.666666666666664%;
    *width: 16.566666666666663%;
  }
  .reflex-col-lg-1 {
    width: 8.333333333333332%;
    *width: 8.233333333333333%;
  }
}

.reflex-wrap {
  -webkit-flex-wrap: wrap;
  flex-wrap: wrap;
}

.reflex-wrap-reverse {
  -webkit-flex-wrap: wrap-reverse;
  flex-wrap: wrap-reverse;
}

.reflex-direction-row-reverse {
  -webkit-flex-direction: row-reverse;
  flex-direction: row-reverse;
}

.reflex-direction-column {
  -webkit-flex-direction: column;
  flex-direction: column;
}

.reflex-direction-column-reverse {
  -webkit-flex-direction: column-reverse;
  flex-direction: column-reverse;
}

.reflex-align-start {
  -webkit-align-items: flex-start;
  align-items: flex-start;
}

.reflex-align-end {
  -webkit-align-items: flex-end;
  align-items: flex-end;
}

.reflex-align-end [class*="reflex-col-"] {
  vertical-align: bottom;
}

.reflex-align-center {
  -webkit-align-items: center;
  align-items: center;
}

.reflex-align-center [class*="reflex-col-"] {
  vertical-align: middle;
}

.reflex-align-baseline {
  -webkit-align-items: baseline;
  align-items: baseline;
}

.reflex-align-baseline [class*="reflex-col-"] {
  vertical-align: baseline;
}

.reflex-align-content-start {
  -webkit-align-content: flex-start;
  align-content: flex-start;
}

.reflex-align-content-end {
  -webkit-align-content: flex-end;
  align-content: flex-end;
}

.reflex-align-content-end [class*="reflex-col-"] {
  vertical-align: bottom;
}

.reflex-align-content-center {
  -webkit-align-content: center;
  align-content: center;
}

.reflex-align-content-space-between {
  -webkit-align-content: space-between;
  align-content: space-between;
}

.reflex-align-content-space-around {
  -webkit-align-content: space-around;
  align-content: space-around;
}

.reflex-align-self-stretch {
  -webkit-align-self: stretch;
  align-self: stretch;
}

.reflex-align-self-start {
  -webkit-align-self: flex-start;
  align-self: flex-start;
}

.reflex-align-self-end {
  -webkit-align-self: flex-end;
  align-self: flex-end;
  vertical-align: bottom;
}

.reflex-align-self-center {
  -webkit-align-self: center;
  align-self: center;
  vertical-align: middle;
}

.reflex-align-self-baseline {
  -webkit-align-self: baseline;
  align-self: baseline;
  vertical-align: baseline;
}

.reflex-justify-start {
  text-align: left;
  -webkit-justify-content: flex-start;
  justify-content: flex-start;
}

.reflex-justify-end {
  text-align: right;
  -webkit-justify-content: flex-end;
  justify-content: flex-end;
}

.reflex-justify-center {
  text-align: center;
  -webkit-justify-content: center;
  justify-content: center;
}

.reflex-justify-space-between {
  text-align: justify;
  -moz-text-align-last: justify;
  text-align-last: justify;
  -webkit-justify-content: space-between;
  justify-content: space-between;
}

.reflex-justify-space-around {
  text-align: justify;
  -moz-text-align-last: justify;
  text-align-last: justify;
  -webkit-justify-content: space-around;
  justify-content: space-around;
}

.reflex-item-margin-sm {
  margin: 0 0.25em 0.5em;
}

.reflex-item-margin-md {
  margin: 0 0.5em 1em;
}

.reflex-item-margin-lg {
  margin: 0 1em 2em;
}

.reflex-item-content-margin-sm * {
  margin-right: 0.25em;
  margin-left: 0.25em;
}

.reflex-item-content-margin-md * {
  margin-right: 0.5em;
  margin-left: 0.25em;
}

.reflex-item-content-margin-lg * {
  margin-right: 1em;
  margin-left: 1em;
}

.reflex-img {
  display: inline-block;
  display: -webkit-flex;
  display: flex;
  zoom: 1;
  *display: inline;
  -webkit-flex: 0 0 auto;
  flex: 0 0 auto;
  margin-left: 0;
  margin-right: 0;
  max-width: 100%;
  width: 100%;
  height: auto;
}

.reflex-item-footer {
  margin-top: auto;
  margin-left: 0;
  margin-right: 0;
}
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">

<div class="reflex-container reflex-wrap">
  <div class="reflex-col-xs-12 reflex-col-sm-4 panel" style="background-color: red">
    some content
  </div>
  <div class="reflex-col-xs-6 reflex-col-sm-4 panel" style="background-color: yellow">
    kittenz
    <img src="https://upload.wikimedia.org/wikipedia/en/1/13/Matrona.jpg">
  </div>
  <div class="reflex-col-xs-6 reflex-col-sm-4 panel" style="background-color: blue">
    some more content
  </div>
</div>

【讨论】:

  • 欢迎来到 Stack Overflow!虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。见How do I write a good answer
【解决方案4】:

来自官方文档。也许你可以在你的情况下使用它。

当您需要等高时,将 .h-100 添加到卡片中。

<div class="row row-cols-1 row-cols-md-3 g-4">
  <div class="col">
   <div class="card h-100">
     <div>.....</div>
  </div>
  <div class="col">
   <div class="card h-100">
     <div>.....</div>
  </div>

【讨论】:

  • 最简单的答案(适用于 Bootstrap >4)
【解决方案5】:
.row.container-height {
    overflow: hidden;
}

.row.container-height>[class*="col-"] {
    margin-bottom: -99999px;
    padding-bottom: 99999px;
}

其中 .container-height 是必须添加到其所有 .col* 子级具有相同高度的 .row 样式元素的样式类。

仅将这些样式应用于某些特定的 .row(使用 .container-height,如示例中所示)还可以避免将边距和填充溢出应用到所有 .col*。

【讨论】:

    【解决方案6】:

    2019 年 3 月 19 日

    **Bootstrap 4 等高解决方案**

    Bootstrap Utilities/flex for equal height

    Live example in Codepen

    bootstrap 类的高度相等,父 div 固定为 heightmin-height

    <div class="d-flex align-content-stretch flex-wrap" style="min-height: 200px">
        <div>Flex height test text for example , Flex height test text for example </div>
        <div>Flex item</div>
        <div>Flex item</div>
        <div>Flex item</div>
     </div>
    

    .bd-highlight {
        background-color: rgba(86,61,124,.15);
        border: 1px solid rgba(86,61,124,.15);
    }
    .fixed-height-200 {
      min-height: 200px;
    }
    <link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/css/bootstrap.min.css" rel="stylesheet"/>
    <br><br><br>
    <div class="d-flex align-content-stretch flex-wrap fixed-height-200">
        <div class="p-2 bd-highlight">Flex item <br> 1111111111</div>
        <div class="p-2 bd-highlight bg-danger">Flex item</div>
        <div class="p-2 bd-highlight">Flex item</div>
        <div class="p-2 bd-highlight bg-info">Flex item</div>
        <div class="p-2 bd-highlight">Flex item</div>
        <div class="p-2 bd-highlight">Flex item</div>
        <div class="p-2 bd-highlight bg-light">Flex item <br> 1111111111</div>
        <div class="p-2 bd-highlight">Flex item <br> 1111111111</div>
        <div class="p-2 bd-highlight">Flex item <br> 1111111111</div>
        <div class="p-2 bd-highlight">Flex item</div>
        <div class="p-2 bd-highlight bg-primary">Flex item</div>
        <div class="p-2 bd-highlight">Flex item</div>
        <div class="p-2 bd-highlight">Flex item</div>
        <div class="p-2 bd-highlight">Flex item</div>
        <div class="p-2 bd-highlight">Flex item</div>
    </div>

    【讨论】:

    • 你为什么给我反对票。你能评论一下吗?
    【解决方案7】:

    如果有人使用 bootstrap 4 并寻找相等高度的列,只需使用 row-eq-height 到父 div

    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css" rel="stylesheet" />
    <div class="row row-eq-height">
      <div class="col-xs-4" style="border: 1px solid grey;">.row.row-eq-height &gt; .col-xs-4</div>
      <div class="col-xs-4" style="border: 1px solid grey;">.row.row-eq-height &gt; .col-xs-4<br>this is<br>a much<br>taller<br>column<br>than the others</div>
      <div class="col-xs-4" style="border: 1px solid grey;">.row.row-eq-height &gt; .col-xs-4</div>
    </div>

    参考:http://getbootstrap.com.vn/examples/equal-height-columns/

    【讨论】:

    • 我认为这是最好的答案
    【解决方案8】:

    HTML

    <div class="container-fluid">
        <div class="row-fluid">
            <div class="span4 option2">
                <p>left column </p>
                <p>The first column has to be the longest The first column has to be the longes</p>
            </div>
    
            <div class="span4 option2">
                <p>middle column</p>
            </div>
    
            <div class="span4 option2">
                <p>right column </p>
                <p>right column </p>
                <p>right column </p>
                <p>right column </p>
                <p>right column </p>
            </div>
        </div>
    </div>
    

    CSS

    .option2 { background: red; border: black 1px solid; color: white; }
    

    JS

    $('.option2').css({
        'height': $('.option2').height()
    });
    

    【讨论】:

      【解决方案9】:

      是的,Bootstrap 4 确实使一行中的所有列的高度相等,但是如果您在行内的内容周围创建边框,您可能会发现列的高度不相等!

      当我将height: 100% 应用于 col 内的元素时,我发现我失去了边距。

      我的解决方案是在 col 的 div 上使用填充(而不是内部元素上的边距)。像这样:

      <div class="container">
          <div class="row">
              <div class="col-lg-4 col-md-6 col-12 py-4">
                  <div class="h-100 border round">
                              ...
                  </div>
              </div>
              <div class="col-lg-4 col-md-6 col-12 py-4">
                  <div class="h-100 border round">
                              ...
                  </div>
              </div>
              <div class="col-lg-4 col-md-6 col-12 py-4">
                  <div class="h-100 border round">
                              ...
                  </div>
              </div>
              <div class="col-lg-4 col-md-6 col-12 py-4">
                  <div class="h-100 border round">
                              ...
                  </div>
              </div>
              <div class="col-lg-4 col-md-6 col-12 py-4">
                  <div class="h-100 border round">
                              ...
                  </div>
              </div>
              <div class="col-lg-4 col-md-6 col-12 py-4">
                  <div class="h-100 border round">
                              ...
                  </div>
              </div>
              <div class="col-lg-4 col-md-6 col-12 py-4">
                  <div class="h-100 border round">
                              ...
                  </div>
              </div>
              <div class="col-lg-4 col-md-6 col-12 py-4">
                  <div class="h-100 border round">
                              ...
                  </div>
              </div>
              <div class="col-lg-4 col-md-6 col-12 py-4">
                  <div class="h-100 border round">
                              ...
                  </div>
              </div>
          </div>
      </div>
      

      上面的代码示例使用 Bootstrap 4.1 创建了一组九个带边框的框

      【讨论】:

        【解决方案10】:

        我很惊讶我在 2018 年底在这里找不到有价值的解决方案。我继续使用 flexbox 自己想出了一个 Bootstrap 3 解决方案。

        简洁明了的例子:

        HTML

        <div class="row row-equal">
            <div class="col-lg-4 col-md-4 col-sm-4 col-xs-12 col-equal">
                <p>Text</p>
            </div>
            <div class="col-lg-4 col-md-4 col-sm-4 col-xs-12 col-equal">
                <img src="//placehold.it/200x200">
            </div>
            <div class="col-lg-4 col-md-4 col-sm-4 col-xs-12 col-equal">
                <p>Text</p>
            </div>  
        </div>
        

        CSS

        img {
          width: 100%;
        }
        p {
          padding: 2em;
        }
        @media (min-width: 768px) {
          .row-equal {
            display: flex;
            flex-wrap: wrap;
          }
          .col-equal {
            margin: auto;
          }
        }
        

        查看工作演示:http://jsfiddle.net/5kmtfrny/

        【讨论】:

          【解决方案11】:

          要回答您的问题,这就是您所需要的see full responsive demo with prefixed css

          /* Using col-xs media query breakpoint but you can change 481 to 768 to only apply to col-sm and above if you'd like*/
          
          @media only screen and (min-width : 481px) {
              .flex-row {
                  display: flex;
                  flex-wrap: wrap;
              }
              .flex-row > [class*='col-'] {
                  display: flex;
                  flex-direction: column;
              }
              .flex-row.row:after, 
              .flex-row.row:before {
                  display: flex;
              }
          }
          

          要像上面的屏幕截图一样在 flex 列中添加对缩略图内容 flex 的支持,还可以添加以下内容...请注意,您也可以使用面板执行此操作:

          .flex-row .thumbnail,
          .flex-row .caption {
              display: flex;
              flex: 1 0 auto;
              flex-direction: column;
          }
          .flex-text {
              flex-grow: 1;
          }    
          .flex-row img {
              width: 100%;
          }
          

          虽然 flexbox 在 IE9 及以下版本中无法使用,但您可以使用带有 javascript grids 之类的条件标签作为 polyfill 的后备演示:

          <!--[if lte IE 9]>
          
          <![endif]-->
          

          至于已接受答案中的其他两个示例......表格演示是一个不错的想法,但实施错误。在引导列类上应用该 CSS 毫无疑问会完全破坏网格框架。您应该为一个和两个表格样式使用自定义选择器,不应将其应用于已定义宽度的[class*='col-']。仅当您想要等高和等宽列时才应使用此方法。它不适用于任何其他布局,也不是​​响应式的。我们可以让它在移动显示器上回退......

          <div class="table-row-equal">
          <div class="thumbnail">
              Content...
          </div>
          <div class="thumbnail">
              Content...
          </div>
          </div>
          
          @media only screen and (min-width : 480px){
              .table-row-equal {
                  display: table;
                  width: 100%;
                  table-layout: fixed;
                  border-spacing: 30px 0px;
                  word-wrap: break-word;
              }
              .table-row-equal .thumbnail {
                  float: none;
                  display: table-cell;
                  vertical-align: top;
                  width: 1%;
              }
          }
          

          最后,已接受答案中的第一个演示实现了one true layout 的一个版本,在某些情况下是一个不错的选择,但不适合引导列。这样做的原因是所有列都扩展到容器高度。因此,这也会破坏响应性,因为列不会扩展到它们旁边的元素,而是扩展到整个容器。此方法也不允许您再将底部边距应用于行,并且还会导致其他问题,例如滚动到锚标记。

          完整的代码参见 Codepen,它会自动为 flexbox 代码添加前缀。

          【讨论】:

          • 这是唯一对我有用的答案。 3 个评分最高的答案只是浪费时间
          • 看起来不错,但不幸的是它在 MacOS 上的 Safari 9.1 中不起作用:-(
          • @TheSchecke 这里是修复。据我所知,这适用于所有支持 flexbox 的浏览器。如果我错了,请告诉我。 s.codepen.io/bootstrapped/debug/pboJNd。问题与 row:after, row:before 有 display: table set 显然 Safari 不喜欢有关。
          • 请注意,这在 iPad 的 Safari 浏览器上非常糟糕
          • 很抱歉听到@MatthewLock。我刚刚在我的 iPad Air IOS 8.1 上用最新的 safari 进行了测试,它可以正常工作。我还能够使用带有 Safari 7 的 iPad mini Retina 在 crossbrowsertesting.com 上进行测试,这似乎也可以正常工作。 Here's the results 那个测试。能否提供您正在使用的 iPad 和 Safari 版本?我很想尽快解决这个问题,或者至少在答案中发表评论,因为我知道很多人都在使用它。
          【解决方案12】:

          我搜索了相同问题的解决方案,发现一个刚刚工作! - 几乎没有额外的代码..

          https://medium.com/wdstack/bootstrap-equal-height-columns-d07bc934eb27 为了一个很好的中断,并在底部有你想要的响应,并带有一个链接。

          https://www.codeply.com/go/EskIjvun4B

          这对我来说是正确的响应方式... 报价: ... 3 — 使用 flexbox(最好!)

          截至 2017 年,在响应式设计中制作等高列的最佳(也是最简单)方法是使用 CSS3 flexbox。

          .row.display-flex {
            display: flex;
            flex-wrap: wrap;
          }
          .row.display-flex > [class*='col-'] {
            display: flex;
            flex-direction: column;
          }
          

          并简单地使用:

          div class="container">
             <div class="row display-flex .... etc..
          

          【讨论】:

            【解决方案13】:

            之前的一些答案解释了如何使 div 具有相同的高度,但问题是当宽度太窄时 div 不会堆叠,因此您可以用一个额外的部分来实现他们的答案。对于每一个,除了您使用的行类之外,您还可以使用此处给出的 CSS 名称,因此如果您始终希望 div 彼此相邻,则 div 应该如下所示:

            <div class="row row-eq-height-xs">Your Content Here</div>
            

            对于所有屏幕:

            .row-eq-height-xs {
                display: -webkit-box;
                display: -webkit-flex;
                display: -ms-flexbox;
                display:         flex;
                flex-direction: row;
            }
            

            当你想使用 sm 时:

            .row-eq-height-sm {
                display: -webkit-box;
                display: -webkit-flex;
                display: -ms-flexbox;
                display:         flex;
                flex-direction: column;
            }
            @media (min-width:768px) {
                .row-eq-height-sm {
                    flex-direction: row;
                }
            }
            

            当你想要 md 时:

            .row-eq-height-md {
                display: -webkit-box;
                display: -webkit-flex;
                display: -ms-flexbox;
                display:         flex;
                flex-direction: column;
            }
            @media (min-width:992px) {
                .row-eq-height-md {
                    flex-direction: row;
                }
            }
            

            当你想使用 lg 时:

            .row-eq-height-lg {
                display: -webkit-box;
                display: -webkit-flex;
                display: -ms-flexbox;
                display:         flex;
                flex-direction: column;
            }
            @media (min-width:1200px) {
                .row-eq-height-md {
                    flex-direction: row;
                }
            }
            

            编辑 根据评论,确实有一个更简单的解决方案,但您需要确保为所有尺寸提供从最大所需宽度到 xs 的列信息(例如&lt;div class="col-md-3 col-sm-4 col-xs-12"&gt;:

            .row-eq-height {
                display: -webkit-box;
                display: -webkit-flex;
                display: -ms-flexbox;
                display: flex;
                flex-direction: row;
                flex-wrap: wrap;
            }
            

            【讨论】:

            • 你做的比你需要的要复杂得多:)`只需使用flex-wrap: wrap;然后你就不需要所有单独的......除非你特别想要它们。
            • 这在 iPad Safari 上失败
            【解决方案14】:

            无需 JavaScript。只需将 .row-eq-height 类添加到您现有的 .row 中,如下所示:

            <div class="row row-eq-height">
              <div class="col-xs-12 col-sm-4 panel" style="background-color: red">
                some content
              </div>
              <div class="col-xs-6 col-sm-4 panel" style="background-color: yellow">
                kittenz
              <img src="http://placekitten.com/100/100">
              </div>
              <div class="col-xs-6 col-sm-4 panel" style="background-color: blue">
                some more content
              </div>
            </div>
            

            提示:如果您的行中有超过 12 列,则引导网格将无法包装它。所以每 12 列添加一个新的div.row.row-eq-height

            提示:您可能需要添加

            <link rel="stylesheet" href="http://getbootstrap.com.vn/examples/equal-height-columns/equal-height-columns.css" />
            

            到你的 html

            【讨论】:

            • 基于弹性盒。不适用于 IE8 或 9,也不适用于 Android 2.x caniuse.com/#feat=flexbox
            • 注意:getbootstrap.vn 不是“引导程序”。这是一个第 3 方项目。
            • 这似乎集成在 bootstrap v4 中。
            • 我包含了正确的 CSS(来自 .vn 站点),但它把一切都搞砸了。它基于 flex
            • 伟大的...插件地狱。
            【解决方案15】:

            通过 flex-box 试试这个

            .container {
            	display: flex;
            	padding-bottom: 50px;
            }
            .col {
            	background: blue;
            	padding: 30px;
            }
            
            .col.center {
            	background: red;
            	height: 100px;
            	margin-bottom: -50px;
            }
            <div class="container">
              <div class="col">Left</div>
              <div class="col center">Center</div>
              <div class="col">Right</div>
            </div>

            实时 JSFiddle - https://jsfiddle.net/grinmax_/spsn4fnq/

            【讨论】:

              【解决方案16】:

              我尝试了很多在这个线程和其他页面上提出的建议,但没有一个解决方案在每个浏览器中都能 100% 起作用。

              所以我尝试了很长时间并想出了这个。 Bootstrap Equal Height columns 的完整解决方案在 flexbox 的帮助下只有 1 个类。 这适用于所有主流浏览器 IE10+。

              CSS:

              .row.equal-cols {
                display: -webkit-flex;
                display: -ms-flexbox;
                display: flex;
                -webkit-flex-wrap: wrap;
                -ms-flex-wrap: wrap;
                flex-wrap: wrap;
              }
              
              .row.equal-cols:before,
              .row.equal-cols:after {
                display: block;
              }
              
              .row.equal-cols > [class*='col-'] {
                display: -webkit-flex;
                display: -ms-flexbox;
                display: flex;
                -webkit-flex-direction: column;
                -ms-flex-direction: column;
                flex-direction: column;
              }
              
              .row.equal-cols > [class*='col-'] > * {
                -webkit-flex: 1 1 auto;
                -ms-flex: 1 1 auto;
                flex: 1 1 auto; 
              }
              

              HTML:

              <div class="container">
                <div class="row equal-cols">
                  <div class="col-sm-4">
                    <div class="content"></div>
                  </div>
                  <div class="col-sm-4">
                    <div class="content"></div>
                  </div>
                  <div class="col-sm-4">
                    <div class="content"></div>
                  </div>
                </div>
              </div>
              

              要支持更多版本的 IE,例如,您可以使用 https://github.com/liabru/jquery-match-height 并定位 .equal-cols 的所有子列。像这样:

              // Create a check for IE9 (or any other specific browser).
              if(IE9) {
                $(".row.equal-cols > [class*='col-']").matchHeight();
              }
              

              如果没有这个 polyfill,列的行为将与通常的 Bootstrap 列一样,因此这是一个很好的后备。

              【讨论】:

                【解决方案17】:

                您可以将列包装在 div 中

                <div class="row">
                <div class="col-md-12>
                  <div class="col-xs-12 col-sm-4 panel" style="background-color: red">
                  some content
                  </div>
                  <div class="col-xs-6 col-sm-4 panel" style="background-color: yellow">
                  kittenz
                  <img src="http://placekitten.com/100/100">
                  </div>
                  <div class="col-xs-6 col-sm-4 panel" style="background-color: blue">
                  some more content
                  </div>
                </div>
                </div>
                

                【讨论】:

                • 其中一列中的按钮对我不起作用。
                【解决方案18】:
                .row-eq-height {
                display: -webkit-box;
                display: -webkit-flex;
                display: -ms-flexbox;
                display:         flex;
                 }
                

                发件人:

                http://getbootstrap.com.vn/examples/equal-height-columns/equal-height-columns.css

                【讨论】:

                  【解决方案19】:

                  你可以使用下面的代码

                  var heights = $(".row > div").map(function() {
                      return $(this).height();
                  }).get(),
                  maxHeight = Math.max.apply(null, heights);
                  $(".row > div").height(maxHeight);
                  

                  【讨论】:

                    【解决方案20】:

                    对于那些寻求快速、简单解决方案的人 - 如果您有一组相对一致的块内容,则在 div 上设置比最大块大一点的最小高度可能更容易实现。

                    .align-box {
                        min-height: 400px;
                    }
                    

                    【讨论】:

                      【解决方案21】:

                      刚刚检查了引导文档,我找到了解决列相同高度问题的简单解决方案。

                      仅为所需的视口添加额外的 clearfix

                      <div class="clearfix visible-xs-block"></div>
                      

                      例如:

                      <div class="col-md-3 col-xs-6">This is a long text</div>
                      <div class="col-md-3 col-xs-6">This is short</div>
                      <div class="clearfix visible-xs-block">This is a long text</div>
                      <div class="col-md-3 col-xs-6">Short</div>
                      <div class="col-md-3 col-xs-6">Long Text</div>
                      <div class="clearfix visible-xs-block"></div>
                      <div class="col-md-3 col-xs-6">Longer text which will push down</div>
                      <div class="col-md-3 col-xs-6">Short</div>
                      

                      请参考http://getbootstrap.com/css/#grid-responsive-resets

                      【讨论】:

                        【解决方案22】:

                        我将这个超级简单的解决方案与clearfix 一起使用,它没有任何副作用。

                        这是一个关于 AngularJS 的示例:

                        <div ng-repeat-start="item in list">
                            <div class="col-lg-4 col-md-6 col-sm-12 col-xs-12"></div>
                        </div>
                        <div ng-repeat-end>
                            <div ng-if="$index % 3 == 2" class="clearfix visible-lg"></div>
                            <div ng-if="$index % 2 == 1" class="clearfix visible-md"></div>
                        </div>
                        

                        还有一个关于 PHP 的示例:

                        <?php foreach ($list as $i => $item): ?>
                            <div class="col-lg-4 col-md-6 col-sm-12 col-xs-12"></div>
                            <div class="clearfix visible-md"></div>
                            <?php if ($i % 2 === 1): ?>
                                <div class="clearfix visible-lg"></div>
                            <?php endif; ?>
                        <?php endforeach; ?>
                        

                        【讨论】:

                        • 不过,这不会使您的列的高度都相同。
                        • 对我来说,希望列在同一高度/行中的位置是一个解决方案
                        【解决方案23】:

                        如果有人感兴趣,可以使用厚颜无耻的 jquery 解决方案。只要确保你所有的 cols (el) 都有一个共同的类名......如果你将它绑定到 $(window).resize

                        function equal_cols(el)
                        {
                            var h = 0;
                            $(el).each(function(){
                                $(this).css({'height':'auto'});
                                if($(this).outerHeight() > h)
                                {
                                    h = $(this).outerHeight();
                                }
                            });
                            $(el).each(function(){
                                $(this).css({'height':h});
                            });
                        }
                        

                        用法

                        $(document).ready(function(){
                           equal_cols('.selector');
                        });
                        

                        注意:本文已根据@Chris 的注释进行了编辑,指出代码仅在$.each() 函数中设置了最后的最高高度

                        【讨论】:

                        • 这是低调的 - 简单而小,但将调整所有列的大小,而不需要在一行中有固定数量的列。不错!
                        • 这不起作用,因为您在每个函数中设置了最后一个最大高度。如果第三列是最高列,则第 1 列和第 2 列的高度不正确。您必须设置最后一行“$(this).css({'height':h});”在每个函数之后。我会做一个编辑。
                        【解决方案24】:

                        如果在您的上下文中有意义,您可以简单地在每次中断后添加一个空的 12 列 div,它充当一个分隔器,将您所在行中最高单元格的底部包围起来。

                        <div class="row">
                           <div class="col-xs-6">Some content</div>
                           <div class="col-xs-6">
                              Lots of content! Lots of content! Lots of content! Lots of content! Lots of content! 
                           </div>
                           <div id="spacer-div" class="col-xs-12"></div>
                           <div class="col-xs-6">More content...</div>
                        </div><!--this You forgot to close -->

                        希望这会有所帮助!

                        【讨论】:

                        • 这并没有回答他提出的问题!
                        【解决方案25】:

                        我知道我来晚了,但现在你可以使用“min-height”样式属性来达到你的目的。

                        【讨论】:

                          【解决方案26】:

                          这是我的方法,我使用 flex 对媒体查询进行了一些更改。

                            @media (min-width: 0px) and (max-width: 767px) {
                            .fsi-row-xs-level {
                              display: -webkit-box;
                              display: -webkit-flex;
                              display: -ms-flexbox;
                              display: flex;
                            }
                          }
                          @media (min-width: 768px) and (max-width: 991px) {
                            .fsi-row-sm-level {
                              display: -webkit-box;
                              display: -webkit-flex;
                              display: -ms-flexbox;
                              display: flex;
                            }
                          }
                          @media (min-width: 992px) and (max-width: 1199px) {
                            .fsi-row-md-level {
                              display: -webkit-box;
                              display: -webkit-flex;
                              display: -ms-flexbox;
                              display: flex;
                            }
                          }
                          @media (min-width: 1200px) {
                            .fsi-row-lg-level {
                              display: -webkit-box;
                              display: -webkit-flex;
                              display: -ms-flexbox;
                              display: flex;
                            }
                          }
                          

                          然后将所需的类添加到父级。

                          <div class="row fsi-row-lg-level fsi-row-md-level">
                          <div class="col-sm-4">column 1</div>
                          <div class="col-sm-4">column 2</div>
                          <div class="col-sm-4">column 3</div>
                          </div>
                          

                          我正在使用响应式断点,因为通量通常会妨碍引导标准的响应性。

                          【讨论】:

                            【解决方案27】:

                            我想我只是补充一下 Dr.Flink 给出的答案也可以应用于 Bootstrap 3 form-horizontal 块 - 如果您想为每个单元格使用背景颜色,这将非常方便。为了使这适用于引导表单,您需要包装表单内容,该内容仅用于复制类似表格的结构。

                            下面的示例还提供了 CSS,它演示了一个额外的媒体查询,允许 Bootstrap 3 简单地接管并在较小的屏幕上执行正常操作。这也适用于 IE8+。

                            例子:

                            <form class="form-horizontal" role="form">
                            
                              <div class="form-wrapper">
                                <div class="form-group">
                                  <label class="col-xs-12 col-sm-2 control-label">My Label</label>
                                  <div class="col-xs-12 col-sm-10">
                                    Some content
                                  </div>
                                </div>
                              </div>
                            
                            </form>
                            
                            .form-wrapper {
                              display: table;
                            }
                            
                            .form-wrapper .form-group {
                              display: table-row;
                            }
                            
                            .form-wrapper .form-group .control-label {
                              display: table-cell;
                              float: none;
                            }
                            
                            .form-wrapper .form-group label + div {
                              display: table-cell;
                              float: none;
                            }
                            
                            @media (max-width: 768px) {
                              .form-wrapper {
                                display: inherit;
                              }
                              .form-wrapper .form-group {
                                display: block;
                              }
                              .form-wrapper .form-group .control-label {
                                display: inherit;
                              }
                              .form-wrapper .form-group label + div {
                                display: inherit;
                              }
                            }
                            

                            【讨论】:

                              【解决方案28】:

                              在仅将解决方案 1 应用于行中的列时存在问题。希望改进解决方案 1。

                               [class^="col-"]:not([class*="-12"]){
                                    margin-bottom: -99999px;
                                    padding-bottom: 99999px;
                                }
                              

                              (抱歉,Popnoodles的回答无法评论,我的声望不够)

                              【讨论】:

                                【解决方案29】:
                                @media (min-width: @screen-sm-min) {
                                    div.equal-height-sm {
                                        display: table;
                                
                                
                                        > div[class^='col-'] {
                                            display: table-cell;
                                            float: none;
                                            vertical-align: top;
                                        }
                                    }
                                }
                                
                                <div class="equal-height-sm">
                                    <div class="col-xs-12 col-sm-7">Test<br/>Test<br/>Test</div>
                                    <div class="col-xs-12 col-sm-5">Test</div>
                                </div>
                                

                                例子:

                                https://jsfiddle.net/b9chris/njcnex83/embedded/result/

                                改编自这里的几个答案。一旦 IE8 和 9 死了,一旦 Android 2.x 死了,基于 flexbox 的答案就是正确的方法,但在 2015 年情况并非如此,而且可能不会在 2016 年出现。IE8 和 9 仍然构成 4- 6% 的使用量取决于您的衡量方式,对于许多企业用户来说,情况更糟。 http://caniuse.com/#feat=flexbox

                                display: tabledisplay: table-cell 技巧更向后兼容 - 一件好事是唯一严重的兼容性问题是 Safari 问题,它强制 box-sizing: border-box,这已经应用于您的 Bootstrap 标签。 http://caniuse.com/#feat=css-table

                                您显然可以添加更多执行类似操作的类,例如.equal-height-md。我将这些绑定到 div 是为了在我受限的使用中获得小的性能优势,但您可以删除标签以使其像 Bootstrap 的其余部分一样更通用。

                                请注意,这里的 jsfiddle 使用 CSS,因此,Less 本来提供的东西在链接的示例中是硬编码的。例如,@screen-sm-min 已替换为 Less 将插入的内容 - 768px。

                                【讨论】:

                                  【解决方案30】:

                                  您只显示一行,因此您的用例可能仅限于此。以防万一您有多行,这个插件 - github Javascript-grids - 完美运行!它使每个面板扩展到最高的面板,根据该行中最高的面板为每行提供不同的高度。这是一个 jquery 解决方案 vs. css,但想推荐它作为替代方法。

                                  【讨论】:

                                  • 唯一真正有效且不会破坏响应能力的解决方案
                                  • 这是否允许您指定列应该是方形的 - 或者只是所有相同的高度?
                                  • @niico 14 - 自从我使用它以来已经有一段时间了,但在我的应用程序中,要求是每行中的元素高度相同,但高度可能因行而异。由于高度是行中元素的函数,如果您的元素高度等于它们的宽度,那么它们应该呈现为正方形。
                                  猜你喜欢
                                  • 2017-07-21
                                  • 2022-06-13
                                  • 2020-12-04
                                  • 1970-01-01
                                  • 2013-01-17
                                  • 2019-01-13
                                  相关资源
                                  最近更新 更多