314

I have a main wrapper div that is set 100% width. Inside that i would like to have two divs, one that is fixed width and the other that fills the rest of the space. How do i float the second div to fill the rest of the space. Thanks for any help.

markt
  • 3,143
  • 2
  • 16
  • 4
  • 3
    Next time also place your example code please so the question becomes clearer to the developers here.. – Rob Apr 14 '10 at 13:35
  • 1
    is position:absolute an option? you can set the position to the sides of the container, and the div will take the new size. – Alex Apr 14 '10 at 13:35

7 Answers7

425

There are many ways to do what you're asking for:

  1. Using CSS float property:

 <div style="width: 100%; overflow: hidden;">
     <div style="width: 600px; float: left;"> Left </div>
     <div style="margin-left: 620px;"> Right </div>
</div>
  1. Using CSS display property - which can be used to make divs act like a table:

<div style="width: 100%; display: table;">
    <div style="display: table-row">
        <div style="width: 600px; display: table-cell;"> Left </div>
        <div style="display: table-cell;"> Right </div>
    </div>
</div>

There are more methods, but those two are the most popular.

NearHuscarl
  • 66,950
  • 18
  • 261
  • 230
Crozin
  • 43,890
  • 13
  • 88
  • 135
  • 26
    HTML 5 solution from @filoxo, use that instead – TheMcMurder May 13 '15 at 00:46
  • 1
    What the previous commenter said: consider adding HTML5 solution per filoxo as #3. – Ahmed Fasih May 26 '15 at 04:54
  • 4
    @TheMcMurder: for us who needs to support old browsers (eg IE < 11), that's not an option. – Oyvind Jun 24 '16 at 13:52
  • @Oyvind, you're exactly right. It depends on your use case. If you are supporting IE 8, 9, or 10 you would have to polyfill support I'd recommend a service like polyfill.io https://cdn.polyfill.io/v2/docs/ or https://github.com/10up/flexibility but you may have really strict requirements that prevent using polyfills. – TheMcMurder Jun 27 '16 at 15:38
  • 1
    what does overflow: hidden do? isnt this for elements with a specified height? – michael Jul 27 '17 at 20:51
239

CSS3 introduced flexible boxes (aka. flex box) which can also achieve this behavior.

Simply define the width of the first div, and then give the second a flex-grow value of 1 which will allow it to fill the remaining width of the parent.

.container{
    display: flex;
}
.fixed{
    width: 200px;
}
.flex-item{
    flex-grow: 1;
}
<div class="container">
  <div class="fixed"></div>
  <div class="flex-item"></div>
</div>

Demo:

div {
    color: #fff;
    font-family: Tahoma, Verdana, Segoe, sans-serif;
    padding: 10px;
}
.container {
    background-color:#2E4272;
    display:flex;
}
.fixed {
    background-color:#4F628E;
    width: 200px;
}
.flex-item {
    background-color:#7887AB;
    flex-grow: 1;
}
<div class="container">
    <div class="fixed">Fixed width</div>
    <div class="flex-item">Dynamically sized content</div>
</div>

Note that flex boxes are not backwards compatible with old browsers, but is a great option for targeting modern browsers (see also Caniuse and MDN). A great comprehensive guide on how to use flex boxes is available on CSS Tricks.

hong4rc
  • 3,999
  • 4
  • 21
  • 40
filoxo
  • 8,132
  • 3
  • 33
  • 38
  • 6
    It took all day to find a solution and this answer solved it! I have 4 panels side by side with the 3rd and 4th panels sometimes not having anything in them. They all live in a containing div with a border around them. The whole float:left on the first div situation left me with a div going past the border on the bottom because the labels generated are dynamic. The labels are spans cuz that's how ASP renders them. Not having the float:left made only 3 of the divs on the same row. And a using a table is out of the question. Thank you! – Luminous Mar 31 '15 at 20:08
  • 2
    Is there a backwards compatible method to use something like this, i.e. for us poor saps who still have to support IE 8-10 – Ben A. Hilleli Nov 09 '15 at 21:24
  • 1
    @BenA.Hilleli that might depend on your requirements (eg. [progressive enhancement or graceful degradation](https://www.w3.org/wiki/Graceful_degradation_versus_progressive_enhancement)) but a quick search yielded this (a bit out-dated) ["How to use flexbox in the real world" guide](http://www.planningforaliens.com/blog/2014/03/11/real-world-flexbox/) as well as [Flexie.js](https://github.com/doctyper/flexie) which supports IE6-9. Alternatively, try out any of the other answers for this question since they achieve the same thing. – filoxo Nov 22 '15 at 16:50
36

I don't know much about HTML and CSS design strategies, but if you're looking for something simple and that will fit the screen automatically (as I am) I believe the most straight forward solution is to make the divs behave as words in a paragraph. Try specifying display: inline-block

<div style="display: inline-block">
   Content in column A
</div>
<div style="display: inline-block">
   Content in column B
</div>

You might or might not need to specify the width of the DIVs

Guillermo Ruffino
  • 2,940
  • 1
  • 26
  • 23
  • 5
    Probably `display:flex` is the best solution, but I think `inline-block` is also excellent because it works on more browsers. By the way, you might need to wrap both divs with a `
    ` to prevent break up on resize.
    – John Henckel Nov 15 '16 at 14:42
  • 1
    This is good solution for templating. The only issue is that it pushes a div with lesser content to the bottom. How to push it to the top? – almost a beginner Aug 13 '18 at 05:03
  • 2
    nvm, just needed to search it, solution is: vertical-align:top; – almost a beginner Aug 13 '18 at 05:04
  • @JohnHenckel that means it is not for all the browsers , could it not be working for all browsers in a same way? `inline-block` code. – Kavindu Gayantha May 02 '19 at 07:45
  • @guillermo it is not working well. all the divs are not placing side by side. why is that. it is not clear. – Kavindu Gayantha May 02 '19 at 08:13
15

You can use CSS grid to achieve this, this is the long-hand version for the purposes of illustration:

div.container {
    display: grid;
    grid-template-columns: 220px 20px auto;
    grid-template-rows: auto;
}

div.left {
    grid-column-start: 1;
    grid-column-end: 2;
    grid-row-start: row1-start
    grid-row-end: 3;
    background-color: Aqua;
}

div.right {
    grid-column-start: 3;
    grid-column-end: 4;
    grid-row-start: 1;
    grid-row-end; 1;
    background-color: Silver;
}

div.below {
    grid-column-start: 1;
    grid-column-end: 4;
    grid-row-start: 2;
    grid-row-end; 2;
}
<div class="container">
    <div class="left">Left</div>
    <div class="right">Right</div>
    <div class="below">Below</div>
</div>

Or the more traditional method using float and margin.

I have included a background colour in this example to help show where things are - and also what to do with content below the floated-area.

Don't put your styles inline in real life, extract them into a style sheet.

div.left {
    width: 200px;
    float: left;
    background-color: Aqua;
}

div.right {
    margin-left: 220px;
    background-color: Silver;
}

div.clear {
    clear: both;
}
    <div class="left"> Left </div>
    <div class="right"> Right </div>
    <div class="clear">Below</div>
<div style="width: 200px; float: left; background-color: Aqua;"> Left </div>
<div style="margin-left: 220px; background-color: Silver;"> Right </div>
<div style="clear: both;">Below</div>
Fenton
  • 241,084
  • 71
  • 387
  • 401
2
<div class="container" style="width: 100%;">
    <div class="sidebar" style="width: 200px; float: left;">
        Sidebar
    </div>
    <div class="content" style="margin-left: 202px;">
        content 
    </div>
</div>

This will be cross browser compatible. Without the margin-left you will run into issues with content running all the way to the left if you content is longer than your sidebar.

RDL
  • 7,865
  • 3
  • 29
  • 32
1

Give the first div float: left; and a fixed width, and give the second div width: 100%; and float: left;. That should do the trick. If you want to place items below it you need a clear: both; on the item you want to place below it.

NearHuscarl
  • 66,950
  • 18
  • 261
  • 230
Rob
  • 6,731
  • 12
  • 52
  • 90
  • 1
    This answer failed to work with me. Giving the second div width: 100% means to fill 100% of the viewport, it does not mean fill 100% of the remaining after floating the first div left. – samjesse Apr 18 '21 at 16:34
1

If you're not tagetting IE6, then float the second <div> and give it a margin equal to (or maybe a little bigger than) the first <div>'s fixed width.

HTML:

<div id="main-wrapper">
    <div id="fixed-width"> lorem ipsum </div>
    <div id="rest-of-space"> dolor sit amet </div>
</div>

CSS:

#main-wrapper {
    100%;
    background:red;
}
#fixed-width {
    width:100px;
    float:left
}
#rest-of-space {
    margin-left:101px;
        /* May have to increase depending on borders and margin of the fixd width div*/
    background:blue;
}

The margin accounts for the possibility that the 'rest-of-space' <div> may contain more content than the 'fixed-width' <div>.

Don't give the fixed width one a background; if you need to visibly see these as different 'columns' then use the Faux Columns trick.

Richard JP Le Guen
  • 28,364
  • 7
  • 89
  • 119