#html #label
#HTML #метка
Вопрос:
Недавно я проделал довольно большую работу с элементами формы, в частности, пытаясь наилучшим образом применить больше семантической разметки к моему макету формы, чтобы я мог предоставлять легко стилизуемые формы с небольшим количеством или вообще без посторонней разметки, такой как divs, spans и т.д., Которые придают форме немного дополнительного смысла в семантическом смысле.
После использования label в качестве элемента размещения как для ввода, так и для заголовка элемента, я заметил, что, похоже, существует некоторая двусмысленность (по крайней мере, на мой взгляд — пожалуйста, не стесняйтесь прояснить этот момент, если это возможно) относительно его использования с точки зрения обычных входных данных и массивов радио / проверки.
Если я могу объяснить на кратком примере…
<label>Amount<input type='text' name='amount' value='1' /></label>
Приведенный выше код достаточно справедлив. Тег label инкапсулирует как элемент формы, так и текст метки ‘Amount’, придающий значение заголовку в контексте того, что он является меткой для ввода. Это кажется прекрасным… да?
но рассмотрим следующие радиоприемники…
SET A:
<label>Colour
<span><input type='radio' name='colour' value='red' />Red</span>
<span><input type='radio' name='colour' value='white' />Blue</span>
<span><input type='radio' name='colour' value='blue' />White</span>
</label>
SET B:
<span>Colour
<label><input type='radio' name='colour' value='red' />Red</label>
<label><input type='radio' name='colour' value='white' />Blue</label>
<label><input type='radio' name='colour' value='blue' />White</label>
</span>
Пожалуйста, обратите внимание, что использование <span>
в качестве элемента инкапсуляции в обоих случаях является чисто случайным и реально может быть любым элементом.
Я склонен ошибаться в выборе SET A сам, поскольку я бы подумал, что весь массив / набор радио / флажков в целом будет частью разметки, для которой потребуется тег label в контекстном смысле, но есть ли у кого-нибудь какие-либо мысли, которые они могут добавить в микс с этим?
После просмотра спецификации микроформата (незавершенной, как и в остальной части Интернета) Я рассматриваю возможность использования сопряжения p-v для предоставления информации о цвете (или любом другом наборе / массиве). С этой целью моего первоначального набора структуры должно быть достаточно для предоставления как отображаемых, так и распределенных представлений страницы со всей необходимой иерархической информацией, я бы хотел правильно классифицировать эти фрагменты информации, я думаю.
Возможно, в данный момент я собираюсь пойти по этому пути. (Пожалуйста, укажите на любую вопиющую глупость, пожалуйста)
SET A [revised]:
<somecontainerparentelement class="hproduct">
<label "p-v"><em class="property">Colour</em>
<span><input type='radio' name='colour' value='red' /><em class="value">Red</em></span>
<span><input type='radio' name='colour' value='white' /><em class="value">Blue</em></span>
<span><input type='radio' name='colour' value='blue' /><em class="value">White</em></span>
</label>
</somecontainerparentelement>
Своего рода проблема с этим методом заключается в том, что я не уверен, разрешит ли p-v существование одного параметра (т.Е. <em>Colour</em>
) с несколькими значениями (т.Е. class='value'
элементов внутри <labels>
).
Хотя проблема не в том, что мне не придется терять сон, волосы или зубы, пытаясь создать легенду в IE (я предполагаю, что потеря зубов произошла из-за удара лицом о мой стол и клавиатуру)…
Ответ №1:
Что бы я там сделал, так это…
<fieldset>
<legend>Colour</legend>
<label><input type="radio" name="colour" value="red" />Red</label>
<label><input type="radio" name="colour" value="white" />Blue</label>
<label><input type="radio" name="colour" value="blue" />White</label>
</fieldset>
Кроме того, вы можете отделить свой label
элемент и связать его for
атрибут с id
атрибутом элемента. Обычно это упрощает их стилизацию, IMO.
<fieldset>
<legend>Colour</legend>
<input type="radio" name="colour" value="red" id="colour-red" />
<label for="colour-red">Red</label>
<input type="radio" name="colour" value="white" id="colour-white" />
<label for="colour-white">White</label>
<input type="radio" name="colour" value="blue" id="colour-blue" />
<label for="colour-blue">Blue</label>
</fieldset>
Обратите внимание, что legend
элемент, как известно, сложно стилизовать в разных браузерах.
Комментарии:
1. Мне нравится ваше решение. Я думаю, вам следует включить
label for
вариант в свой пример.2. @nfechner намного опередил вас
![]()
3. Честно говоря, я уже вроде как устранил fieldset, но приветствую предложение. Мне кажется, что fieldset больше подходит для «разделения» или разграничения формы на составляющие ее компоненты, поэтому я пытался как бы воздержаться от использования этого тега в этом контексте. Предположим, что для малых форм это может иметь смысл. Также я уже пробовал это в коде, и IE чуть не стошнило, когда пытался расположить легенду … lol
4. @BizNuge Мне кажется, что fieldset больше подходит для «разделения» или разграничения формы на составляющие ее компоненты -> Это именно то, что я делаю выше, я группирую переключатели, метки и заголовок в
fieldset
.5. Справедливый комментарий. хотя IE по-прежнему абсолютно не подходит с точки зрения стиля легенды (в настоящее время я пытаюсь расположить заголовок элемента управления слева от радиоприемников … кошмар.
Ответ №2:
Спецификация проекта HTML5 специально охватывает ситуацию SET A. В нем говорится:
Если атрибут for не указан, но элемент label имеет дочернего элемента, связанного с формой, который можно пометить, то первым таким потомком в древовидном порядке является элемент label с надписью. Элемент управления label.
Что означает, что
<label>Colour
<span><input type='radio' name='colour' value='red' />Red</span>
<span><input type='radio' name='colour' value='white' />White</span>
<span><input type='radio' name='colour' value='blue' />Blue</span>
</label>
семантически эквивалентно
<label>Colour
<span><input id="control1" type='radio' name='colour' value='red' />Red</span>
</label>
<span>
<input id="control2" type='radio' name='colour' value='white' />
<label for="control1">White</label>
</span>
<span>
<input id="control3" type='radio' name='colour' value='blue' />
<label for="control1">Blue</label>
</span>
я думаю, это не то, что вы имеете в виду.
Это также имеет практические последствия. Если вы разместите эту разметку на веб-странице, а затем щелкните по словам «Белый» или «Синий», в некоторых браузерах это приведет к выбору переключателя «Красный».
В идеале следовало бы использовать решение Алекса, но, как вы обнаружили, стиль legend
— это ЛАВАШ. Есть несколько обходных путей, но ничего полностью удовлетворительного, IMO.
Ответ №3:
Обычно лучшим решением является соединение элементов с использованием идентификатора:
<input id="test1" type="text"/><label for="test1">Test 1</label>
<input id="test2" type="text"/><label for="test2">Test 2</label>
Комментарии:
1. не слишком заморачивался с решением id, хотя я признаю, что это, казалось бы, реальное решение проблемы, по крайней мере, с точки зрения рендеринга. Тем не менее, я надеюсь, что в конечном итоге я пытаюсь предоставить целостное решение, которое, как хорошо работает в браузере, но также работает в контексте spidering / crawling, в конечном счете, и с информацией о микроформатах, поэтому отношения родитель-> дочерние элементы и вложенность — это то, что я хотел бы включить в значительной степени.