HTML - Правильный способ кодирования флажка с меткой

Я использовал formtastic, чтобы генерировать HTML-формы в приложениях rails. Мой вопрос, однако, действительно связан с HTML.

Сегодня я обнаружил странное поведение в том, как formtastic генерирует флажки (поля типа :boolean на formtastic lingo).

Остальные поля (не-флажки) генерируются следующим образом:

<li>
  <label for="my_textbox_field">My TextBox</label>
  <input id="my_textbox_field" type="text" ... >
</li>

Флажки, однако, полностью заключены в теги <label> - вот так:

<li>
  <label for="my_boolean_field">
    <input id="my_boolean_field" type="checkbox" ... >
    This is my boolean field
  </label>
</li>

Форматическая философия, по-видимому, основана на презентации Learning to Love Forms. По сути, на слайде 36 этой презентации эта структура предлагается для флажков. Думаю, в самой презентации ведущий объяснил, почему это было сделано, но оно не написано на слайдах.

Может ли кто-нибудь сказать мне, почему включение меток внутри тега <label> может быть хорошей идеей, в отличие от размещения их снаружи, например с текстовыми полями?

Ответ 1

Общим пользовательским интерфейсом для ввода текста является либо метка слева:

Email address: [____________________]

Или над надписью над входом:

Email address:
[___________________________________]

Однако для флажка общий UI для метки появляется после ввода, например:

[x] Accept terms and conditions

В первых двух случаях он значительно упрощает CSS, который вы должны создать, если метка находится перед входом в разметке. Можно утверждать, что ярлык может обернуться вокруг ввода все же, но важно здесь, что текст идет перед входом.

В третьем примере (флажок) текст появляется после метки, и снова CSS значительно упрощается, помещая метку в нужное место в порядке разметки (после ввода).

Итак, флажки всегда будут отличаться от остальных входов. Что касается обертывания флажка с меткой, это было только личное предпочтение, хотя я бы сказал, что, поскольку входные флажки различны, наличие входных данных внутри метки упрощает настройку этих входов для стилизации с помощью CSS, потому что разметка различна.

Ответ 2

Может ли кто-нибудь сказать мне, почему включение меток внутри тега <label> может быть хорошей идеей

Это может быть хорошей идеей, потому что в этом случае вы можете потерять атрибуты id и for, что упростит разметку. Когда <input> находится внутри <label>, соединение между ними неявно. (См. Раздел 17.9.1 HTML4.)

Однако на практике это не работает в IE, поэтому вы теряете это потенциальное преимущество.

Я могу только предположить в этом случае это для макета/стиля.

Ответ 3

В дополнение к причинам, упомянутым в других ответах, если <label> и <input> являются отдельными, любые пробелы между ними будут неаккумулируемыми. Вероятно, это не то, что вы хотели. Например, новая строка в этом коде приведет к отсутствию кликов:

<input id="my_boolean_field" type="checkbox" ... >    
<label for="my_boolean_field">This is my boolean field</label>

Вставка <input> внутри <label> позволяет избежать этого, поскольку пробел является частью метки.

Пример в реальном времени: http://jsfiddle.net/xKLrS/2/