MirrorMirror
MirrorMirror

Reputation: 188

make the last div in a container have the rest of the height ( preferrably no javascript )

I want divBody2 to fill the rest of the height in the div. Using a table was not initially my intention, but I was unable to do it without a table, so I thought of using one. Still the solution seems to elude me.

html:

<div id="divContainer" class="Container">
 <div id="divContainerLeft" class="ContainerLeft">
  <table>
    <tr style="height: 1%;">
     <td>
         <div style="background-color: white;">Header1</span>
     </td>
    </tr>
    <tr style="height: 1%;">
      <td>
        <div id="divBody1" class="Body1">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis </p>
        </div>
      </td>
    </tr>

    <tr style="height: 1%;">
     <td>
         <div style="background-color: white;">Header2</span>
     </td>
    </tr>
    <tr style="height: 100%;">
      <td>
        <div id="divBody2" class="Body1" style="background-color: red;">
                                        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam rhoncus, felis interdum condimentum consectetur, nisl libero elementum eros, vehicula congue lacus eros non diam. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus mauris lorem, lacinia id tempus non, imperdiet et leo. Cras sit amet erat sit amet lacus egestas placerat. Aenean ultricies ultrices mauris ac congue. In vel tortor vel velit tristique tempus ac id nisi. Proin quis lorem velit. Nunc dui dui, blandit a ullamcorper vitae, congue fringilla lectus. Aliquam ultricies malesuada feugiat. Vestibulum placerat turpis et eros lobortis vel semper sapien pulvinar.</p>
                                        <p>Pellentesque rhoncus aliquet porta. Sed vel magna eu turpis pharetra consequat ut vitae lectus. In molestie sollicitudin mi sit amet convallis. Aliquam erat volutpat. Nullam feugiat placerat ipsum eget malesuada. Nulla facilisis nunc non dolor vehicula pretium. Sed dui magna, sodales id pharetra non, ullamcorper eu sapien. Mauris ac consectetur leo. Mauris consequat, lectus ut bibendum pulvinar, leo magna feugiat enim, eu commodo lacus sem vel ante. Sed tempus metus eget leo mollis vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</p>
                                        <p>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed pulvinar rhoncus quam, vel semper tellus viverra id. Nulla rutrum porttitor odio, a rutrum purus gravida non. Etiam ac purus augue, eget vestibulum purus. Aenean venenatis ullamcorper augue, non consequat elit tempor sed. Donec velit sapien, volutpat sed ultricies egestas, semper a ante. Fusce dapibus, quam eget auctor suscipit, nibh leo posuere ante, at auctor nisi lacus in sem. Morbi interdum consectetur euismod. Cras accumsan est lacus. Nulla eleifend, eros vel consequat commodo, arcu nunc malesuada nunc, quis sagittis felis sem ac turpis.</p>
                                        <p>Nulla rhoncus elementum convallis. Mauris condimentum aliquet egestas. Ut iaculis nisi eget tellus accumsan venenatis. Maecenas imperdiet aliquam porta. Aenean ultrices dolor sed quam laoreet varius. Curabitur condimentum blandit erat, quis accumsan eros interdum vitae. Curabitur ligula arcu, sollicitudin vitae iaculis sed, blandit sit amet enim. Morbi ullamcorper, metus vel mollis tristique, arcu turpis malesuada nisi, at dignissim lorem odio a orci. Proin ultrices, ipsum ut vestibulum interdum, libero felis auctor mi, vitae convallis nisl justo ac tellus. Integer nec lacinia turpis. Etiam massa nisl, rhoncus quis rutrum in, pretium eu leo. Proin a velit ut nulla laoreet vestibulum. Curabitur eu elit vitae felis auctor tincidunt. Curabitur tincidunt, metus sed sollicitudin cursus, quam elit commodo erat, ut tempor erat sapien vitae velit. Morbi nec viverra erat.</p>
        </div>
      </td>
    </tr>

   </table>
</div>

css:

.Container {
    position: absolute;
    top: 2%;
    left: 2%;
    height: 96%;
    width: 96%;
    overflow: visible;
    background-color: cyan;
    border: 0px solid #000000;
}

.ContainerLeft {
    position: absolute;
    top: 0px;
    left: 0px;
    height: 100%;
    width: 200px;
    overflow: visible;
    border: 0px solid black;
    padding: 0px;
    margin: 0px;
    background-color: green;
}

.ContainerLeft table {
    position: relative;
    top: 0px;
    left: 0px;
    width: 100%;
    height: 100%;
    border: 1px solid #000000;
    border-spacing: 2px;
    background-color: cyan;
}

.ContainerLeft tr {
    border: 0px solid #000000;
}

.ContainerLeft td {
    vertical-align: top;
    border: 0px solid #000000;
}

.Body1 {
    position: relative;
    left: 0px;
    top: 0px;
    height: auto;
    right: 0px;
    border: 0px solid black;
    background-color: #FFFFFF;
}

jsfiddle:

http://jsfiddle.net/p25hF/2/

is there any way to achieve this? i have set the table height to 100% of the parent container, but if the text ( or subdiv ) is large enough the table gets bigger than the parent container.

the problem doesn't seem to exist for the width ( width: 100% ), only for the height.

And for some reason i can't imagine, trying bottom: 0px; doesn't work either.

Upvotes: 0

Views: 54

Answers (1)

Jan
Jan

Reputation: 1414

As explained in this question, there is no way to do it with CSS(2).

However, if you don't need to support older browsers, you can use flexbox. It is pretty simple. Assuming the following HTML:

<div class="outer">
    <div class="inner"></div>
    <div class="inner"></div>
    <div class="inner"></div>
</div>

You can get the desired behaviour with a few lines of CSS:

.outer {
    height: 200px;
    display: flex;
    justify-content: flex-start;
}
.inner {
    overflow: auto;
    flex-shrink: 0;
    flex-grow: 0;
}
.inner:last-child {
    flex-shrink: 1;
    flex-grow: 1;
}

See a working example here: http://jsfiddle.net/ECf9M/1/ (requires a modern browser).

Upvotes: 1

Related Questions