如何使Bootstrap列的高度相同?

Ric*_*ard 919 css twitter-bootstrap

我正在使用Bootstrap.如何将三根柱子制成相同的高度?

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

三个自举列,中心列长于其他两列

这是代码:

<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>
Run Code Online (Sandbox Code Playgroud)

Pop*_*les 1005

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

演示

<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://lorempixel.com/100/100/cats/">
        </div>
        <div class="col-md-4" style="background-color: green">
          some more content
        </div>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

解决方案2使用表格

演示

.row{
    overflow: hidden; 
}

[class*="col-"]{
    margin-bottom: -99999px;
    padding-bottom: 99999px;
}
Run Code Online (Sandbox Code Playgroud)

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

演示

.row {
    display: table;
}

[class*="col-"] {
    float: none;
    display: table-cell;
    vertical-align: top;
}
Run Code Online (Sandbox Code Playgroud)

  • 解决方案3打破了行响应. (13认同)
  • @Popnoodles你应该在第三个例子中添加`flex-wrap:wrap;`来启用响应.您还需要添加display:flex; 弯曲方向:柱; 到列类.如果您要使用.row而不是自定义类,则需要为旧版浏览器提供后备功能,以便更改显示器回弹.这是一个[例子](http://codepen.io/bootstrapped/full/RrabNe/) (10认同)
  • 如果专门针对bootstrap列类,则应该使用锚点^而不是通配符*.使用^将表示该类必须以col-where开头,因为显示的通配符将匹配字符串中任何位置的col-任何类,可能对您可能已使用约定col-的样式产生不良影响.(即stuff-col-morestuff). (9认同)
  • 把它想象成被吸入负空间的列.如果你移除溢出,你会看到发生了什么. (7认同)
  • 很好的答案,有一些警告.解决方案1禁用浮动,因此会破坏引导网格响应行为.解决方案2(在http://www.positioniseverything.net/articles/onetruelayout/equalheight中更深入地解释)不显示底部边框(因为它在填充空间中的某处被剪切). (7认同)
  • 解决方案3在Safari中不起作用.`.:: :: {display:block; 修复了那个,但我不确定为什么. (6认同)
  • 这个解决方案根本不起作用.1)破坏bs3网格响应不工作因为float:none 2)这个解决方案没有响应相同大小的cols,这里是演示:http://www.bootply.com/SmpoLAKqO1 (5认同)
  • 解决方案1可以产生宽度问题 (4认同)
  • 这些都是相同高度列的很好的例子,尽管在这种情况下它们都打破了引导网格框架.您永远不应该明确地对行和列类执行此操作.添加自己的课程.第一个虽然对流体布局有效但对响应式布局不利,因为它将所有列高度应用于`.row`的高度,即使它们不在同一行上.第二个是缺少样式,不应该使用BS列作为表格单元格.表是使用`border-spacing`而bootstrap`col-`类使用填充作为它们的间距.一起使用不会工作. (2认同)
  • @BryanWillis完美答案!这个答案的解决方案对我不起作用.谢谢! (2认同)

Zim*_*Zim 283

更新2018年

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

.equal {
  display: flex;
  display: -webkit-flex;
  flex-wrap: wrap;
}
Run Code Online (Sandbox Code Playgroud)

Bootstrap高度相同的flexbox示例

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

@media (min-width: 768px) {
  .row.equal {
    display: flex;
    flex-wrap: wrap;
  }
}
Run Code Online (Sandbox Code Playgroud)

此解决方案也适用于多行(列包装):https:
//www.bootply.com/gCEXzPMehZ

其他解决方法

其他人会推荐这些选项,但对于响应式设计并不是一个好主意.这些仅适用于没有列包装的简单单行布局.

1)使用巨大的负边距和填充

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


Bootstrap 4

默认情况下,Flexbox现在在Bootstrap 4中使用,因此不需要额外的CSS来制作相同高度的列:http://www.codeply.com/go/IJYRI4LPwU

  • 您可以使用媒体查询仅在更大/更宽的设备上应用Flexbox.我更新了bootply:http://www.bootply.com/Cn6fA6LuTq (5认同)
  • @Stanley关于"不再响应"的评论是陈旧且无关紧要的. (5认同)
  • 在IE8或9中不起作用,也不适用于Android 2.x http://caniuse.com/#feat=flexbox (2认同)
  • 这是flexbox的一个已知的Safari bug:证明:https://bugs.webkit.org/show_bug.cgi?id = 137730 (2认同)

Kev*_* R. 84

不需要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>
Run Code Online (Sandbox Code Playgroud)

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

提示:您可能需要添加

<link rel="stylesheet" href="http://getbootstrap.com.vn/examples/equal-height-columns/equal-height-columns.css" />
Run Code Online (Sandbox Code Playgroud)

你的HTML

  • 注意:getbootstrap.vn不是"Bootstrap".这是第三方项目. (56认同)
  • 在我看来不起作用.https://jsbin.com/ravudobovo/edit?html,output (8认同)
  • Flexbox的基础.在IE8或9中不起作用,也不适用于Android 2.x http://caniuse.com/#feat=flexbox (5认同)

Bry*_*lis 62

要回答你的问题,这就是你需要看到带有前缀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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Codepen的屏幕截图

要在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%;
}
Run Code Online (Sandbox Code Playgroud)

虽然flexbox在IE9及以下版本中不起作用,但您可以使用带有条件标记的回退使用javascript网格作为polyfill:

<!--[if lte IE 9]>

<![endif]-->
Run Code Online (Sandbox Code Playgroud)

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

<div class="table-row-equal">
<div class="thumbnail">
    Content...
</div>
<div class="thumbnail">
    Content...
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
@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%;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

有关完整代码,请参阅Codepen,它自动为flexbox代码添加前缀.

  • 这是唯一一个对我有用的答案.3个评分最高的答案只是浪费时间 (11认同)
  • 看起来不错,但不幸的是它在MacOS上的Safari 9.1中不起作用:-( (3认同)
  • 在iPad的Safari浏览器上,这一点非常糟糕 (2认同)

glo*_*idt 42

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


pau*_*dru 28

如果您想在任何浏览器中使用此功能,请使用javascript:

$( document ).ready(function() {
    var heights = $(".panel").map(function() {
        return $(this).height();
    }).get(),

    maxHeight = Math.max.apply(null, heights);

    $(".panel").height(maxHeight);
});
Run Code Online (Sandbox Code Playgroud)


Ste*_*rry 8

你也可以使用inline-flex,它工作得很好,可能比用CSS修改每个行元素要干净一些.

对于我的项目,我希望每一行的子元素都有相同的高度,所以边框看起来是锯齿状的.为此我创建了一个简单的css类.

.row.borders{
    display: inline-flex;
    width: 100%;
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然它成功地使行中的所有内容具有相同的高度;这破坏了 Bootstrap 的响应能力。 (2认同)

eag*_*i22 8

.row-eq-height {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display:         flex;
 }
Run Code Online (Sandbox Code Playgroud)

从:

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


小智 7

厚脸皮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});
    });
}
Run Code Online (Sandbox Code Playgroud)

用法

$(document).ready(function(){
   equal_cols('.selector');
});
Run Code Online (Sandbox Code Playgroud)

注意:这篇文章已根据@Chris的评论进行了编辑,注释该代码仅设置为$.each()函数中的最后一个最高高度


Zac*_*aum 7

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

<div class="row row-eq-height-xs">Your Content Here</div>
Run Code Online (Sandbox Code Playgroud)

对于所有屏幕:

.row-eq-height-xs {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display:         flex;
    flex-direction: row;
}
Run Code Online (Sandbox Code Playgroud)

当你想使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

当你想要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;
    }
}
Run Code Online (Sandbox Code Playgroud)

当你想使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

.row-eq-height {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex;
    flex-direction: row;
    flex-wrap: wrap;
}
Run Code Online (Sandbox Code Playgroud)


Zna*_*war 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>
Run Code Online (Sandbox Code Playgroud)

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


小智 6

我尝试了很多在这个帖子和其他页面上提出的建议,但没有解决方案在每个浏览器中100%工作.

所以我试验了很长时间并想出了这个. 一个完整的Bootstrap Equal Height列解决方案,只有1个类 的flexbox帮助.这适用于所有主流浏览器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; 
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

例如,要支持更多版本的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();
}
Run Code Online (Sandbox Code Playgroud)

如果没有这个polyfill,列的行为就像通常的Bootstrap列一样,这是一个非常好的后备.


Fai*_*aiz 5

我知道我已经很晚但现在你可以使用"min-height"样式属性来实现你的目的.


Buf*_*uge 5

令我惊讶的是,我无法在2018年末在这里找到一个有价值的解决方案。我继续使用Flexbox自己找到了Bootstrap 3解决方案。

干净简单的示例:

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>
Run Code Online (Sandbox Code Playgroud)

的CSS

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

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


Dag*_*mar 5

所以,是的,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>
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

当您需要相同的高度时,将 .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>
Run Code Online (Sandbox Code Playgroud)