133

I have two elements inside a container, which are being side-by-side by using flex box. On the second element (.flexbox-2), I am setting it's height in the CSS. However, then the first element (.flexbox-1) will match the height of .flexbox-2. How would I stop .flexbox-1 from matching the height of .flexbox-2, and instead just retain its natural height?

Here is what I have so far (also available as a jsFiddle)

.container {
  display: -webkit-flex;
  -webkit-flex-direction: row;
}
.flexbox-1 {
  -webkit-flex: 1;
  border: solid 3px red;
}
.flexbox-2 {
  -webkit-flex: 2;
  border: solid 3px blue;
  height: 200px;
  margin-left: 10px;
}
<div class="container">
  <div class="flexbox-1">.flexbox-1</div>
  <div class="flexbox-2">.flexbox-2</div>
</div>
misterManSam
  • 24,303
  • 11
  • 69
  • 89
Tom Oakley
  • 6,065
  • 11
  • 44
  • 73

6 Answers6

218

I know this is an old question but a better solution is to set the flex item to align to the top using flex-start.

/* Default Styles */
.container {
  display: flex;
}
.flexbox-2 {
  flex: 2;
  border: solid 3px blue;
  height: 200px;
  margin-left: 10px;
}
 .flexbox-1 {
  flex: 1;  
  align-self: flex-start;  
  border: solid 3px red;
}
<div class="container">
  <div class="flexbox-1">"align-self: flex-start;"</div>
  <div class="flexbox-2">.flexbox-2</div>
</div>
Aaron
  • 10,187
  • 3
  • 23
  • 39
76

This is an old solution. My answer is superseded by this new answer by Aaron using align-self. That is a better solution that does not rely on a CSS quirk.

As long as the flex container has no height itself, you can set height: 0% on the first flex item. Because it has no height to inherit from its parent, any percentage height will cause it to collapse. It will then grow with its contents.

Example

In this example I have removed the -webkit prefix. It's only really required for Safari and the prefix can be added above the non-prefixed version. I also removed flex-direction: row as it is the default value.

.container {
  display: flex;
}
.flexbox-1 {
  flex: 1;  
  height: 0%;  
  border: solid 3px red;
}
.flexbox-2 {
  flex: 2;
  border: solid 3px blue;
  height: 200px;
  margin-left: 10px;
}
<div class="container">
  <div class="flexbox-1">.flexbox-1</div>
  <div class="flexbox-2">.flexbox-2</div>
</div>
Community
  • 1
  • 1
misterManSam
  • 24,303
  • 11
  • 69
  • 89
19

You can easily fix that by adding to the parent align-items: flex-start;

That's all

Sergiu Cebotaru
  • 231
  • 2
  • 2
  • 10
    Welcome to Stack Overflow. When adding an answer to a five year old question with existing answers it is important to explain what new aspect of the question you are addressing and how your answer works and why it should be used. Correct code formatting also really helps as right now you just have bold text in a sentence which doesn't provide context about which css rule to add it to. – Jason Aller Mar 25 '20 at 15:54
  • Yes, but that would align **all** items to the top – Aaron Aug 31 '21 at 13:42
4

Setting the height of the children to max-content will prevent them to shrink.

.container {
  display: -webkit-flex;
  -webkit-flex-direction: row;
}
.flexbox-1 {
  -webkit-flex: 1;
  border: solid 3px red;
  height: max-content;
}
.flexbox-2 {
  -webkit-flex: 2;
  border: solid 3px blue;
  height: 200px;
  margin-left: 10px;
}
<div class="container">
  <div class="flexbox-1">.flexbox-1</div>
  <div class="flexbox-2">.flexbox-2</div>
</div>
Erik Martín Jordán
  • 4,332
  • 3
  • 26
  • 36
0

Another option is to utilize "col" element and auto-width feature, which works as auto-height feature when flexbox orientation is column. Here's an example with bootstrap 5

<div class="d-flex flex-column">
    <div class="col">
      1 of 3
    </div>
    <div class="col">
      2 of 3
    </div>
    <div class="col">
      3 of 3
    </div>
</div>

Reference: https://getbootstrap.com/docs/5.0/layout/grid/#equal-width

Bogdans
  • 145
  • 7
0

I wanted to comment on @misterManSam's answer, but I don't have reputation enough.

It worked me well but I had some troubles on Vercel (maybe, I was using node-sass, in another version), setting

height: 0%;

I recommend

height: 100%;

It's exactly the same answer, but it works everywhere.

Grifo
  • 1