You're going to have to resolve yourself to using fixed widths for your labels (if going the pure CSS route.) Below is the minimum to get what you're trying to accomplish (pulled from HTML Dog.)
CSS:
label {
clear: left;
float: left;
width: 7em; /* or whatever length suits */
text-align: right;
}
HTML:
<form>
<div><label>Item 1</label><input /></div>
<div><label>Item 2</label><input /></div>
<div><label>Item 3</label><textarea></textarea></div>
</form>
If you absolute don't want fixed widths, then you can use this javascript (with jQuery) and remove the fixed width from the above CSS. It is worth noting that if you get people with javascript turned off, this will look awful!
var largestWidth = 0;
$('label').each(
function() {
if ($(this).width() > largestWidth) {
largestWidth = $(this).width();
}
});
$('label').each(
function() {
$(this).width(largestWidth);
});
I've thrown up a live example on JSFiddle.
Given the use case that you've cited, I actually think tables is the better way to go, but then I have a differing opinion on the table/div form debate than most.