2010-04-27 2 views
11

Я использовал formtastic, чтобы генерировать HTML-формы на приложениях rails. Однако мой вопрос действительно связан с HTML.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> 

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

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

ответ

11

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

Email address: [____________________] 

или этикетки над входом:

Email address: 
[___________________________________] 

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

[x] Accept terms and conditions 

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

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

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

+0

Эй, я получил ответ от formtastic парень! Теперь это имеет больше смысла, спасибо. Просто интересно, существует ли формальная возможность контролировать это поведение (т. Е. Вводить ввод после метки, а не только внутри)? – kikito

+3

Нет. Ирония заключается в том, что за последние 24 часа меня попросили выполнить этот же запрос (предпочтительнее переместить флажок из метки), а также для всех входов, которые должны быть перемещены внутри меток. В принципе, это всего лишь стиль кода и личные предпочтения, и я действительно не хочу добавлять такую ​​сложность в код в это время. Долгосрочный план (надеюсь) заключается в том, что вы сможете настроить разметку для всего через механизм рендеринга или частичные или что-то еще. –

+0

Хорошо! Еще раз спасибо за ответ. Я буду следить за вашим удивительным проектом (который я использую в производстве уже - очень круто!) – kikito

7

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

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

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

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

+0

Благодарим за ответ. Ответ Джастина был немного лучше. Но +1 в любом случае. – kikito

+0

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

+0

Он работает в IE. 7+ на самом деле. Он не работает с отображаемыми макетами. –

4

В дополнение к причинам, упомянутым в других ответах, если <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/