Можно ли использовать метки внутри меток в форме?

Я создаю форму, которая использует метки для определения входных значений (как это делают многие).

Образец этой формы можно увидеть здесь.

Моя проблема, однако, заключается в использовании таких вещей, как флажки и переключатели. Хотя я хочу определить группу параметров ввода (скажем, что-то вроде «Пол»), используя, чтобы затем окружить мои фактические входные данные «мужским» и «женским», кажется, что это вызывает конфликты, особенно в отношении стиля, учитывая, что он принимает исходные атрибуты CSS .

Каков наилучший/правильный способ использования меток внутри меток, где первая метка будет определять общую область, а последующие метки используются только для определения конкретного ввода?

РЕДАКТИРОВАТЬ

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


person JM4    schedule 22.03.2012    source источник
comment
Я думаю, что вы ищете набор полей w3schools.com/html/tryit. asp?filename=tryhtml_legend   -  person Turnip    schedule 22.03.2012
comment
@ 3rror404 - спасибо, но это только подчеркивает общую форму. Хотя я полагаю, что мог бы использовать теги fieldset и legend, у него нет некоторых дополнительных преимуществ тега ‹label›, особенно с проверкой jquery.   -  person JM4    schedule 22.03.2012


Ответы (4)


Я думаю, вам следует использовать вместо этого теги fieldset и legend, например.

<fieldset>
   <legend>Gender</legend>

   <label for="male"><input type="radio" ... />male</label>
   <label for="female"><input type="radio" ... />female</label>
</fieldset>

fieldset — это логический контейнер для группировки связанных входных данных, а legend представляет вводную подпись для самого набора полей. Ваша скрипка обновлена: http://jsfiddle.net/zrqnT/4/

см. также:
http://dev.w3.org/html5/spec/single-page.html#the-fieldset-element
http://dev.w3.org/html5/spec/single-page.html#элемент-легенды

person Fabrizio Calderan    schedule 22.03.2012
comment
Это не работает с imo. Не только для одной группы переключателей. - person jsheffers; 22.03.2012
comment
Также для пары связанных входных данных fieldset будет более подходящим, чем общий контейнер div. Я предпочитаю избегать разделения, когда это возможно. И легенда - правильный тег, чтобы представить их - person Fabrizio Calderan; 22.03.2012
comment
Затем вам нужно изменить стиль элемента fieldset, чтобы он соответствовал тому, что он имеет в JSFiddle. - person jsheffers; 22.03.2012
comment
@FabrizioCalderan - хотя я думаю, что Fieldset и Legend являются допустимыми способами решения, возможно, этой конкретной формы, у меня на сайте есть другие формы, которые будут использовать эту же таблицу стилей css. На других страницах у меня уже есть формы в наборе полей. Хотя я полагаю, что мог бы просто создать отдельные классы наборов полей и легенд для разных типов, это может вызвать тот же конфликт, с которым я уже сталкивался (метка внутри метки -> набор полей внутри набора полей) - person JM4; 22.03.2012
comment
ну, конечно, этот ответ предназначен для применения к конкретному коду, который вы опубликовали, но учтите, что я не изменил стиль набора полей (см. Мое обновление с вашей скрипкой). Я просто применил к нему классы, которые вы уже указали. Единственное изменение стиля относится к элементу легенды. И имхо, я думаю, что это лучше, чем неправильное использование других тегов. - person Fabrizio Calderan; 22.03.2012
comment
@FabrizioCalderan - вы бы порекомендовали тогда использовать наборы полей и полностью заменить теги DIV и ‹label›? - person JM4; 22.03.2012

Вот спецификация:

http://www.w3.org/TR/html5/forms.html#the-label-element

Там сказано:

Атрибут for может быть указан для указания элемента управления формы, с которым должен быть связан заголовок. Если атрибут указан, значение атрибута должно быть идентификатором маркируемого элемента, связанного с формой, в том же документе, что и элемент метки. Если атрибут указан и в документе есть элемент, идентификатор которого равен > значению атрибута for, и первый такой элемент является маркируемым элементом >, связанным с формой, то этот элемент является помеченным элементом управления элемента метки.

Если атрибут for не указан, но элемент метки имеет маркируемый потомок элемента, связанного с формой, то первый такой потомок в порядке дерева является маркированным элементом управления элемента метки.

Итак, вы должны предоставить атрибут for. Но это может быть только в том случае, если у вас есть элемент управления формой с тем же идентификатором. Здесь это не так.
В противном случае вы можете окружить свой код меткой, но тогда ваши элементы должны быть маркируемыми.

Маркируемые элементы:

Labelable elements
Обозначает элементы, которые могут быть связаны с элементами label.

кнопка ввода (если атрибут type не в скрытом состоянии) кейген метр вывод прогресса select textarea

Таким образом, у ярлыка нет шансов иметь такое конкретное поведение в вашем случае.

Вместо этого используйте набор полей и легенду

<fieldset>
    <legend>Gender: <em>*</em></legend>
    <label for="male"><input type="radio" name="gender" id="male" value="m" class="required" role="input" aria-required="true" />male</label>
    <label for="female"><input type="radio" name="gender" id="female" value="f" class="required" role="input" aria-required="true" />female</label>
</fieldset>
person yunzen    schedule 22.03.2012

Просто используйте этот CSS

#formWrapper label[for=male], #formWrapper label[for=female] { color: red; } 

Это позволит вам изменить только эти метки с помощью прямого CSS. Другой вариант — просто использовать содержащие div.

<div class="form-item">
    <label>Gender</label>
    <div class="radios">
         <label for="male">Male</label><input type="radio" for="male"/>
         <label for="female">Female</label><input type="radio" for="female"/>
    </div>
</div>
person jsheffers    schedule 22.03.2012
comment
спасибо за идею, но лучше не использовать в этом случае конкретный css, тем более, что в этой форме 8 страниц, а на некоторых страницах более 30 переключателей. - person JM4; 22.03.2012

То, что сказал Фабрицио, может сработать, но лично я бы просто использовал заголовок. Вам не обязательно использовать элементы формы для форм. Кроме того, использование обычного элемента заголовка даст вам гораздо большую гибкость в отношении стиля.

<div class="stage clear">
    <h3>Gender: <em>*</em></h3>
    <label for="male"><input type="radio" name="gender" id="male" value="m" class="required" role="input" aria-required="true" />male</label>
     <label for="female"><input type="radio" name="gender" id="female" value="f" class="required" role="input" aria-required="true" />female</label>
</div>
person Scott Stubblefield    schedule 22.03.2012
comment
Я также не стал бы помещать ввод внутрь метки, но это только я. :) - person Scott Stubblefield; 22.03.2012
comment
почему бы и нет? Если пользователь щелкает текст, когда ввод включен, он выбирает элемент, в противном случае он должен щелкнуть кнопку напрямую. На мой взгляд, это действительно единственная причина использовать ярлык. - person JM4; 22.03.2012
comment
Обычно использование атрибута имени в обоих случаях помогает... хотя переключатели могут быть разными. Я не могу вспомнить навскидку на самом деле. - person Scott Stubblefield; 22.03.2012
comment
@ScottStubblefield Это не атрибут name, к которому обращается атрибут labels for, а атрибут control id. Чтобы избежать использования уникальных дескрипторов для ваших ярлыков, просто окружите элемент управления формой тегом label. вуаля. См. спецификацию: w3.org/TR/html5/forms. html#элемент-метки - person yunzen; 22.03.2012