Тег option в HTML: что это, value, label и selected

Тег option (от английского option, «вариант») задаёт один вариант выбора. Его записывают внутри select, optgroup или datalist. Текст внутри option показывается пользователю, а атрибут value задаёт то, что уйдёт на сервер; без value уходит сам текст. Закрывающий </option> можно опустить, если сразу за вариантом идёт другой option, optgroup или конец родителя.

Варианты собирает в список тег select, а его работу с формой описывает тег form. Основы выбора из списка разобраны в уроке «Выпадающий список в HTML: select и option».

HTML
<select name="color">
  <option value="r">Красный</option>
  <option value="g">Зелёный</option>
</select>

Тег option в HTML: что это и где его записывают

Вариант option имеет смысл только внутри родителя. В select варианты раскрываются списком. В optgroup они собираются в группу с заголовком из label. В datalist они становятся подсказками для поля input: сам datalist на странице не виден. Запись вне этих родителей недопустима: браузер выведет текст как обычный блок, выбирать из него нечего.

HTML
<select name="c">
  <option>Красный</option>
</select>

<input list="colors" name="c">
<datalist id="colors">
  <option value="Красный"></option>
</datalist>

Пример: один и тот же option в разных родителях

Результат

Выберите запись: под результатом родитель варианта, его display и пояснение.

Текст и value: что показывается и что уходит на сервер

У варианта три связанные части. Текст показывается в списке. Значение уходит в данные формы и берётся из value, а если атрибута нет, то из текста. Видимую надпись задаёт label, а если его нет, то текст. В скрипте это свойства text, value и label. Пустой value="" считается значением: на сервер уйдёт пустая строка, а не текст. Пробелы в значении атрибута сохраняются как записано, а свойство text сжимает пробелы по краям и внутри.

HTML
<option>Красный</option>
<option value="r">Красный</option>
<option value="">Красный</option>

Пример: text, value и label у выбранного варианта

Результат

Выберите запись и вариант в списке: под результатом свойства варианта и данные формы.

Атрибут label: другая надпись варианта

Атрибут label заменяет надпись варианта в списке, а текст и value остаются прежними. Он удобен для сокращений: в списке «Кр.», на сервер уходит r. Вариант с label может не иметь текста: <option value="r" label="Красный"></option> допустим. Без label и без текста запись недопустима, а пустой label="" проверка HTML считает ошибкой.

HTML
<option value="r" label="Кр.">Красный</option>

Пример: что меняет label

Результат

Выберите запись и вариант: под результатом text, value и label.

Атрибут selected: выбранный вариант и defaultSelected

Атрибут selected выбирает вариант заранее. У варианта два связанных свойства: selected показывает, выбран ли он сейчас, а defaultSelected показывает, записан ли атрибут. Сброс формы возвращает выбор по атрибуту, то есть по defaultSelected. В обычном списке выбран один вариант, поэтому присваивание selected = true снимает выбор с остальных. В списке с multiple выбранными бывают несколько вариантов, и скрипт добавляет выбор, не снимая прежний.

HTML
<option value="g" selected>Зелёный</option>

Пример: selected, defaultSelected и сброс формы

Результат

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

Недоступный и скрытый вариант: disabled и hidden

Атрибут disabled делает вариант недоступным: он серый, а мышью выбрать его нельзя. Стрелки клавиатуры его пропускают. Отключённый optgroup отключает все варианты внутри: свойство disabled у них остаётся false, но :disabled совпадает. Если выбранного варианта нет, а первый отключён, браузер выбирает первый из доступных. Скрипт может выбрать и отключённый вариант, но в данные формы он не попадёт. Атрибут hidden убирает вариант из раскрытого списка, при этом вариант остаётся в options и может быть выбран скриптом.

HTML
<option value="2" disabled>Второй</option>
<option value="3" hidden>Скрытый</option>

Пример: disabled, optgroup disabled и hidden

Результат

Выберите запись и вариант: под результатом состояние каждого варианта и данные формы.

Можно ли добавить теги в option: что записывают внутри

Внутри option записывают текст. Символы &, < и > пишут сущностями, а отступ в начале варианта делают неразрывными пробелами &nbsp;: обычные пробелы по краям обрезаются. Теги b, span и подобные браузер в DOM сохраняет, а проверка HTML их принимает, но в обычном списке показывается только текст. В customizable select внутри варианта можно оформлять разметку. Вторая option, записанная внутри первой, закрывает первую.

HTML
<option>&nbsp;&nbsp;Вложенный</option>
<option><b>Жирный</b> текст</option>

Пример: что остаётся внутри варианта

Результат

Выберите запись: под результатом число вариантов, text первого и теги внутри.

Вернуть selected после отправки формы: пример на PHP

После отправки формы страница приходит с сервера заново, и выбранный вариант нужно записать в ответ. Сервер сравнивает полученное значение со значением каждого варианта и дописывает selected совпавшему. В PHP полученное значение находится в $_GET["color"] для метода get и в $_POST["color"] для post. Значения вариантов берут из своего массива, а полученное значение только сравнивают, не выводя на страницу.

PHP
<select name="color">
  <?php foreach ($colors as $value => $title): ?>
    <option value="<?= $value ?>"<?= $value === ($_GET["color"] ?? "") ? " selected" : "" ?>>
      <?= htmlspecialchars($title) ?>
    </option>
  <?php endforeach; ?>
</select>

Пример: страница после отправки формы

Результат

Выберите цвет и нажмите «Отправить»: под результатом разметка, которую вернул бы сервер.

Тег option и JavaScript: new Option, add и remove

Вариант создают конструктором new Option(text, value, defaultSelected, selected). Без аргументов получается пустой вариант, а с одним текстом значением служит этот текст. Вариант добавляют через select.add(option) или select.options.add(option, index), удаляют через option.remove(). Свойства text, value, label и selected читаются и меняются, свойство index только читается, а option.form возвращает форму родительского select. Список из массива собирают циклом.

JavaScript
const select = document.querySelector("select");
select.add(new Option("Жёлтый", "y"));
select.options[0].selected = true;

Пример: создание и изменение вариантов

Результат

Выберите запись и нажмите «Выполнить»: под результатом ответ скрипта.

CSS для option: что стилизуется и customizable select

Оформление варианта ограничено. Раскрытый список рисует браузер, поэтому поддержка свойств у option в браузерах различается. Псевдокласс :checked совпадает с выбранным вариантом, а :disabled с отключённым. Полное оформление даёт customizable select: после appearance: base-select варианты стилизуются как обычные элементы. Его записывают внутри @supports, чтобы остальные браузеры показали обычный список.

CSS
option:checked {
  background-color: #e6f3f1;
}
option:disabled {
  color: #999;
}

Пример: стили вариантов и base-select

Результат

Выберите вариант оформления и раскройте список: под результатом вычисленные цвета.

Доступность option: роль, название и состояние

У варианта роль option, и менять её через role не следует: проверка HTML считает это ошибкой. Название берётся из label, а если его нет, из текста. Выбранный вариант программа чтения с экрана объявляет выбранным, а отключённый недоступным. Название самого списка задают через label или aria-label у select, а не у варианта. Как это делается, показано в уроке «Элементы форм в HTML: select, textarea, checkbox и radio».

HTML
<select aria-label="Цвет">
  <option value="r" label="Кр.">Красный</option>
  <option value="g" disabled>Зелёный</option>
</select>

Пример: название и состояние вариантов

Результат

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

Атрибуты тега option

Вариант принимает глобальные атрибуты и те, что собраны в таблице. Атрибуты самого списка (name, multiple, size) записывают у select. Несуществующие атрибуты отмечены отдельно: браузер их игнорирует, а проверка HTML сообщает об ошибке.

АтрибутСтатусЧто делаетПример записи
valueактуаленЗначение варианта в данных формы. Без него уходит текст<option value="r">
selectedактуаленВыбирает вариант заранее. В обычном списке остаётся последний<option selected>
disabledактуаленОтключает вариант: выбрать его нельзя, в данные он не попадёт<option disabled>
labelактуаленНадпись варианта вместо текста. Пустой label недопустим<option label="Кр.">
hiddenглобальныйУбирает вариант из раскрытого списка<option hidden>
checkedне существуетДля варианта нет, браузер его игнорирует. Нужен selected<option checked>
placeholderне существуетПодсказку делают первым пустым вариантом, а не атрибутом<option placeholder="x">
typeне существуетУ варианта нет типа<option type="x">
roleне менятьРоль option задана тегом, переопределять её не следует: проверка HTML сообщает об ошибке<option role="menuitem">

Вопросы про тег option: datalist и атрибут checked

Вариант в datalist похож на вариант в select, и с ним часто связывают атрибут checked: чем вариант в datalist отличается от варианта в select и при чём здесь checked.

Чем option в datalist отличается от option в select?

В select вариант выбирается, и значение списка всегда одно из вариантов. В datalist варианты только подсказки для поля input: пользователь может ввести и своё значение, а selected на поле не действует. Вариант в datalist может не иметь текста, достаточно value, а в select пустой вариант без label недопустим. Подробнее про подсказки: урок про datalist.

HTML
<select name="c">
  <option value="g" selected>Зелёный</option>
</select>

<input list="cl" name="c">
<datalist id="cl">
  <option value="g" selected></option>
</datalist>

Пример: selected в select и в datalist

Результат

Выберите способ: под результатом, какое значение получило поле.

Чем selected отличается от checked?

Атрибут selected относится к option, а checked относится к флажкам и переключателям input. На варианте checked ничего не делает: выбран остаётся первый вариант. Псевдокласс :checked общий: он совпадает и с отмеченным флажком, и с выбранным вариантом.

HTML
<option value="2" selected>Второй</option>
<input type="checkbox" checked>

Пример: selected у option и checked у флажка

Результат

Выберите запись: под результатом состояние и данные формы.

Частые ошибки с тегом option

Ошибки с вариантом в основном про атрибуты и пустые записи.

ОшибкаЧто происходитКак исправить
Выбор записан атрибутом checkedАтрибут игнорируется, выбран первый вариантЗаписать selected
Пустой option без текста и labelПроверка HTML сообщает об ошибке, в списке пустая строкаЗаписать текст или label
Пустой атрибут label=""Запись недопустима, свойство label возвращает пустую строкуУбрать атрибут или записать надпись
Пробелы внутри valueПробелы сохраняются и уходят на серверПисать значение без лишних пробелов
Два selected в списке без multipleОстаётся последний выбранныйЗаписать один selected или добавить multiple
Вариант записан вне selectТекст выводится на странице, выбрать нечегоЗаписать вариант в select, optgroup или datalist
Теги внутри варианта ради оформленияВ обычном списке показывается только текстИспользовать CSS или customizable select
Отступ варианта пробелами в начале текстаПробелы по краям обрезаютсяЗаписать &nbsp; или задать padding
Нет value, а сервер ждёт кодУходит текст варианта, и правка надписи ломает обработкуЗадать каждому варианту свой value
Категория
Поделиться в социальных сетях

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×