Должен ли я помещать входные теги внутри тега label?
мне просто интересно, есть ли лучшая практика в отношении метки и входного тега:
классический способ:
<label for="myinput">My Text</label>
<input type="text" id="myinput" />
или
<label for="myinput">My Text
<input type="text" id="myinput" />
</label>
12 ответов
из w3: сама метка может располагаться до, после или вокруг связанного элемента управления.
<label for="lastname">Last Name</label>
<input type="text" id="lastname" />
или
<input type="text" id="lastname" />
<label for="lastname">Last Name</label>
или
<label>
<input type="text" name="lastname" />
Last Name
</label>
обратите внимание, что третий метод нельзя использовать, когда таблица используется для компоновки, с меткой в одной ячейке и связанным с ней полем формы в другой ячейке.
один действует. Мне нравится использовать либо первый, либо второй пример, так как он дает вам больше контроля стиля.
предпочитаю
<label>
Firstname
<input name="firstname" />
</label>
<label>
Lastname
<input name="lastname" />
</label>
над
<label for="firstname">Firstname</label>
<input name="firstname" id="firstname" />
<label for="lastname">Lastname</label>
<input name="lastname" id="lastname" />
главным образом потому, что это делает HTML более читаемым. И я действительно думаю, что мой первый пример легче стилизовать с помощью CSS, так как CSS очень хорошо работает с вложенными элементами.
но это вопрос вкуса, я полагаю.
Если вам нужны дополнительные параметры стиля, добавьте тег span.
<label>
<span>Firstname</span>
<input name="firstname" />
</label>
<label>
<span>Lastname</span>
<input name="lastname" />
</label>
код по-прежнему выглядит лучше на мой взгляд.
Если вы включаете входной тег в тег label, вам не нужно использовать атрибут "for".
тем не менее, мне не нравится включать тег ввода в мои метки, потому что я думаю, что они являются отдельными, не содержащими, сущностями.
разница в поведении: щелчок в пространстве между меткой и входом
если вы нажмете на пробел между метка и вход активирует вход только в том случае, если метка содержит вход.
это имеет смысл, так как в этом случае пространство является просто еще одним символом метки.
<p>Inside:</p>
<label>
<input type="checkbox" />
|<----- Label. Click between me and the checkbox.
</label>
<p>Outside:</p>
<input type="checkbox" id="check" />
<label for="check">|<----- Label. Click between me and the checkbox.</label>
возможность щелкнуть между меткой и коробкой означает, что это есть:
- проще нажать
- менее ясно, где все начинается и заканчивается
Bootstrap флажок v3.3 примеры использования ввода внутри:http://getbootstrap.com/css/#forms было бы мудро последовать за ними. Но в v4 они передумали.0 https://getbootstrap.com/docs/4.0/components/forms/#checkboxes-and-radios поэтому я больше не знаю, что мудро:
флажки и использование радио построен для поддержки проверки формы на основе HTML и предоставления кратких, доступных меток. Как таковой, наш
<input>
s и<label>
s являются одноуровневыми элементами, в отличие от<input>
внутри<label>
. Это немного более подробно, так как вы должны указать id и атрибуты для связи<input>
и<label>
.
UX вопрос, который подробно обсуждает этот момент: https://ux.stackexchange.com/questions/23552/should-the-space-between-the-checkbox-and-label-be-clickable
лично мне нравится держать ярлык снаружи, как в вашем втором примере. Вот почему атрибут FOR существует. Причина в том, что я часто применяю стили к метке, например ширину, чтобы форма выглядела красиво (стенография ниже):
<style>
label {
width: 120px;
margin-right: 10px;
}
</style>
<label for="myinput">My Text</label>
<input type="text" id="myinput" /><br />
<label for="myinput2">My Text2</label>
<input type="text" id="myinput2" />
делает так, что я могу избежать таблиц и всего этого мусора в моих формах.
см.http://www.w3.org/TR/html401/interact/forms.html#h-17.9 для рекомендаций W3.
Они говорят, что это можно сделать в любом случае. Они описывают два метода как явные (используя " for " с идентификатором элемента) и неявные (встраивание элемента в метку):
определил:
атрибут for явно связывает метку с другим элементом управления: значение атрибута for должно совпадать со значением идентификатора атрибут связанного элемента управления.
неявное:
чтобы связать метку с другим элементом управления неявно, элемент управления должен находиться в содержимом элемента метки. В этом случае метка может содержать только один элемент управления.
оба правильны, но ввод ввода внутри метки делает его гораздо менее гибким при стилизации с помощью CSS.
во-первых,a <label>
ограничено, в каких элементах он может содержать. Например, вы можете поставить только <div>
между <input>
и текст метки, если <input>
не находится внутри <label>
.
во-вторых, пока обходные пути для того чтобы сделать вводить в моду более легким как оборачивать внутренний текст ярлыка с пядью, некоторые стили будут внутри наследуется от родительских элементов,что может усложнить стиль.
заметный "gotcha" диктует, что вы никогда не должны включать более одного входного элемента внутри элемента
<label for="child-input-1">
<input type="radio" id="child-input-1"/>
<span> Associate the following text with the selected radio button: </span>
<input type="text" id="child-input-2"/>
</label>
хотя это может быть заманчиво для функций формы, в которых пользовательское текстовое значение является вторичным по отношению к переключателю или флажку, функциональность фокусировки щелчка элемента label немедленно бросит фокус на элемент, идентификатор которого явно определен в его атрибуте "for", что делает его почти невозможным для пользователя чтобы щелкнуть в текстовом поле contained, введите значение.
лично я стараюсь избегать элементов метки с входными дочерними элементами. Кажется семантически неправильным, чтобы элемент label охватывал больше, чем сама метка. Если вы вкладываете входные данные в метки для достижения определенной эстетики, вы должны использовать CSS вместо этого.
обычно я использую первые два варианта. Я видел сценарий, когда использовался третий вариант, когда выбор радио, где встроенные метки и css содержали что-то вроде
label input {
vertical-align: bottom;
}
обеспечить правильное вертикальное выравнивание для радио.
как большинство людей сказали, оба способа действительно работают,но я думаю, что только первый должен. Будучи семантически строгим, метка не" содержит " входные данные. На мой взгляд, сдерживание (родитель/ребенок) отношения в структуре разметки должны отражать удержания в визуальном выходе. то есть, элемент, окружающий другой в разметке должно быть нарисовано вокруг этого в браузере. Согласно этому, ярлык должен быть входной сигнал-брат, а не родитель. Так что второй вариант произволен и запутан. Все, кто прочитал Дзен питона вероятно, согласится (плоский лучше, чем вложенный, разреженный лучше, чем плотный, должен быть один-и предпочтительно только один-очевидный способ сделать это...).
из-за таких решений от W3C и основных поставщиков браузеров (что позволяет "каким бы способом вы ни предпочитали это делать", а не "делать это правильно") заключается в том, что интернет настолько запутан сегодня и нам, разработчикам, приходится иметь дело с запутанным и таким разнообразным наследием кода.
со ссылкой на WHATWG как средство (написание пользовательского интерфейса формы) нет ничего плохого в том, чтобы поместить поле ввода внутри метки. Это экономит код, потому что с label
больше не нужен.
Я очень предпочитаю, чтобы обернуть элементы внутри <label>
потому что мне не нужно генерировать идентификаторы.
Я разработчик Javascript, и React или Angular используются для создания компонентов, которые могут быть повторно использованы мной или другими. Это было бы тогда легко дублировать id на странице, ведущей к странному поведению.