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.
-
3Next time also place your example code please so the question becomes clearer to the developers here.. – Rob Apr 14 '10 at 13:35
-
1is 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 Answers
There are many ways to do what you're asking for:
- 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>
- Using CSS
display
property - which can be used to makediv
s act like atable
:
<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.

- 66,950
- 18
- 261
- 230

- 43,890
- 13
- 88
- 135
-
26
-
1What 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
-
1what does overflow: hidden do? isnt this for elements with a specified height? – michael Jul 27 '17 at 20:51
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.
-
6It 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
-
2Is 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
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

- 2,940
- 1
- 26
- 23
-
5Probably `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
-
1This 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
-
2nvm, 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
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>

- 241,084
- 71
- 387
- 401
<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.

- 7,865
- 3
- 29
- 32
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.

- 66,950
- 18
- 261
- 230

- 6,731
- 12
- 52
- 90
-
1This 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
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.

- 28,364
- 7
- 89
- 119