Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Make div fill remaining space of parent

I need some help with positioning divs. The HTML structure is as follows:

<div class="container">
    <div class="item">
        <div class="left">
            lorem lorem
        </div>
        <div class="right">
            <p>right</p>
            <p class="bottom">bottom</p>
        </div>
    </div>
</div>

And I have the following CSS:

.container {
    float: left;
    padding: 15px;
    width: 600px;
}
.item {
    float: left;
    padding: 15px;
    width: 570px;
}
.left {
    float: left;
    padding: 40px 20px;
    margin-right: 10px;
}
.right {
    position: relative;
    float: left;
}
.bottom {
    position: absolute;
    bottom: 0;
}

The width and height of the left div is dynamic.

What I want to achieve is:

  1. Make the height of the right div equal to height of the left div.
  2. Make the width of the right div fill the rest of the div with class item.
  3. The paragraph with class bottom should be at the bottom of the right div.

Here is a simple image that represents my goal: enter image description here

And a link to a JSFiddle demo.

like image 836
user1292810 Avatar asked Apr 06 '13 16:04

user1292810


People also ask

How do I fill a div with remaining space?

The width property is used to fill a div remaining horizontal space using CSS. By setting the width to 100% it takes the whole width available of its parent. Example 1: This example use width property to fill the horizontal space. It set width to 100% to fill it completely.

How do I make a div take up the whole parent div?

Since the child div is a child of the parent div , then you can set its width to 100%, which will set it to 100% of the parent width. If you know the width of the parent, then you can just set its width to the same value.

How do I make a div take up the whole width?

What you could do is set your div to be position: absolute so your div is independent of the rest of the layout. Then say width: 100% to have it fill the screen width. Now just use margin-left: 30px (or whatever px you need) and you should be done.

How do I make my div 100% of the screen?

Syntax: To set a div element height to 100% of the browser window, it can simply use the following property of CSS: height:100vh; Example: HTML.


4 Answers

Getting the correct position and width of .bottom appears to be the biggest hurdle for a cross-browser, CSS solution.

Options

1. Floats

As @joeellis demonstrated, the flexible widths can be achieved by floating only the left column, and applying overflow:hidden to the right column.

The position of .bottom cannot be achieved in any browser. There's no CSS solution for floated columns with equal, variable height. An absolutely positioned .bottom element must be inside the right column div, so that 100% width would give it the correct size. But since the right column won't necessarily be as tall as the left column, positioning .bottom with bottom:0 won't necessarily place it at the bottom of the container.

2. HTML tables and CSS tables

The flexible widths can be achieved by giving the left cell a width of 1px and not specifying a width for the right cell. Both cells will grow to fit the content. Any extra space will be added to the right cell alone.

If .bottom is inside the right table cell, the position can't be achieved in Firefox. Relative position has no effect in a table cell in Firefox; absolute position and 100% width would not be relative to the right table cell.

If .bottom is treated as a separate table cell in the right column, the correct heights of the right and bottom table cells cannot be achieved in any browser other than Firefox. Table cells aren't flexible in height the same way they are in width (except in Firefox).

3. CSS3 flexbox and CSS3 grids

Flexbox and grids are the promising layout tools of the near future. But flexbox isn't supported by IE9 or earlier, and grids aren't supported by any browser other than IE10. Haven't tested if either can achieve this layout, but browser support may prevent them from being an option at present.

Summary

  • Floats don't offer a solution for any browser.
  • HTML tables and CSS tables don't offer a cross-browser solution.
  • Flexbox doesn't offer a potential solution for IE9 or earlier (and may or may not offer a solution to other browsers).
  • Grids only offer a potential solution to IE10 (and may or may not offer a solution there).

Conclusion

There doesn't appear to be an adequate CSS solution at present, one that would work in enough relevant browsers, with the possible exception of flexbox (if support for IE9 and earlier isn't required).

jQuery

Here's a couple modified demos that use jQuery to force the columns to have the same height. The CSS and jQuery for both demos is the same. The HTML only differs by how much content is in the left and right column. Both demos tested fine in all browsers. The same basic approach could be used for plain JavaScript.

  • Taller content on the left
  • Taller content on the right

To keep things simple, I moved the internal padding for the left and right div to a child element (.content).

like image 151
Matt Coughlin Avatar answered Oct 11 '22 20:10

Matt Coughlin


Sibling elements of same height and staying on the same row can be achieved by displaying them as table-cell and parent as display: table.
Working fiddle: http://jsfiddle.net/SgubR/2/ (which also display the overflow: hidden along a floating element technique for creating a column. The latter needs a clearfix)

Table-cell in CSS uses any HTML element you want (section, div, span, li, whatever), its semantics is unrelated to table, tr and td elements used for table layout (except that the visual result is the same, that's what we want).

  • display: table is set on a parent
  • display: table-row may be used on an element in-between but if it works without it, fine
  • display: table-cell is set on each child
  • a width is set on none, some or all these "cells". Browser will adapt both to content and widths set in order to calculate their widths (and total width of parent, obviously)
  • table-layout: fixed will tell browsers to switch to the other table layout algorithm where they don't care about the quantity of content, only to widths set by CSS
  • vertical-align: top will be needed in most cases (but you may set other values, great for complex layouts)
  • margins aren't applied on "cells", only padding. Margins only apply on table itself. Though you still can separate "cells" with border-collapse: separate and/or border-spacing: 4px 6px

Compatibility: IE8+
Fallback for IE6/7 if needed is exactly the same as for inline-block

Longer explanations in previous answers: here and there with also the good old method of faux-columns (your design must be thought with this technique in mind)

like image 27
FelipeAls Avatar answered Oct 11 '22 21:10

FelipeAls


Something like this might work:

http://jsfiddle.net/PCvy9/2/

The main key of what you're looking for lines in the:

 .right {
   overflow: hidden;
   background-color: #C82927;
 }

This is due to something called the "block formatting context." Great reasoning and tutorial as to why here: http://colinaarts.com/articles/the-magic-of-overflow-hidden/#making-room-for-floats

However, their heights are not completely linked; in this example, your left side block's height would still need to be manually set (as it's a floated container)

like image 29
joeellis Avatar answered Oct 11 '22 20:10

joeellis


Just add an oveflow to the right column and don't float it.

.right {
  position: relative;
  overflow: hidden;
}

This will make right to fill the rest of the width.

like image 32
pzin Avatar answered Oct 11 '22 21:10

pzin