Есть ли лучшая практика в отношении вложенности label
и input
HTML элементов?
классический способ:
<label for="myinput">My Text</label>
<input type="text" id="myinput" />
или
<label for="myinput">My Text
<input type="text" id="myinput" />
</label>
<input />
внутри<label>
, это то, что вы можете опуститьfor
иid
:<label>My text <input /></label>
в вашем примере. Так намного лучше!input
семантически не принадлежит внутри alabel
, сегодня я заметил, что разработчики Bootstrap не согласны со мной . Некоторые элементы, такие как встроенные флажки, оформлены по-разному в зависимости от того,input
находится ли он внутри или снаружи.<label for="id">
как у меня есть несколько форм на странице, и я не могу использоватьid
атрибут для многих виджетов, не попав вunique id per page
ловушку. Единственный приемлемый способ получить доступ к виджету -form + widget_name
.Ответы:
Начиная с w3: сам ярлык может располагаться до, после или вокруг соответствующего элемента управления.
или
или
Обратите внимание, что третий метод нельзя использовать, когда для макета используется таблица с меткой в одной ячейке и связанным с ней полем формы в другой ячейке.
Любой из них действителен. Мне нравится использовать первый или второй пример, так как он дает больше контроля над стилем.
источник
<label for="inputbox"><input id="inputbox" type="text" /></label>
это пропуск по их критериям?return false;
в конце обработчика, но если у вас, возможно, есть другие обработчики, которые необходимо выполнить впоследствии, и остановка распространения не является опцией, это становится проблемой.я предпочитаю
над
Главным образом потому, что это делает HTML более читабельным. И я на самом деле думаю, что мой первый пример легче стилизовать с помощью CSS, так как CSS очень хорошо работает с вложенными элементами.
Но это вопрос вкуса, я полагаю.
Если вам нужны дополнительные параметры стиля, добавьте тег span.
Код все еще выглядит лучше, на мой взгляд.
источник
<label>Expires after <input name="exp" /> days</label>
(метка находится до и после элемента ввода)div
,li
или нет, не так ли?firstname
должен следовать за меткойfirstname
, но браузерам нужно объявление. Это все дело вкуса и того, что вы думаете, выглядит лучше (и легче всего отлаживается) в вашем коде. Я предпочитаю использовать nested сейчас, хотя мне потребовалось некоторое время, чтобы привыкнуть к нему.Если вы включите тег ввода в тег label, вам не нужно использовать атрибут «for».
Тем не менее, я не люблю включать тег ввода в свои метки, потому что я думаю, что они являются отдельными, не содержащими сущности.
источник
Разница в поведении: щелчок в пространстве между меткой и вводом
Если щелкнуть пробел между меткой и входом, он активирует вход, только если метка содержит вход.
Это имеет смысл, поскольку в этом случае пробел является просто еще одним символом метки.
Возможность щелкать между ярлыком и полем означает, что это:
Чекбокс Bootstrap v3.3 примеры используют входные данные внутри: http://getbootstrap.com/css/#forms Может быть, стоит следовать им. Но они изменили свое мнение в v4.0 https://getbootstrap.com/docs/4.0/components/forms/#checkboxes-and-radios, поэтому я не знаю, что мудрее больше:
Вопрос UX, в котором подробно обсуждается этот момент: /ux/23552/should-the-space-between-the-checkbox-and-label-be-clickable
источник
margin
из флажка. Поведение Firefox на вашем примере является своеобразным и кажется ошибкой. Alabel
будет содержать пробелы или отступы вокруг встроенного содержимого как кликабельные. Но, учитывая, что модель содержимого метки является встроенным / фразовым содержимым, поле ввода не должно быть кликабельным, если только ваша метка не создана, иdisplay: block
в этом случае внутренняя часть меткиblock
становится кликабельной во всех браузерах.Лично мне нравится держать ярлык снаружи, как во втором примере. Вот почему есть атрибут FOR. Причина в том, что я часто применяю стили к метке, например ширину, чтобы форма выглядела хорошо (сокращение ниже):
Делает так, чтобы я мог избежать таблиц и всего такого барахла в моих формах.
источник
<br />
для разделения входов?<label> <span>My text</span> <input /> </label>
вас есть все варианты стилей, которые вам (когда-либо) понадобятся.См. Http://www.w3.org/TR/html401/interact/forms.html#h-17.9 для рекомендаций W3.
Они говорят, что это может быть сделано в любом случае. Они описывают два метода как явный (используя «for» с идентификатором элемента) и неявный (встраивание элемента в метку):
Явный:
Неявные:
источник
Оба являются правильными, но размещение ввода внутри метки делает его гораздо менее гибким при стилизации с помощью CSS.
Во- первых, ограничено , в котором элементы он может содержать . Например, вы можете поместить только между и надписью текст, если не находится внутри .
<label>
<div>
<input>
<input>
<label>
Во-вторых, хотя существуют обходные пути для упрощения стиля, например, обтекание текста внутренней метки диапазоном, некоторые стили будут наследоваться от родительских элементов, что может усложнить стилизацию.
источник
Заметное значение 'gotcha' требует, чтобы вы никогда не включали более одного элемента ввода в элемент <label> с явным атрибутом "for", например:
Хотя это может показаться заманчивым для элементов формы, в которых пользовательское текстовое значение является вторичным по отношению к переключателю или флажку, функциональность click-focus элемента label немедленно переместит фокус на элемент, идентификатор которого явно определен в его атрибуте 'for' , что делает практически невозможным для пользователя щелкнуть в текстовом поле, чтобы ввести значение.
Лично я стараюсь избегать элементов меток с входными дочерними элементами. Семантически неуместно, когда элемент label охватывает больше, чем сам ярлык. Если вы вкладываете входные данные в метки для достижения определенной эстетики, вам следует вместо этого использовать CSS.
источник
for
... и если вы хотите его использоватьfor
, то наличие элемента управления внутри метки не имеет особого смысла. ,Как говорили большинство людей, оба способа действительно работают, но я думаю, что только первый должен. Будучи семантически строгим, метка не «содержит» входные данные. На мой взгляд, отношение содержания (родитель / ребенок) в структуре разметки должно отражать содержание в визуальном выводе . т.е. элемент, окружающий другой элемент в разметке, должен быть нарисован вокруг этого элемента в браузере . В соответствии с этим, метка должна быть родственной, а не родительской. Так что вариант номер два произвольный и запутанный. Все, кто читал Zen of Python , вероятно, согласятся (Flat лучше, чем вложенный, Sparse лучше, чем плотный, должен быть один - и желательно только один - очевидный способ сделать это ...).
Из-за решений, подобных этому от W3C и основных поставщиков браузеров (позволяющих «в зависимости от того, как вы предпочитаете это делать», а не «делайте это правильно»), Интернет сегодня настолько запутан, и нам, разработчикам, приходится иметь дело с запутанными и так разнообразный унаследованный код.
источник
Я обычно иду с первыми двумя вариантами. Я видел сценарий, когда использовался третий вариант, когда выбор радио включался в метки и CSS содержал что-то вроде
чтобы обеспечить правильное вертикальное выравнивание для радиостанций.
источник
Обращаясь к WHATWG ( Написание пользовательского интерфейса формы ), можно ошибочно поместить поле ввода внутри метки. Это сохраняет ваш код, потому что
for
атрибут изlabel
больше не нужен.источник
Я предпочитаю оборачивать элементы внутри себя,
<label>
потому что мне не нужно генерировать идентификаторы.Я разработчик Javascript, и React или Angular используются для генерации компонентов, которые могут быть использованы мной или другими пользователями. Тогда будет легко дублировать идентификатор на странице, что приведет к странному поведению.
источник
Одна вещь, которую вы должны рассмотреть, это взаимодействие флажка и радиовходов с javascript.
Используя структуру ниже:
Когда пользователь нажимает на «Текст метки», функция controlCheckbox () запускается один раз.
Но при нажатии входного тега функция controlCheckbox () может запускаться дважды в некоторых старых браузерах. Это связано с тем, что теги input и label запускают событие onclick, прикрепленное к флажку.
Тогда у вас могут быть некоторые ошибки в вашем checkboxState.
Я столкнулся с этой проблемой в последнее время на IE11. Я не уверен, что современные браузеры имеют проблемы с этой структурой.
источник
Основным преимуществом размещения
input
внутриlabel
является эффективность печати для людей и хранение байтов для компьютеров.@Znarkus сказал в своем комментарии к OP,
Примечание: в коде @Znarknus была включена другая эффективность, не указанная явно в комментарии.
type="text"
также может быть опущен иinput
будет отображать текстовое поле по умолчанию.Совместное сравнение нажатий клавиш и байтов [1].
31 нажатие клавиши, 31 байт
58 нажатий клавиш, 58 байт
В противном случае фрагменты визуально равны, и они предлагают тот же уровень доступности для пользователя. Пользователь может щелкнуть или коснуться метки, чтобы поместить курсор в текстовое поле.
[1] Текстовые файлы (.txt), созданные в блокноте в Windows, в байтах из свойств проводника Windows
источник