Here is my proposed markup:
<div class="row">
<div class="col half">
<div class="col narrow">(1)</div>
<div class="col remainder">(2)</div>
</div>
<div class="col remainder">
<div class="col narrow">(1)</div>
<div class="col remainder">(2)</div>
</div>
</div>
<div class="row">
<div class="col half">(3)</div>
<div class="col remainder">(3)</div>
</div>
<div class="row">
(4)
</div>
And styles:
/* structure */
.row { clear: both; overflow: hidden; }
.col { float: left; }
.half { width: 50%; }
.narrow { width: 30%; }
.remainder { float: none !important; overflow: hidden; }
/* skin: just for demo */
.row { text-align: center; border-bottom: 1px solid #999; }
.half { background: #fcc; }
.narrow { background: #ccf; }
.remainder { background: #cfc; }
The first two rows are split into half. In each half are two cells: the first is called narrow
and is floated. I put 30% on the width for this one just for the demo (note: that's 30% of the half of the row). The other column is called remainder
and is not floated. It uses overflow to set its own rendering context, which means it fills the block to the right of the floated column.
You can have more floated columns (left or right), but only one remainder.
I put it up on jsfiddle: play with it.