I’ve seen a lot of examples on the web where forms are laid out like so:
<form>
<p><input></p>
</form>
To my surprise, this is also described in the specification:
Any form starts with a form element, inside which are placed the
controls. Most controls are represented by the input element, which by
default provides a one-line text field. To label a control, the label
element is used; the label text and the control itself go inside the
label element. Each part of a form is considered a paragraph, and is
typically separated from other parts using p elements. Putting this
together, here is how one might ask for the customer’s name:
Though this section is non-normative, it still seems to me that this is bad practice and not semantic. I suppose that the purpose is to put inputs on their own line, but shouldn’t the display of these elements be controlled using CSS?
Is there a reason why the W3C advises forms be laid out this way? Am I missing something?
If you are writing a form in a meaningful (read: semantic) way, you will want the flow of text to lead to the element:
An even better way is to treat your form like a mad-libs script:
A
pelement isn’t the only way to mark-up a form. If a matrix of data is being added/edited, it’s semantically valid to use a table.In other cases, you might not want to use a wrapping element. It depends on what content you want to be serving up. Worry about styling it all after you’ve got your content sorted out.