Должен ли я поместить элементы ввода внутри элемента метки?

479

Мне просто интересно, есть ли лучшая практика в отношении метки и тега ввода:

классический способ:

<label for="myinput">My Text</label>
<input type="text" id="myinput" />

или

<label for="myinput">My Text
   <input type="text" id="myinput" />
</label>
  • 84
    Один из самых больших плюсов сдачи <input /> внутри <label> , является то , что вы можете опустить for и id : <label>My text <input /></label> в вашем примере. Так намного лучше!
  • 11
    Хотя я согласен с тем, что input семантически не принадлежат label , сегодня я заметил, что разработчики Bootstrap не согласны со мной . Некоторые элементы, такие как встроенные флажки, оформляются по-разному в зависимости от того, находится ли input внутри или снаружи.
Показать ещё 9 комментариев
Теги:
semantics

12 ответов

418
Лучший ответ

Из 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>

Обратите внимание, что третий метод не может использоваться, когда таблица используется для макета, с меткой в ​​одной ячейке и связанным с ней поле формы в другой ячейке.

Любой из них действителен. Мне нравится использовать первый или второй пример, так как он дает вам больше контроля стилей.

  • 12
    Как ответили, все они действительны, но в моей собственной практике я обычно выбираю первый пример, приведенный здесь superUntitled для текстовых полей, текстовых полей и селектов. Но для переключателей и флажков я обычно использую третий пример, где я хочу ввод перед сопроводительным текстом и не хочу того же типа фиксированной ширины и / или плавающего, который используют остальные метки и поля. Таким образом, в любой отдельной форме вы можете найти меня, использующего оба этих формата вместе.
  • 6
    Интересно, является ли <label for="inputbox"><input id="inputbox" type="text" /></label> проходом в соответствии с их критериями.
Показать ещё 21 комментарий
51

Я предпочитаю

<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>

Код по-прежнему выглядит лучше, на мой взгляд.

  • 3
    Включение ввода внутри метки аналогично использованию HTML для разметки.
  • 7
    Мне нравится это решение также для таких случаев: <label>Expires after <input name="exp" /> days</label> (label - до и после элемента input)
Показать ещё 8 комментариев
34

Если вы включаете тег ввода в тег метки, вам не нужно использовать атрибут "для".

Тем не менее, я не люблю включать тег ввода в свои ярлыки, потому что я думаю, что они являются отдельными, не содержащими сущностей.

  • 7
    Для for требуется использовать идентификатор, что делает иерархическое структурирование структуры очень сложным :-(
29

Разница в поведении: щелчок в пространстве между меткой и вводом

Если вы нажмете пробел между меткой и вводом, она активирует вход, только если метка содержит вход.

Это имеет смысл, поскольку в этом случае пространство является просто еще одним символом метки.

<p>Inside:</p>

<label>
  <input type="checkbox" />
  |&lt;----- Label. Click between me and the checkbox.
</label>

<p>Outside:</p>

<input type="checkbox" id="check" />
<label for="check">|&lt;----- 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> и <label> являются элементами-братьями, а не <input> внутри <label>. Это немного более подробно, так как вы должны указывать id и атрибуты для связи <input> и <label>.

Вопрос UX, который подробно обсуждает этот вопрос: https://ux.stackexchange.com/questions/23552/should-the-space-between-the-checkbox-and-label-be-clickable

  • 0
    Это не специфика разницы. Переключатель работает в обоих случаях во всех совместимых браузерах.
  • 0
    @hexalys Спасибо за отчет. Я обновил ответ. Вы имеете в виду, что совместимые браузеры должны переключаться или нет в обоих случаях? Если бы вы могли дать ссылку на соответствующий стандартный отрывок, это было бы замечательно.
Показать ещё 6 комментариев
15

Лично мне нравится держать ярлык снаружи, как в вашем втором примере. Вот почему атрибут 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" />

Делает это, поэтому я могу избежать таблиц и всего этого мусора в моих формах.

  • 3
    Не следует ли оставить презентацию в CSS вместо использования <br /> для разделения входов?
  • 1
    @Znarkus - да, обычно я оборачиваю их в OL / LI, чтобы иметь дело с таким форматированием, это был просто краткий пример.
Показать ещё 5 комментариев
14

См. http://www.w3.org/TR/html401/interact/forms.html#h-17.9 для рекомендаций W3.

Они говорят, что это можно сделать в любом случае. Они описывают два метода как явные (используя "для" с идентификатором элемента) и неявные (вложение элемента в метку):

Явно:

Атрибут for ассоциирует метку с другим элементом управления явно: значение атрибута for должно быть таким же, как и значение атрибута id связанного элемента управления.

Неявный:

Чтобы связать метку с другим элементом управления неявно, элемент управления должен находиться внутри содержимого элемента LABEL. В этом случае LABEL может содержать только один элемент управления.

  • 0
    Я только что обнаружил, что неявное не работает в IE ... какие-нибудь идеи?
9

Оба правильные, но ввод ввода внутри метки делает его менее гибким при стилизации с помощью CSS.

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

Во-вторых, в то время как есть обходные пути, чтобы упростить стиль, например, обертывание внутреннего текста метки ярлыком, некоторые стили будут унаследованы от родительских элементов, что усложнит стиль.

  • 0
    гораздо менее гибким? можешь уточнить? как уже упоминали другие, вы можете просто обернуть текст внутренней метки в интервал, если это не делает его намного менее гибким?
  • 0
    @MPavlak: обновлен в соответствии с вашим комментарием
6

Заметный "gotcha" диктует, что вы никогда не должны включать более одного входного элемента внутри <label> элемент с явным атрибутом "для", например:

<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>

Хотя это может вызвать соблазн для функций формы, в которых пользовательское текстовое значение является вторичным по отношению к переключателю или флажку, функциональность click-focus элемента метки сразу же бросает фокус на элемент, чей идентификатор явно определен в его " для ', что делает невозможным для пользователя щелкнуть в текстовое поле, чтобы ввести значение.

Лично я стараюсь избегать элементов ярлыков с входными дочерними элементами. Кажется, семантически не подходит для элемента ярлыка, охватывающего больше, чем сама метка. Если вы вставляете входы в ярлыки, чтобы достичь определенной эстетики, вы должны использовать CSS вместо этого.

  • 4
    Это не "гоча". Это явно часть спецификации; этикетка может содержать до 1 элемента управления. Здесь вы также смешиваете неявные и явные стили - если вы поместите элемент управления в метку, вам не нужно for ... и если вы хотите использовать for , то наличие элемента управления внутри метки не создаст много смысла.
  • 0
    Правда, но, похоже, эта спецификация не совсем понятна. Мы столкнулись с этой проблемой с API форм Drupal 6, который генерировал разметку, которая создавала сценарий, не похожий на описанный выше. Это заставило моего коллегу и меня почесать голову в течение минуты или двух, поэтому я решил сообщить об этом здесь, чтобы избежать потенциальной путаницы в будущем.
Показать ещё 2 комментария
4

Обычно я использую первые два варианта. Я видел сценарий, когда был использован третий параметр, когда выбор радио, где встроены метки и css, содержал что-то вроде

label input {
    vertical-align: bottom;
}

чтобы обеспечить правильное выравнивание по вертикали для радиостанций.

2

Как сказал большинство людей, оба пути действительно работают, но я думаю, что только первый должен. Будучи семантически строгим, метка не "содержит" вход. На мой взгляд, отношение сдерживания (родительское/дочернее) в структуре разметки должно отражать сдерживание в визуальном выходе. то есть элемент, окружающий другой в разметке, должен быть нанесен вокруг этого в браузере. В соответствии с этим ярлык должен быть входным братом, а не родителем. Поэтому вариант номер два является произвольным и запутанным. Все, кто прочитал Zen of Python, вероятно, согласятся (Flat лучше, чем вложенный, Sparse лучше, чем плотный, должен быть один - и предпочтительно только один - простой способ сделать это...).

Из-за таких решений, как от W3C и крупных поставщиков браузеров (позволяя "в зависимости от того, как вы это предпочитаете", вместо "сделать это правильно" ) заключается в том, что Интернет настолько запутан сегодня, и мы, разработчики, должны иметь дело с запутанным и таким разнообразным устаревшим кодом.

1

Мне очень нравится обертывать элементы внутри моего <label>, потому что мне не нужно создавать идентификаторы.

Я разработчик Javascript, и React или Angular используются для создания компонентов, которые могут быть повторно использованы мной или другими. Тогда было бы легко дублировать id на странице, что привело бы к странным поведением.

1

Ссылаясь на WHATWG (Написание пользовательского интерфейса формы), не стоит вводить поле ввода внутри наклейка. Это экономит ваш код, потому что атрибут for из label больше не нужен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню