Я использую структуру, очень схожую со структурой, созданной скаффолдингом ASP.NET, за исключением того, что я использую div вместо ps:
<form>
<fieldset>
<legend>Legendary Fieldset</legend>
<div>
<label for="textBox">Text Input</label>
<input name="textBox" id="textBox" />
</div>
<div>
<label for="selectBox">Select box</label>
<select name="selectBox" id="selectBox">
<option>1</option>
<option>2</option>
</select>
</div>
</fieldset>
<!-- more fieldsets if required -->
</form>
Я использую div, потому что для меня это более семантически правильно, чем p элементов, так как они предназначены для абзацев текста.
Когда дело доходит до стиля, это также универсальная структура, потому что вы можете, например, сделать ширину поля 500px шириной, а div поля 250px шириной и плавать, таким образом достигая бок о бок. Или вы можете иметь ту же ширину для набора полей, что и div набора полей. ИЛИ вы могли бы получить набор полей fieldset и fieldset одинаковой ширины, а затем прикрепить класс к некоторым элементам div (скажем, «половина»), которые имеют половину ширины и являются плавающими. Возможности действительно безграничны.
В любом случае это именно то, что я использую для повседневных дел - хотя оно универсально, оно может не соответствовать всем требованиям.
РЕДАКТИРОВАТЬ Что касается списков определений, то это специализированные элементы, которые семантически не должны использоваться для разметки формы.