Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Fluid width with equally spaced DIVs

I have a fluid width container DIV.

Within this I have 4 DIVs all 300px x 250px...

<div id="container">    <div class="box1"> </div>    <div class="box2"> </div>    <div class="box3"> </div>    <div class="box4"> </div> </div> 

What I want to happen is box 1 to be floated left, box 4 to be floated right and box 2 and 3 to be spaced evenly between them. I want the spacing to be fluid as well so as the browser is made smaller the space becomes smaller also.

enter image description here

like image 504
Lee Price Avatar asked Jul 28 '11 20:07

Lee Price


People also ask

How do I make a div fill full width?

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 auto adjust width?

Set display to inline-block to make the div width fit to its content. Use position: relative and left: 50% to position its left edge to 50% of its containing element. Use transform: translateX(-50%) which will "shift" the element to the left by half its own width.

How do I give a div equal space?

HTML. Approach: First we set the display of the container as grid. Then use the gap property of CSS to create equal spaced “div” elements.


1 Answers

See: http://jsfiddle.net/thirtydot/EDp8R/

  • This works in IE6+ and all modern browsers!
  • I've halved your requested dimensions just to make it easier to work with.
  • text-align: justify combined with .stretch is what's handling the positioning.
  • display:inline-block; *display:inline; zoom:1 fixes inline-block for IE6/7, see here.
  • font-size: 0; line-height: 0 fixes a minor issue in IE6.

#container {    border: 2px dashed #444;    height: 125px;    text-align: justify;    -ms-text-justify: distribute-all-lines;    text-justify: distribute-all-lines;    /* just for demo */    min-width: 612px;  }    .box1,  .box2,  .box3,  .box4 {    width: 150px;    height: 125px;    vertical-align: top;    display: inline-block;    *display: inline;    zoom: 1  }    .stretch {    width: 100%;    display: inline-block;    font-size: 0;    line-height: 0  }    .box1,  .box3 {    background: #ccc  }    .box2,  .box4 {    background: #0ff  }
<div id="container">    <div class="box1"></div>    <div class="box2"></div>    <div class="box3"></div>    <div class="box4"></div>    <span class="stretch"></span>  </div>

The extra span (.stretch) can be replaced with :after.

This still works in all the same browsers as the above solution. :after doesn't work in IE6/7, but they're using distribute-all-lines anyway, so it doesn't matter.

See: http://jsfiddle.net/thirtydot/EDp8R/3/

There's a minor downside to :after: to make the last row work perfectly in Safari, you have to be careful with the whitespace in the HTML.

Specifically, this doesn't work:

<div id="container">     ..     <div class="box3"></div>     <div class="box4"></div> </div> 

And this does:

<div id="container">     ..     <div class="box3"></div>     <div class="box4"></div></div> 

You can use this for any arbitrary number of child divs without adding a boxN class to each one by changing

.box1, .box2, .box3, .box4 { ... 

to

#container > div { ... 

This selects any div that is the first child of the #container div, and no others below it. To generalize the background colors, you can use the CSS3 nth-order selector, although it's only supported in IE9+ and other modern browsers:

.box1, .box3 { ... 

becomes:

#container > div:nth-child(odd) { ... 

See here for a jsfiddle example.

like image 184
thirtydot Avatar answered Sep 25 '22 02:09

thirtydot