Верстка веб-форм
Опубликовал Александр Шабуневич — 6 Май 2009, 11:30
Верстка веб-форм является одной из самых распространенных задач при создании сайта. Формы бывают простыми (типа обратной связи) и сложными (например, анкета на получение кредита). Но все формы объединяет то, что их надо сверстать, и желательно как можно проще и быстрее. Учитывая, что большинство форм состоит из одинаковых элементов, можно использовать для этого шаблон, который я привожу в конце статьи. Серверную часть (генерацию и прочее) я рассматривать не буду, статья касается только клиентской части — разметки.
Элементы формы
Большая часть веб-форм состоит из двух видов элементов: подписей и самих элементов управления (виджетов). Элементами управления могут быть текстовые поля, раскрывающиеся списки, флажки и т.д. В большинстве случаев форма представляет собой пары «подпись—элемент». Бывают и более тяжелые случаи, когда вместо одного элемента используется несколько, вида «подпись—элемент1—элемент2—элемент3». Например, выбор даты, состоящий из трех раскрывающихся списков «число, месяц, год». Часто в связках «подпись—элемент» предусматривается место для подсказки, объясняющей назначение поля.
Визуальное представление форм
Подробнее о визуальном представлении форм читайте в книге Люка Роблевски (Luke Wroblewski) «Web Form Design: Filling in the blanks»
Самыми распространенными способами представления веб-форм являются:
- Подписи слева от полей, на одном уровне
- Подписи над полями
У обоих способов есть достоинства и недостатки. Лично я предпочитаю размещать подписи на одном уровне с элементами управления (выравнивая текст подписей вправо) — на мой взгляд, это делает форму более понятной, хотя исследования показывают, что времени на заполнение в этом случае требуется чуть больше, чем в случае расположения подписей над элементами.
Способы разметки формы
Способов разметки веб-форм существует довольно много. Задача, конечно же сверстать форму с наименьшим количеством «лишних» тегов, желательно не нарушая семантики. Из самых распространенных вариантов:
Таблицы
<table>
<tr>
<th><label>Подпись</label></th>
<td>Элемент</td>
</tr>
</table>
Данный способ подходит для расположения подписей на одном уровне с элементами, но затрудняет другие возможности форматирования.
Списки (ul или ol)
<ul>
<li>
<label>Подпись</label>
Элемент
</li>
</ul>
По сути, строки формы являются списком элементов и подписей к ним, так что употребление списков вполне приемлемо. Мне в этом способе не нравится то, что для выравнивания подписей (label
) на одном уровне с элементами управления необходимо назначать свойство display:block
для инлайнового элемента label
. Да и сам элемент управления иногда состоит из нескольких отдельных элементов (например, несколько флажков), в этом случае их приходится оборачивать в дополнительный div
.
Параграфы или дивы
<p>
<label>Подпись</label>
Элемент
</p>
Замечания те же, что и у предыдущего способа.
Списки определений (dl)
<dl>
<dt><label>Подпись</label></dt>
<dd>Элемент</dd>
</dl>
Списки определений (definition list) связывают термин (dt
) и определение (dd
), а в нашем случае — подпись и элемент управления. Мне кажется такой способ разметки достаточно правильным с точки зрения семантики, а кроме того, он удобен в представлении — и dt
и dd
являются блочными элементами, что позволяет легко манипулировать ими, выстраивая горизонтально или вертикально без лишних оберток.
Достаточно прописать к форме стиль:
form dt{
padding: 0;
margin: 0.7em 1em 0.5em 0;
width: 25%;
float: left;
clear: left;
text-align: right;
}
form dd{
margin: 0;
padding: 0.5em 0;
width: 70%;
float: left;
*float: none; /* hack for IE 6-7 - better to keep in separate file */
}
и наша форма выстроится в мой любимый вариант «подписи слева—элементы справа».
В данном случае пришлось использовать небольшой хак для Internet Explorer 6-7, чтобы высота обоих столбцов была синхронной (при длинных подписях). Этого можно избежать, убрав свойство float
у dt
, но возможно есть и другие варианты решения этой проблемы.
Шаблон формы
Ниже представлен небольшой шаблон, который я в последнее время использую для верстки форм. Он включает в себя подписи к полям, опциональные скрытые поля (наподобие, «откуда вы про нас узнали» → другое → появляется доп. текстовое поле) и некоторые другие мелочи.
Примечания к шаблону
- Работа скрываемых полей требует использования jQuery.
- Скрываемые поля работают так: каждое из них обертывается в
<span class="hidden" id="...">
, каждому элементу, отвечающему за показ скрытого поля (флажок или список) назначается классhidden-trigger
, а также прописывается аттрибутrel="#ID#"
(где #ID# равен id скрытого элемента). - Можно нажать кнопку «Отправить», чтобы посмотреть оформление ошибок.
- Ошибки выводятся в специальном блоке с классом
error-block
, каждая из них выводится в виде элемента списка с аттрибутомrel="#ERROR_ID#"
(где #ERROR_ID# равен id элемента с ошибкой) — в этом случае, поля с ошибками автоматически подсвечиваются.
Комментарии
Александр, захожу на страничку с формой последней Оперой. Ничего не заполняя, жму „Отправить заявку“, кнопка блокируется и выводится ошибка. Заполняю все необходимые поля, хочу повторить отправку, а кнопка как была заблокированной, так и осталась. Firefox вообще с 405 ошибкой вываливается.
Gram, спасибо, теперь и в FF работает. Забыл отключить действие самой кнопки.
Блокируется она просто для примера — для наглядности. Код для разблокировки не привожу, с валидацией и прочим уж сами разбирайтесь. =)
Хм, а я думал для этого предназначены элементы legend, label и fieldset…
Для чего этого? fieldset в первую очередь предназначен для группировки сходных полей. Но не будешь же описывать каждое поле в fieldset.
О, спасибо.