I'm not an HTML/CSS guru, but I do know my way around and I do try to use "semantic HTML" and CSS for styling wherever possible. I hate tables for layout, if for no other reason than they're a big mess and hard to read, and I do all my HTML by hand (or generated programmatically, e.g. by Markdown, Markaby, or Haml).

So I'm a little bit surprised that even lil' ol' dabbler me has more than once wished to put blocks together in an inline-like flow, e.g. for a photo gallery or other dynamic grid-based layout, and yet the big guys are content to fall back on tables. Maybe I can afford to be more puritanical as a hobbyist.

I dug into the issue once again, determined to finally grok the CSS box model and view model once and for all. I don't know if I got that far, but I do understand enough about display: block and display: inline to see why it doesn't work the way I was hoping it would work. It boils down to a block element will seek the left edge of its parent.

But, there *is* a way to do precisely what I want to do in CSS 2.1. It's called display: inline-block, and it says to layout block elements in the inline flow. If you're still lost about what I'm driving at, there's a nice live demo and screenshot of display: inline-block at quirksmode.org. Alas, IE and Gecko (Firefox, Mozilla, Camino, etc.) don't support this display mode. But in browsers that do (e.g. KHTML-based browsers like Konq and Safari), it's a thing of beauty.

So we need a workaround for Firefox and IE. You could revert to tables if you detect those browsers, but I like to keep the HTML unchanged. You could use float: left, and that works very well unless your blocks are different heights. So you can force your blocks to be the same height, and possibly use overflow: auto to give scrollbars as needed (or hide the overflow or let it just overflow or whatever).

So here's a little example. The blue blocks use display: inline-block and the green blocks use float: left.

.inlineblock {display:inline-block; border: solid blue; width:150px;margin:5px;} .floatleft {float:left; border: solid green; width:150px;margin:5px;}

Lorem
ipsum
dolor
sit
amet
The
quick
brown
fox
Lorem
ipsum
dolor
sit
amet
The
quick
brown
fox

Do play around with it by resizing your browser and dusting off that Konquerer or Safari browser to see how the blue blocks look when rendered correctly.

I think it's a crying shame that firefox doesn't render this properly. Maybe the complacent table-hugging masses haven't made enough noise. Let's make some noise.

While I'm on the subject, I highly recommend css_browser_selector.js method of doing browser-specific CSS.