How can I make Bootstrap columns all the same height?
Asked Answered
B

35

1139

I'm using Bootstrap. How can I make three columns all the same height?

Here is a screenshot of the problem. I would like the blue and red columns to be the same height as the yellow column.

Three bootstrap columns with the center column longer than the other two columns

Here is the code:

<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>
Bacteriostasis answered 30/10, 2013 at 23:31 Comment(6)
#24746466Dominion
The example on Bootstrap breaks responsiveness Eduard. The flex .row is missing flex-wrap: wrap;. Here's an example of it working with responsiveness: codepen.io/bootstrapped/details/RrabNeEndomorphism
Possible Workaround – A Transparent image 1 pixel wide in the other columns. This new one pixel width image matches the pixel height of the cats pic in the above example. (May not work or be practical in your situation)Ed
In Bootstrap 4, we can use the card for the sameOkechuku
the same way you make any block element a specific height?Frontispiece
working solution - codeply.com/p/bCpAPuS0LLBrowne
C
1173

LATEST SOLUTION (2022)

Solution 4 using Bootstrap 4 or 5

Bootstrap 4 and 5 use Flexbox by default, so there is no need for extra 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>

Solution 1 using negative margins (doesn't break responsiveness)

Demo

.row{
    overflow: hidden; 
}

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

Solution 2 using table

Demo

.row {
    display: table;
}

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

Solution 3 using flex added August 2015. Comments posted before this don't apply to this solution.

Demo

.row {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display:         flex;
  flex-wrap: wrap;
}
.row > [class*='col-'] {
  display: flex;
  flex-direction: column;
}
Convolution answered 30/10, 2013 at 23:38 Comment(38)
Think of it as the column being sucked into negative space. If you remove the overflow you'll see what's going on.Convolution
It works but has a problem if you need to absolutely positioning some element at the bottom: it's hidden by the overflow. Nested elements neither can't determine the actual visible height, without javascript.Glim
@mjolnic good point. I'd like to find a better solution. I would have thought height 100% and display block might help.Convolution
it works in Firefox for me. Can you share your code?Convolution
If targeting the bootstrap column class specifically you should probably use an anchor ^ instead of a wildcard *. Using ^ will say that the class must start with col- where as the wildcard shown will match any class with col- anywhere in the string, possibly having undesired effects on styles where you may have used the convention col-. (i.e. stuff-col-morestuff).Schaffer
@Schaffer I agree but that's how bootstrap's selector is.Convolution
It works only with single line of blocks. For more block, it ads them in right side again until it brakes view zone.Tartary
@Convolution I can share my code #25001054Guildsman
This is working but my col-xs-12 is being ignored now.. How do i fix that?Exist
Solution 1 can make width problemsWomenfolk
Nice answer, with some caveats. Solution 1 disables the float and therefore breaks the bootstrap grid responsive behavior. Solution 2 (explained in greater depth in positioniseverything.net/articles/onetruelayout/equalheight) doesn't show the bottom border (as it is clipped somewhere in the padding space).Laboured
Hello, I am facing the same problem. But after I tried the solutions, the column does not seems to be responsive. How to fix that?Donoghue
Solution2 is responsive in my case but not the first one who occured some bug with bootstrap 3Cowans
I found a problem with solution 2: if there are elements with attr id="xxx" and users jump to the ID, contents above the element fail to display (demo: paste the codes to a local html file, open it with ".../xxx.html#p3"). Solution 1 seems working fine, hope I won't find any issue with it.Fireproof
@Notflip, I faced the same issue that "col-xs-12" doesn't make the next "col" to next line. My workaround is to apply solution 1 only to >= small device, as @media(min-width:768px) { Solution 1 }Fireproof
Non of this solutions working at all. 1) destroys bs3 grid responsive not working since float:none 2) this solution isn't doing cols same size in responsive, here is demonstration: bootply.com/SmpoLAKqO1Meunier
Actually there are two thing what you could want, one is simple same col height without responsive, for this is best solution 2. Other one is to avoid jumping of col if text change height of one col to another, for this is best this solution -> https://mcmap.net/q/46869/-twitter-bootstrap-responsive-block-heights. If you want both, use javascript or flexbox or write your own grid using table.Meunier
in case of two columns when resize browser screen (on mid, sm etc) first columns hides... why ?? how to fix itMetro
+1 Only for the second solution because it does not break the Bootstrap responsiveness. Any answer that does is useless when dealing with Bootstrap.Workbench
Solution ! did work for me. But I had to add the !important to margin. Like this: margin-bottom: -99999px !important;Induct
Solution 3 breaks row responsiveness.Counterpoise
These are all great examples for equal height columns although in this situation they all break the bootstrap grid framework. You should never do this explicitly to the row and column classes. Add your own class. The first one, while effective for fluid layouts is not good for responsive layouts as it applies all columns height to the height of the .row even if their not on the same row. The second one is missing styles and should not use BS columns as table cells. Tables are meant to use border-spacing while bootstrap col- classes use padding for their spacing. Using together wont work.Endomorphism
@Convolution you should add flex-wrap: wrap; to the third example to enable responsiveness. You also will want to add display: flex; flex-direction: column; to the column class. If you are going to use .row and not a custom class, you'll need to provide a fallback for older browsers changing the display flex back. Here's an exampleEndomorphism
I tried to make it out each method, but none of them work, here is my demo: DEMOEcclesia
@bwillis what does exactly do display: flex; flex-direction: column; in the column class? It seems to do nothing noticeable.Wahhabi
The 3rd solution is close, but in IE 11 the stacked divs seem to be too wide, and in FF the stacked divs have different widths.Amplification
Solution 1 hides the bottom border.Moorman
I prefer solution 2, and I add width: 100% for .rowNatashianatassia
@LoganG. ^ does not work for this class =" test col-md-2"Incidence
@HakamFostok These solutions have worked for 100s of others hence the upvotes. Feel free to post a new question with your bad code so that someone can advise where you have misunderstood.Convolution
None of the solutions, that work for 100s of others, work against your code, yet, despite the principal of Occam's razor, your wish is to downvote this answer multiple times. Hardly fair.Convolution
Solution 3: flex-wrap: wrap breaks on safari-mobile. I removed it and it works for meBilli
Negative margin works the best. The other two solutions break the responsive property (will not wrap on small screen)Kery
Solution 3 doesn't work in Safari. .row::before { display: block; } fixes that but I'm not sure why.Lope
table-cell or negative margins don't really work when it comes to responsive designPlush
Hello... no solutions worked for me. Can you see the snippet here please? #72795158Eastward
@Eastward that's because you're doing something else. You have cards and rows and div inside the columns, which are 100%, but aren't setting anything to height 100% to fix that.Convolution
I had to use flex-direction: inherit; in the columns as wellBosporus
P
414

Update 2021

Bootstrap 4 + 5

Flexbox is now used by default in Bootstrap 4 (and Bootstrap 5) so there is no need for the extra CSS to make equal height columns: https://www.codeply.com/go/IJYRI4LPwU

Example:

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

Bootstrap 3

Best approach for Bootstap 3.x — using CSS flexbox (and requires minimal CSS)…

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

Bootstrap same height flexbox example

To only apply the same height flexbox at specific breakpoints (responsive), use a media query. For example, here is sm (768px) and up:

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

This solution also works well for multiple rows (column wrapping): https://www.codeply.com/go/bp/gCEXzPMehZ

Other workarounds

These options will be recommended by others, but are not a good idea for responsive design. These only work for simple single row layouts w/o column wrapping.

  1. Using huge negative margins & padding

  2. Using display:table-cell (this solution also affects the responsive grid, so a @media query can be used to only apply table display on wider screens before the columns stack vertically)

Plush answered 6/4, 2014 at 10:25 Comment(10)
You can use a media-query to only apply the flexbox on larger/wider devices. I updated the bootply: bootply.com/Cn6fA6LuTqPlush
In case anyone is interested, I have created a pen to demonstrate similar effects on a form using flexbox.Luteous
@ZimSystem Your code in Codeply doesn't work in Safari 10.0.3 / OSX take.ms/bj31bMikkanen
It's a known Safari bug with flexbox: proof: bugs.webkit.org/show_bug.cgi?id=137730Plush
@Stanley the comment about "no longer responsive" is old and irrelevant.Plush
And, how is that? It works for me at and least 194 other people ;-)Plush
What could be the possible reasons for these styles not to work in some cases?Lindsey
The first 2 links don't work any more: "Application error"Asberry
This is the only fix that worked for me. Thanks Zim this is great!Pantomimist
This is the only solution that worked for me, and I've tried quite a few. Thank you for this detailed post!Wellmeaning
D
86

No JavaScript needed. Just add the class .row-eq-height to your existing .row just like this:

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

Tip: if you have more than 12 columns in your row, the bootstrap grid will fail to wrap it. So add a new div.row.row-eq-height each 12 columns.

Tip: you may need to add

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

to your html

Deary answered 29/4, 2015 at 10:40 Comment(8)
flexbox-based. Does not work in IE8 or 9, nor Android 2.x caniuse.com/#feat=flexboxKeikokeil
Note: getbootstrap.vn is not "Bootstrap". It's a 3rd party project.Plush
This seems to be integrated in bootstrap v4 though.Kazimir
I included the correct CSS (from the .vn site) but it messes everything up. it's based on flexUnofficial
Great...plugin hell.Rameses
Cool, but this stylesheet include additional red and bordered styles to .col classes - this is not cool :(Tartary
NOT working in Bootstrap 4. this selector comes from somewhere else but is not part of bootstrap4 What worked for me is Solution 3) above with a slight change from flex to grid in the column selector .row { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; flex-wrap: wrap; } .row > [class*='col-'] { display: grid; //here flex-direction: column; }Amalita
Works for me on bootstrap 3Geulincx
E
72

To answer your question this is all you need 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;
    }
}

Screenshot of Codepen

To add support for thumbnail content flex within flex columns like the screenshot above also add this... Note you could do this with panels as well:

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

While flexbox doesn't work in IE9 and below you can use the demo with a fallback using conditional tags with something like javascript grids as a polyfill:

<!--[if lte IE 9]>

<![endif]-->

As for the other two examples in the accepted answer... The table demo is a decent idea but is being implemented wrong. Applying that CSS on bootstrap column classes specifically will without a doubt break the grid framework entirely. You should be using a custom selector for one and two the tables styles should not be applied to [class*='col-'] that have defined widths. This method should ONLY be used if you want equal height AND equal width columns. It is not meant for any other layouts and is NOT responsive. We can make it fallback however on mobile displays...

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

Lastly, the first demo in the accepted answer which implements a version of the one true layout is a good choice for some situations, but not suitable for bootstrap columns. The reason for this is that all the columns expand to the container height. So this will also break responsiveness since the columns are not expanding to the elements next to them, but the entire container. This method will also not allow you to apply bottom margins to rows any longer and will also cause other issues along the way like scrolling to anchor tags.

For the complete code see the Codepen which automatically prefixes the flexbox code.

Endomorphism answered 20/12, 2015 at 12:48 Comment(15)
That is the only one answer that actually worked for me. The 3 top rated answers were just a waste of timeCachou
Glad somebody found it useful. I definitely wasted way too much time creating that demo! One thing to note when using this and flexbox in general is that not all browsers are created equal. It is a pretty new concept and there are some quirks with it still depending on your layouts, so just make sure you do some cross browser testing before using it live.Endomorphism
Also if you do run into any issues with my method in the demo, I'd love to hear about it so I can make sure to fix it or add your example.Endomorphism
@bwillis Had to edit the masonry example to use .masonary-row > [class*="col-"] to not break inner cols and added a breakpoint at 992px to have another column, but apart from that the Masonry works like a charm, kudos!Natatory
Yes this is the only answer here that works and is responsive. Make this the accepted answer.Amplification
Looks good, but unfortunately it doesn't work in Safari 9.1 on MacOS :-(Sentiment
Thanks for the heads up @TheSchecke I will check it out today and update.Endomorphism
@TheSchecke here is the fix. As far as I know this works in all flexbox supported browsers now. Please let me know if I'm wrong. s.codepen.io/bootstrapped/debug/pboJNd. The problem had to do with the row:after, row:before having display: table set which apparently Safari doesn't like.Endomorphism
Just a heads up that this breaks really badly on the iPad's Safari browserAmplification
Sorry to hear that @MatthewLock. I just tested on my IPad Air IOS 8.1 with latest safari and it works on that. I was also able to test on on crossbrowsertesting.com using iPad mini retina with Safari 7 and that seems to be working fine too. Here's the results of that test. Can you provide the iPad and Safari version you are using? I'd love to try to get this fixed asap or at least put a comment in the answer as I know a lot of people are using it.Endomorphism
Thanks Bryan. I will check that out.Amplification
@Jordan.J.D which link? They don't seem to be expired as far as I can tell.Endomorphism
Safary issue fixed with a help of ::before and ::after pseudo!) Thanks a lot man!)Marismarisa
Came back for the same question more than two years later, not disappointed I commented/voted for this answer the first time, still perfectly fine and problem fixed within a few minutes!Cachou
This answer is da bom! The only one that worked for me consistently, and on iPad Safari (iOS 12).Histrionics
M
44

You only show one row so your use case may be limited to just that. Just in case you have multiple rows, this plugin - github Javascript-grids - works perfectly! It makes each panel expand to the tallest panel, giving each row potentially a different height based on the tallest panel in that row. It's a jquery solution vs. css, but wanted to recommend it as an alternative approach.

Marlanamarlane answered 19/11, 2013 at 17:47 Comment(3)
The only solution that really works and it doesn't break responsivenessAverroism
Does this allow you to specify that the columns should be square - or just all the same height?Donau
@Donau 14 - its been awhile since I've used this, but in my application the requirement is that the elements in each row were the same height, but the height might vary from row to row. Since the height is a function of the elements in the row, if your element height is equal to their width, then they should present as squares.Marlanamarlane
P
33

If you want to make this work in any browser, use javascript:

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

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

    $(".panel").height(maxHeight);
});
Planetesimal answered 26/2, 2015 at 21:3 Comment(6)
Have one div class="row" with variable number of panels each of class "col-md-4" which should give me 3 columns and unknown number of rows, depending on number of items I want to list. This JS worked and requires minimal change in my HTML/CSS, as opposed to various CSS thingies I tried. Only thing I changed was to mark all my column panels with additional class, i.e. "same-height-panel" and then use $(".same-height-panel") instead of $(".panel")Harijan
The only solution that worked for me after one day of experimenting with css stuff.Caliber
This is a good solution, but .ready() is not the right time to call it - it should be called on .load()Tusk
@Tusk If you think that this is a good solution, please give it a thumbs up. ThanksPlanetesimal
Use window.onload = function() {...function content above...} instead. This works better.Lampoon
+1 Just like many others have said, the above solution seems to be a cleaner approach which does not temper with the css file.Subglacial
D
21

I tried alot of the suggestions made in this thread and on other pages but no solution worked 100% in every browsers.

So I experimented quite some time and came up with this. A complete solution for Bootstrap Equal Height columns with the help of flexbox with only 1 class. This works in all major browsers 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>

To support even more versions of IE you can, for example, use https://github.com/liabru/jquery-match-height and target all child columns of .equal-cols. Like this:

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

Without this polyfill the columns will behave as usual Bootstrap columns so which is a quite good fallback.

Downswing answered 2/3, 2017 at 7:47 Comment(0)
M
18

From official documentation. Maybe you can use it in your case.

When you need equal height, add .h-100 to the cards.

<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>
Manicdepressive answered 30/1, 2021 at 5:36 Comment(1)
Simplest answer (Works with Bootstrap >4)Unhorse
A
10

I'm surprised I couldn't find a worthwhile solution here late 2018. I went ahead and figured it out a Bootstrap 3 solution myself using flexbox.

Clean and simple example:

Example of matched column widths in 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;
  }
}

View working demo: http://jsfiddle.net/5kmtfrny/

Andromede answered 7/11, 2018 at 20:18 Comment(0)
S
9

You can use inline-flex as well which works pretty good and may be a little cleaner than modifying every row element with CSS.

For my project I wanted every row who's child elements had borders to be the same height so the borders would look jagged. For this I created a simple css class.

.row.borders{
    display: inline-flex;
    width: 100%;
}
Serafina answered 12/5, 2014 at 19:26 Comment(1)
While it succeeds at making all the contents in the row the same height; This breaks the responsiveness of Bootstrap.Workbench
S
9
.row-eq-height {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display:         flex;
 }

From:

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

Styx answered 10/11, 2016 at 18:21 Comment(0)
P
8

If anyone using bootstrap 4 and looking for equal height columns just use row-eq-height to parent 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>

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

Parke answered 17/11, 2017 at 6:40 Comment(1)
I think this would be the best answerLieberman
A
7

cheeky jquery solution if anyone's interested. Just make sure all your cols (el) have a common classname...works responsively too if you bind it to $(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});
    });
}

Usage

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

Note: This post has been edited as per @Chris' comment out that the code was only set the last highest height in the $.each() function

Allottee answered 25/8, 2014 at 6:15 Comment(2)
This is understated - simple and small yet will resize all columns without needing to have a fixed number of columns in a row. Nice one!Chad
This isn't working, cause you set the last biggest height in the each function. If the third column is the highest column, column 1 and 2 aren't getting the right height.. You have to set the last line "$(this).css({'height':h});" after the each function. I will do an edit.Destitution
A
7

Some of the previous answers explain how to make the divs the same height, but the problem is that when the width is too narrow the divs won't stack, therefore you can implement their answers with one extra part. For each one you can use the CSS name given here in addition to the row class that you use, so the div should look like this if you always want the divs to be next to each other:

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

For all screens:

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

For when you want to use 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;
    }
}

For when you want to 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;
    }
}

For when you want to use 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;
    }
}

EDIT Based on a comment, there is indeed a simpler solution, but you need to make sure to give column info from the largest desired width for all sizes down to xs (e.g. <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;
}
Arlenaarlene answered 13/9, 2015 at 19:1 Comment(2)
You made that a lot more complicated than you needed to :) ` Just use flex-wrap: wrap; then you don't need all the separate ones... unless you specifically want them.Endomorphism
this fails on iPad SafariAmplification
G
5

I know I'm very late but now you can use the "min-height" style attribute to achieve your purpose.

Glomerulonephritis answered 25/2, 2016 at 4:52 Comment(0)
B
5

So yes, Bootstrap 4 does make all the cols in a row equal height, however if you are creating a border around the content inside the row you may find that it appears like the cols are not equal heights!

When I applied height: 100% to the element inside the col I found that I lost my margin.

My solution is to use padding on the col's div (instead of a margin on the inner element). Like so:

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

The above code example uses Bootstrap 4.1 to create a set of nine boxes with a border

Billion answered 17/1, 2019 at 12:11 Comment(0)
P
4
.row.container-height {
    overflow: hidden;
}

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

where .container-height is the style class that has to be added to a .row styled element to which all its .col* children have the same height.

Applying these styles only to some specific .row (with .container-height, as in the example) also avoids applying the margin and padding overflow to all .col*.

Prussiate answered 30/1, 2015 at 10:17 Comment(0)
P
4

Best out there:

Reflex - Docs

Works with Bootstrap

Update:

  1. Include the CSS
  2. Update your code:

/*!
 *
 * 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: [email protected]
 * 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>
Phonogram answered 4/5, 2015 at 15:38 Comment(1)
Welcome to Stack Overflow! While this link may answer the question, it is better to include the essential parts of the answer here and provide the link for reference. Link-only answers can become invalid if the linked page changes. See How do I write a good answer.Indecorous
M
3

here is my solution (compiled CSS):

.row.row-xs-eq {
  display: table;
  table-layout: fixed;
  margin: 0;
}

.row.row-xs-eq::before {
  content: none;
}

.row.row-xs-eq::after {
  content: none;
}

.row.row-xs-eq > [class^='col-'] {
  display: table-cell;
  float: none;
  padding: 0;
}

@media (min-width: 768px) {
  .row.row-sm-eq {
    display: table;
    table-layout: fixed;
    margin: 0;
  }

  .row.row-sm-eq::before {
    content: none;
  }

  .row.row-sm-eq::after {
    content: none;
  }

  .row.row-sm-eq > [class^='col-'] {
    display: table-cell;
    float: none;
    padding: 0;
  }
}

@media (min-width: 992px) {
  .row.row-md-eq {
    display: table;
    table-layout: fixed;
    margin: 0;
  }

  .row.row-md-eq::before {
    content: none;
  }

  .row.row-md-eq::after {
    content: none;
  }

  .row.row-md-eq > [class^='col-'] {
    display: table-cell;
    float: none;
    padding: 0;
  }
}

@media (min-width: 1200px) {
  .row.row-lg-eq {
    display: table;
    table-layout: fixed;
    margin: 0;
  }

  .row.row-lg-eq::before {
    content: none;
  }

  .row.row-lg-eq::after {
    content: none;
  }

  .row.row-lg-eq > [class^='col-'] {
    display: table-cell;
    float: none;
    padding: 0;
  }
}

So your code would look like:

<div class="row row-sm-eq">
  <!-- your old cols definition here -->
</div>

Basically this is the same system you use with .col-* classes with that difference you need to apply .row-* classes to the row itself.

With .row-sm-eq columns will be stacked on XS screens. If you don't need them to be stacked on any screens you can use .row-xs-eq.

The SASS version that we do actually use:

.row {
  @mixin row-eq-height {
    display: table;
    table-layout: fixed;
    margin: 0;

    &::before {
      content: none;
    }

    &::after {
      content: none;
    }

    > [class^='col-'] {
      display: table-cell;
      float: none;
      padding: 0;
    }
  }

  &.row-xs-eq {
    @include row-eq-height;
  }

  @media (min-width: $screen-sm-min) {
    &.row-sm-eq {
      @include row-eq-height;
    }
  }

  @media (min-width: $screen-md-min) {
    &.row-md-eq {
      @include row-eq-height;
    }
  }

  @media (min-width: $screen-lg-min) {
    &.row-lg-eq {
      @include row-eq-height;
    }
  }
}

Live demo


Note: mixing .col-xs-12 and .col-xs-6 inside a single row would not work properly.

Maller answered 29/4, 2015 at 14:34 Comment(1)
This is good. My solution is the same. And there is a possibility to have equal height columns with standard Bootstrap's 30px gaps between columns using border-spacing and negative margins.Gonium
L
3

There is a problem with using Solution 1 while appling it on only column in rows. Would like to improve Solution 1.

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

(Sorry, can't comment Popnoodles's anwer. I have not enough reputations)

Loidaloin answered 1/12, 2015 at 2:53 Comment(0)
A
3

For those looking for a quick, easy solution - if you have a relatively consistent set of block content setting a min-height on the div that is a bit bigger than the largest block can be easier to implement.

.align-box {
    min-height: 400px;
}
Arlinda answered 4/10, 2016 at 18:5 Comment(0)
N
3

03/19/2019

**Bootstrap 4 Equal Height Solution **

Bootstrap Utilities/flex for equal height

Live example in Codepen

Equal height by bootstrap class with parent div fixed height or min-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>
Narcose answered 19/3, 2019 at 17:11 Comment(1)
Why you give me Negative Vote. can you make a Comment for it ?Narcose
A
2

Here is my method, i have used flex with some changes in media query.

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

then added the classes to the parent which were required.

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

I am using responsive breakpoints because flux usually hampers the bootstrap standard responsive nature.

Anu answered 15/2, 2016 at 11:16 Comment(0)
E
2

I use this super easy solution with clearfix, which doesn't have any side effects.

Here is an example on 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>

And one more example on 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; ?>
Euchre answered 19/5, 2016 at 14:43 Comment(2)
This does not make your columns all the same height, though.Coenobite
For me wanting to have columns at the same height/place in row it is a solutionScharaga
G
2

I searched for a solution to the same problem, and found one just worked !! - with almost no extra code..

see https://medium.com/wdstack/bootstrap-equal-height-columns-d07bc934eb27 for a good disuccuion, and with the resposne you want in the bottom, with a link.

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

this was the correct responsive way to for me... a quote: ... 3 — Use flexbox (best!)

As of 2017, the best (and easiest) way to make equal height columns in a responsive design is using CSS3 flexbox.

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

and simply use:

div class="container">
   <div class="row display-flex .... etc..
Genni answered 4/4, 2018 at 15:1 Comment(0)
D
1

If it makes sense in your context, you can simply add an empty 12-column div after each break, which acts as a divider that hugs the bottom of the tallest cell in your row.

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

Hope this helps!

Diatonic answered 6/5, 2015 at 14:25 Comment(1)
This does not answer the question he asked!Elephantine
K
1
@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>

Example:

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

Adapted from several answers here. The flexbox-based answers are the right way once IE8 and 9 are dead, and once Android 2.x is dead, but that is not true in 2015, and likely won't be in 2016. IE8 and 9 still make up 4-6% of usage depending on how you measure, and for many corporate users it's much worse. http://caniuse.com/#feat=flexbox

The display: table, display: table-cell trick is more backwards-compatible - and one great thing is the only serious compatibility issue is a Safari issue where it forces box-sizing: border-box, something already applied to your Bootstrap tags. http://caniuse.com/#feat=css-table

You can obviously add more classes that do similar things, like .equal-height-md. I tied these to divs for the small performance benefit in my constrained usage, but you could remove the tag to make it more generalized like the rest of Bootstrap.

Note that the jsfiddle here uses CSS, and so, things Less would otherwise provide are hard-coded in the linked example. For example @screen-sm-min has been replaced with what Less would insert - 768px.

Keikokeil answered 28/7, 2015 at 1:3 Comment(0)
B
1

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()
});
Beal answered 25/11, 2017 at 8:33 Comment(0)
G
0

Thought I'd just add that the answer given by Dr.Flink can also be applied to a Bootstrap 3 form-horizontal block - which can be very handy if you want to use background colours for each cell. In order for this to work for bootstrap forms, you would need to wrap the form contents which just serves to replicate a table-like structure.

The example below also provides the CSS which demonstrates an additional media query allows Bootstrap 3 to simply takeover and do it's normal thing on the smaller screen(s). This also works in IE8+ .

Example:

<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;
  }
}
Geologize answered 27/3, 2014 at 21:14 Comment(0)
A
0

You can wrap the columns inside a 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>
Attwood answered 25/1, 2017 at 13:11 Comment(1)
Did not work for me with a button in one of the columns.Duncandunce
D
0

Try this do through 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>

Live JSFiddle - https://jsfiddle.net/grinmax_/spsn4fnq/

Dolhenty answered 6/3, 2017 at 11:16 Comment(0)
F
0

The bootstrap 4 way of dealing with equal height columns, if you have cards as columns, is by using the card-deck class in a container div of the cards, then all the cards inside that div will appear as columns with the same height.

Flavourful answered 27/1 at 19:49 Comment(0)
T
-4

Just checking through bootstrap documentation and I found the simple solution for the problem of column same height.

Add the extra clearfix for only the required viewport

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

For example:

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

Please refer to http://getbootstrap.com/css/#grid-responsive-resets

Thankful answered 3/7, 2016 at 8:21 Comment(0)
C
-5

You can use below code

var heights = $(".row > div").map(function() {
    return $(this).height();
}).get(),
maxHeight = Math.max.apply(null, heights);
$(".row > div").height(maxHeight);
Cobbie answered 7/11, 2016 at 11:56 Comment(0)
I
-7

alot of css here...

jQuery

$(document).ready(function() {

   // Get height of original column you want to match
   var box-height = $('.panel:nth-child(1)').outerHeight();

   // Output same height on particular element or element(s)
   $('.panel').height(box-height);

});

Really simple code no need to play with css, although all options above are perfectly usable.

Jsfiddle

Intra answered 16/5, 2015 at 0:35 Comment(1)
Yeah, there's a lot of CSS here because the question is tagged css and not javascript. Don't post JS solutions to problems that can be solved with pure CSS. In 99% of cases, the performance is worse.Invective

© 2022 - 2024 — McMap. All rights reserved.