Възможно ли е да се използват етикети в рамките на етикети във формуляр?

Създавам формуляр, който използва етикети, за да дефинира входните стойности (както много правят).

Образец на този формуляр може да се види тук.

Проблемът ми обаче е в използването на неща като квадратчета за отметка и радио бутони. Въпреки че искам да дефинирам група от опции за въвеждане (да кажем нещо като Gender), използвайки, за да оградя действителните си входове с „мъжки“ и „женски“, изглежда, че причинява конфликти, по-специално по отношение на стила, като се има предвид, че приема оригиналните 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 validate.   -  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#the-legend-element

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 stylesheet. На други страници вече имам формуляри в набор от полета. Въпреки че предполагам, че мога просто да създам отделни класове fieldset и legend за различните типове, това може да причини същия конфликт, пред който вече съм изправен (етикет в етикет -› fieldset в fieldset) - person JM4; 22.03.2012
comment
добре, разбира се, този отговор е предназначен да бъде приложен към конкретния код, който сте публикували, но имайте предвид, че не съм променил стила на fieldset (вижте моята актуализация с вашата цигулка). Току-що приложих към него класовете, които вече сте посочили. Единствената промяна в стила е за елемента на легендата. И imho, мисля, че е по-добре, отколкото да използвате неправилно други тагове. - 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 може да бъде указан, за да посочи контрола на формуляра, с която надписът трябва да бъде свързан. Ако атрибутът е посочен, стойността на атрибута трябва да бъде ID на етикетируем елемент, свързан с формуляр в същия документ като елемента етикет. Ако атрибутът е посочен и има елемент в документа, чийто идентификатор е равен на > стойността на атрибута for, и първият такъв елемент е етикетируем > елемент, свързан с формуляр, тогава този елемент е етикетираната контрола на етикетния елемент.

Ако атрибутът for не е посочен, но етикетният елемент има етикетируем наследник, свързан с форма, тогава първият такъв наследник в дървовидния ред е етикетираната контрола на етикетния елемент.

Така че трябва да предоставите атрибут for. Но това може да е така, ако имате контрола на формуляр със същия идентификатор. Тук не е така.
В противен случай можете да оградите кода си с етикет, но тогава вашите елементи трябва да могат да се етикетират.

Етикетируемите елементи са:

Елементи, подлежащи на етикетиране
Означава елементи, които могат да бъдат свързани с елементи на етикети.

бутон за въвеждане (ако атрибутът type не е в скрито състояние) keygen meter изход напредък изберете текстово поле

Така че няма шанс етикетът да има това специфично поведение във вашия случай

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

<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
Обикновено използването на атрибута name и на двете върши работа... въпреки че радио бутоните може да са различни. Всъщност не мога да си спомня на ум. - person Scott Stubblefield; 22.03.2012
comment
@ScottStubblefield Това не е атрибутът name, който се адресира от атрибута labels for, а атрибутът controls id. За да избегнете наличието на уникални дескриптори за вашите етикети, просто оградете контролата на формуляра с етикета етикет. готово. Вижте спецификацията: w3.org/TR/html5/forms. html#the-label-element - person yunzen; 22.03.2012