Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Children element with height: 100% getting pushed by siblings

I have a very simple structure:

<div class="parent">
    <h1>Element taking space</h1>
    <div class="stretch">
        Not much content, but needs to be stretched to the end.
    </div>
</div>

The parent div has a set height, and I want div.stretch to stretch all the way to that height, regardless of how little content it has. Using height: 100% does the trick, until you add some other element which pushes the content down.

I guess that specifying height: 100% means that the element should have the exact same absolute/computed height as the parent element, and not the remainder of the height after all the other elements have been computed.

Setting overflow: hidden obviously hides the overflowing content, but that's not an option for me.

Is there any way I can achieve that in pure CSS?

Demo of my problem

like image 223
Sunyatasattva Avatar asked Apr 10 '13 16:04

Sunyatasattva


3 Answers

In the time since this question was asked and answered, a better way to achieve this has come into existence: flex-box.

Just set the parent's display to "flex" and flex-direction to "column", and set the "stretchy" child's height to "inherit". The child will inherit a height of however many pixels are left over to fill up its parent.

In the following example, lines marked /* important */ are part of the actual solution; the rest of the CSS is just to make it visually easier to understand.

.parent {
  display: flex; /* important */
  flex-direction: column; /* important */
  height: 150px;
  border: 6px solid green;
}

h1 {
  background: blue;
  margin: 0px;
  height: 90px
}

.stretch {
  background: red;
  height: inherit; /* important */
}
<div class="parent">
    <h1>Element taking space</h1>
    <div class="stretch">
        Not much content, but needs to be stretched to the end.
    </div>
</div>
like image 77
Alex von Brandenfels Avatar answered Nov 20 '22 13:11

Alex von Brandenfels


You could float the h1 element. It would work no matter what height it is, and the content of the stretch element will be pushed below it. But I'm not entirely sure if this is what you are looking for.

EDIT: I'm not certain what kind of browser support you're looking for, but you could also set the display to table on .parent and then have .stretch inherit the height. Then you can nest the column divs inside of .stretch and float them.

Updated: http://jsbin.com/oluyin/2/edit

HTML

<div class="parent">
    <h1>Element taking space</h1>
    <div class="stretch">
        <div class="col">Not much content, but needs to be stretched to the end.</div>
        <div class="col">Not much content, but needs to be stretched to the end.</div>
    </div>
</div>

CSS

.parent {
    display: table;
}

.stretch {
    height: inherit;
}

.col {
    float: left;
    width: 50%;
}
like image 3
thgaskell Avatar answered Nov 20 '22 14:11

thgaskell


If you know the height of your H1 you can do this to fill out the child:

.parent {

  background-color: #eee;
  border: 1px solid black;
  width: 300px;
  height: 600px;
  position:relative;

}

h1 { Height: 100px; }

.stretch
{
  background-color:#dddddd;
  position: absolute;
  left: 0;
  width: 100%;
  top: 100px;
  bottom: 0;
}

Example: http://jsbin.com/apocuh/1/edit

If you don't know the height of H1, I'm afraid you will probably need to use JavaScript or thgaskell's method.

Take a look at this post for more information, and an example with JS: CSS: height- fill out rest of div?

like image 1
Adam Plocher Avatar answered Nov 20 '22 14:11

Adam Plocher