Кратко
СкопированоЭлемент <datalist> — это источник предложений, то есть такой элемент, который содержит предопределённые варианты выбора для пользователя. В основном за варианты выбора опций выступают элементы <option>.
У тега по умолчанию есть роль listbox.
Пример
Скопировано
<form> <label for="my-browser">Выберите браузер из списка:</label> <input type="text" list="browsers" id="my-browser" name="my-browser"> <datalist id="browsers"> <option value="Chrome"> <option value="Firefox"> <option value="Yandex Browser"> <option value="Opera"> <option value="Safari"> <option value="Microsoft Edge"> </datalist><form>
<form>
<label for="my-browser">Выберите браузер из списка:</label>
<input type="text" list="browsers" id="my-browser" name="my-browser">
<datalist id="browsers">
<option value="Chrome">
<option value="Firefox">
<option value="Yandex Browser">
<option value="Opera">
<option value="Safari">
<option value="Microsoft Edge">
</datalist>
<form>
Как пишется
СкопированоПеред использованием элемент <datalist> нужно связать с элементом <input> через атрибут list:
<input list="fruits"><datalist id="fruits"> <option value="Банан"> <option value="Арбуз"> <option value="Киви"></datalist>
<input list="fruits">
<datalist id="fruits">
<option value="Банан">
<option value="Арбуз">
<option value="Киви">
</datalist>
Элемент <datalist> не сработает, если между элементами <input> и <datalist> будет любой другой элемент с id. Даже если это сам <input> со значением, которое равно значению атрибута list элемента <input>:
<form> <label for="fruits">Выберите фрукт из неработающего списка:</label> <input list="fruitsList" id="fruits" name="fruits"> <div id="fruitsList"> <datalist id="fruitsList"> <option value="Банан"> <option value="Арбуз"> <option value="Киви"> </datalist> </div></form>
<form>
<label for="fruits">Выберите фрукт из неработающего списка:</label>
<input list="fruitsList" id="fruits" name="fruits">
<div id="fruitsList">
<datalist id="fruitsList">
<option value="Банан">
<option value="Арбуз">
<option value="Киви">
</datalist>
</div>
</form>
Как понять
СкопированоЭлемент <datalist> не отображается браузерами, его значение display по умолчанию none. <datalist> просто содержит набор каких-то предопределённых вами вариантов выбора — опций. Их можно будет выбрать из выпадающего списка после того, как свяжите их с <input>. Эти значения будут по-разному отображаться в зависимости от значения атрибута type у <input>.
Элемент <datalist> можно связать с элементом <input> только через атрибут list, но этот атрибут поддерживается не всеми интерактивными элементами.
Элемент <input> не будут работать с элементом <datalist>, если у <input> одно из следующих значений атрибута type:
hidden;password;checkbox;radio;file;submit;image;reset;button.
Интерактивные элементы, поддерживающие <datalist>
Скопированоtext, search
СкопированоЭлемент <input> со значением text или search у атрибута type — это однострочный интерактивный элемент для редактирования обычного текста.
Значения text, search атрибута type элемента <input> имеют функцию автодополнения.
По мере набора текста в поле для ввода браузер выдаёт пользователю варианты, которые, в случае совпадения, он находит в элементе <datalist>.
При поиске предложения в элементе <datalist> браузер ориентируется не только на значение элемента <option>, но и на атрибут label, если он указан. Также атрибут label будет отображаться в выпадающем списке, если он не совпадает со значением элемента <option>.
Рассмотрим пример:
<form> <label for="my-browser">Текстовое поле:</label> <input type="text" list="browsers" id="my-browser" name="my-browser"> <datalist id="browsers"> <option value="Chrome" label="Google"> <option value="Firefox" label="Mozilla"> <option value="Opera" label="Opera"> </datalist></form>
<form>
<label for="my-browser">Текстовое поле:</label>
<input type="text" list="browsers" id="my-browser" name="my-browser">
<datalist id="browsers">
<option value="Chrome" label="Google">
<option value="Firefox" label="Mozilla">
<option value="Opera" label="Opera">
</datalist>
</form>
Здесь у каждого элемента <option> есть атрибут label. У последнего элемента значения атрибутов value и label совпадают, поэтому в выпадающем списке метка не будет отображаться.
tel
СкопированоЭлемент <input> со значением tel атрибута type — это интерактивный элемент для редактирования телефонного номера. Предложения элемента <datalist> отображаются с этим типом также, как и с типом text.
url
СкопированоЭлемент <input> со значением url атрибута type — это интерактивный элемент для редактирования одного абсолютного URL. Предложения элемента <datalist> отображаются с этим типом также, как и с типом text.
email
СкопированоЭлемент <input> со значением email атрибута type — это интерактивный элемент для редактирования адреса электронной почты. Предложения элемента <datalist> отображаются с этим типом также, как и с типом text.
Если у элемента <input> указан атрибут multiple, появляется одна особенность. Поле для ввода позволяет указать несколько электронных почт через запятую. После знака запятой автодополнение будет всё так же работать.
date, month, week, time
СкопированоЭлемент <input> со значением date, month, week или time атрибута type — это интерактивный элемент для выбора определённой даты, месяца, недели или времени.
Чтобы предложения элемента <datalist> правильно отображались в интерактивных элементах, необходимо соблюдать определённые правила написания значения элемента <option>. Основные правила для date, month, week:
- Все значения разделяются через дефис.
- Год должен быть больше 0 и состоять из 4 цифр.
- Месяц должен состоять из двух цифр и быть не меньше 1, но и не больше 12.
- Число должно состоять из двух цифр и быть не меньше 1, но и не больше 31.
- Неделя должна состоять из двух цифр и быть не меньше 1, но и не больше 53 либо 52, в зависимости от года (високосный или невисокосный). Номер недели указывается после символа
W.
Порядок написания для date, month, week следующий:
date— год-месяц-число;month— год-месяц;week— год-неделя;
Для типа time действуют следующие правила:
- Все значения разделяются двоеточием.
- Час должен состоять из двух цифр и быть не меньше 0, но и не больше 23.
- Минута должна состоять из двух цифр и быть не меньше 0, но и не больше 59.
- Секунда должна состоять из двух цифр и быть не меньше 0, но и не больше 59.
Секунда также может быть не целой и иметь дробную часть. Для отделения целой части от дробной используется знак точки. Дробная часть должна состоять максимум из 3 цифр.
Порядок написания для time следующий:
- с использованием целой секунды — час:минута:секунда;
- если у секунды есть дробная часть — час:минута:секунда.дробь.
Итоговый код с примерами всех описанных интерактивных элементов для работы со временем:
<!-- Date --><form> <label for="dateInput">Укажите дату:</label> <input type="date" list="dateList" id="dateInput"> <datalist id="dateList"> <option value="2022-10-10" label="Сегодня"> <option value="2022-10-03" label="Неделю назад"> <option value="2022-10-17" label="Неделю спустя"> </datalist></form><!-- Month --><form> <label for="monthInput">Укажите месяц:</label> <input type="month" list="monthList" id="monthInput"> <datalist id="monthList"></datalist> <option value="2022-10" label="Осень"> <option value="2022-12" label="Зима"> <option value="2022-03" label="Весна"> </datalist></form><!-- Week --><form> <label for="weekInput">Укажите неделю:</label> <input type="week" list="weekList" id="weekInput"> <datalist id="weekList"> <option value="2022-W12" label="Двенадцатая неделя"> <option value="2022-W52" label="Последняя неделя"> <option value="2022-W1" label="Первая неделя"> </datalist></form><!-- Time --><form> <label for="timeInput">Укажите время:</label> <input type="time" list="timeList" id="timeInput" step="any"> <datalist id="timeList"> <option value="08:00:20" label="Утром"> <option value="12:00" label="Днём"> <option value="18:00" label="Вечером"> </datalist></form>
<!-- Date -->
<form>
<label for="dateInput">Укажите дату:</label>
<input type="date" list="dateList" id="dateInput">
<datalist id="dateList">
<option value="2022-10-10" label="Сегодня">
<option value="2022-10-03" label="Неделю назад">
<option value="2022-10-17" label="Неделю спустя">
</datalist>
</form>
<!-- Month -->
<form>
<label for="monthInput">Укажите месяц:</label>
<input type="month" list="monthList" id="monthInput">
<datalist id="monthList"></datalist>
<option value="2022-10" label="Осень">
<option value="2022-12" label="Зима">
<option value="2022-03" label="Весна">
</datalist>
</form>
<!-- Week -->
<form>
<label for="weekInput">Укажите неделю:</label>
<input type="week" list="weekList" id="weekInput">
<datalist id="weekList">
<option value="2022-W12" label="Двенадцатая неделя">
<option value="2022-W52" label="Последняя неделя">
<option value="2022-W1" label="Первая неделя">
</datalist>
</form>
<!-- Time -->
<form>
<label for="timeInput">Укажите время:</label>
<input type="time" list="timeList" id="timeInput" step="any">
<datalist id="timeList">
<option value="08:00:20" label="Утром">
<option value="12:00" label="Днём">
<option value="18:00" label="Вечером">
</datalist>
</form>
datetime-local
СкопированоЭлемент <input> со значением datetime атрибута type — это интерактивный элемент для установки местной даты и времени, без информации о смещении часового пояса.
Порядок написания для datetime разделён на две части:
- первая часть — год-месяц-число;
- вторая часть — час:минута:секунда.
Части разделяются пробелом или символом T.
<form> <label for="datetimeInput">Укажите дату:</label> <input type="datetime-local" list="dateList" id="datetimeInput"> <datalist id="dateList"> <option value="2022-10-10 12:00" label="Сегодня днём"> <option value="2022-10-03T08:00" label="Неделю назад утром"> <option value="2022-10-17 17:00" label="Через неделю вечером"> </datalist></form>
<form>
<label for="datetimeInput">Укажите дату:</label>
<input type="datetime-local" list="dateList" id="datetimeInput">
<datalist id="dateList">
<option value="2022-10-10 12:00" label="Сегодня днём">
<option value="2022-10-03T08:00" label="Неделю назад утром">
<option value="2022-10-17 17:00" label="Через неделю вечером">
</datalist>
</form>
number
СкопированоЭлемент <input> со значением number атрибута type — это интерактивный элемент для установки числа. Предложения элемента <datalist> отображаются с этим типом также, как и с типом text.
range
СкопированоЭлемент <input> со значением range атрибута type — это интерактивный элемент для установки числа, как и number, но с более простым отображением в виде ползунка.
Чтобы предложения элемента <datalist> правильно отображались в интерактивном элементе range, значения опций, элементов <option>, должны быть числом с плавающей точкой.
Если значения указаны верно, то браузер при рендеринге будет отображать засечки, которые обозначают элемент <option>.
<form> <label for="rangeInput">Укажите число:</label> <input type="range" list="rangeList" id="rangeInput"> <datalist id="rangeList"> <option value="0"> <option value="25"> <option value="50"> <option value="75"> <option value="100"> </datalist></form>
<form>
<label for="rangeInput">Укажите число:</label>
<input type="range" list="rangeList" id="rangeInput">
<datalist id="rangeList">
<option value="0">
<option value="25">
<option value="50">
<option value="75">
<option value="100">
</datalist>
</form>
За отображение числового значения под ползунком в демке отвечает элемент <output>.
color
СкопированоЭлемент <input> со значением color атрибута type — это интерактивный элемент для выбора цвета.
Чтобы предложения элемента <datalist> правильно отображались в интерактивном элементе color, значения опций, элементов <option>, должны быть в виде шестнадцатеричного значения цвета.
Правильное значение должно состоять из 7 символов #000000, включая решётку #. Сокращённые значения #000 работать не будут.
<form> <label for="colorInput">Укажите цвет:</label> <input type="color" list="colorList" id="colorInput"> <datalist id="colorList"> <option value="#FF6347" label="Tomato"> <option value="#F5DEB3" label="Wheat"> <option value="#DDA0DD" label="Plum"> </datalist></form>
<form>
<label for="colorInput">Укажите цвет:</label>
<input type="color" list="colorList" id="colorInput">
<datalist id="colorList">
<option value="#FF6347" label="Tomato">
<option value="#F5DEB3" label="Wheat">
<option value="#DDA0DD" label="Plum">
</datalist>
</form>
Различия между <select> и <datalist>
СкопированоКроме функции автодополнения элемента <datalist>, основное отличие между <select> и этим тегом в том, что в элементе <select> нельзя выбрать или указать значение не из списка предлагаемых.
В интерактивных элементах с вводом значений можете указать своё значение или выбрать что-то из предложенного в списке.
С другой стороны, если добавить атрибут multiple к <select>, появится возможность выбрать несколько вариантов из выпадающего списка. Множественный выбор у интерактивных элементов, связанных с элементом <datalist>, работает только у типа email.
Обратная совместимость
СкопированоДля обратной совместимости с устаревшими браузерами элементы <datalist> и <select> используются вместе.
Есть два способа:
Первый способ. Если предопределённые элементы выбора не важны в устаревших браузерах, достаточно использовать элемент <datalist> с дочерними элементами <option>.
Выглядит это так:
<p> <label> Введите породу вашей собаки: <input type="text" name="breed" list="breeds"> </label> <datalist id="breeds"> <option value="Австралийская овчарка"> <option value="Акита-ину"> <option value="Алабай"> <!-- Гав-гав! --> </datalist></p>
<p>
<label>
Введите породу вашей собаки:
<input type="text" name="breed" list="breeds">
</label>
<datalist id="breeds">
<option value="Австралийская овчарка">
<option value="Акита-ину">
<option value="Алабай">
<!-- Гав-гав! -->
</datalist>
</p>
Устаревшие браузеры не поддерживают элемент <datalist> и атрибут value у элемента <option>. Чтобы функция автодополнения подсказывала предопределённые варианты выбора в современных браузерах, значения элементов <option> указываются в атрибутах value. Если сделать значения содержимым <option>, тогда они будут отображаться в устаревших браузерах.
В итоге в устаревших браузерах будет отображаться только элемент <input>, в который пользователь введёт нужное значение. В современных браузерах будет элемент <input> с выпадающим списком и автодополнением.
Второй способ. Если предопределённые значения нужно показать в устаревших браузерах, то вложите элементы <option> в элемент <select> и сделайте значения элементов содержимым <option>, а не указывайте их в атрибуте value. Если указать значения в value, они не будут отображаться в выпадающем списке <select>. Наконец, вложите <select> с дочерними элементами <option> в <datalist>.
Выглядит это так:
<p> <label> Введите породу вашей собаки: <input type="text" name="breed" list="breeds"> </label> <datalist id="breeds"> <label> или выберите одну из списка: <select name="breed"> <option>Австралийская овчарка <option>Акита-ину <option>Алабай <!-- Гав-гав! --> </select> </label> </datalist></p>
<p>
<label>
Введите породу вашей собаки:
<input type="text" name="breed" list="breeds">
</label>
<datalist id="breeds">
<label>
или выберите одну из списка:
<select name="breed">
<option>Австралийская овчарка
<option>Акита-ину
<option>Алабай
<!-- Гав-гав! -->
</select>
</label>
</datalist>
</p>
Современный браузер не отобразит элементы <select> и <label>, которые вложены в <datalist>. Однако браузер не будет игнорировать элементы с <option> в <select>, они станут элементами <datalist>.
В итоге в современных браузерах отобразиться элемент <input> с выпадающим списком и автодополнением. Устаревший браузер будет игнорировать элемент <datalist> и предложит ввести своё значение при помощи элемента <input> или выбрать значение из выпадающего списка <select>.
Доступность
СкопированоХотя у <datalist> есть встроенная семантика, тег нельзя назвать полностью доступным. Например, не все скринридеры зачитывают содержимое выпадающего списка с вариантами для автозаполнения.
Следующая проблема связана с CSS — пока у разработчиков нет возможности стилизовать выпадающий список и пункты в нём, а стили по умолчанию далеки от совершенства. Также к списку не применяются системные цвета в режиме высокой контрастности. В нём он выглядит точно так же, как в обычно режиме отображения цветов.

Наконец, пункты выпадающего списка не увеличиваются при масштабировании.

На практике
Скопированосоветует
Скопировано🛠 Про проблему стилизации выпадающих списков известно давно. Выпадающий список опций элемента <datalist> не исключение и стилизовать его не получится, но можно поменять иконку стрелки у некоторых элементов или изменить цвет календаря или циферблата.
Так как браузеры по-разному отображают интерактивные элементы, давайте разберём пример только для тех браузеров, которые поддерживают псевдоэлемент :. Он отвечает за всплывающую иконку со стрелкой, календарём и циферблатом у интерактивных элементов.
Вот как можно изменить вид стрелки.
Скроем псевдоэлемент : через свойство display:
[list]::-webkit-calendar-picker-indicator { display: none !important;}
[list]::-webkit-calendar-picker-indicator {
display: none !important;
}
Укажем модификатор !important для интерактивных элементов с типом text, search, url, email, tel или number. Без модификатора иконка со стрелкой при наведении продолжит появляться.
Правда, есть один интерактивный элемент, у которого не получится изменить иконку со стрелкой. Это элемент с типом color.
После того как скрыли псевдоэлемент, можно использовать свою иконку. Хороший пример можно посмотреть в разделе «На практике» доки про <select>.
🛠 Иконки с циферблатом и календарём у интерактивных элементов с типом date, month, week и datetime по умолчанию тёмного цвета. Если нужно изменить цвет на белый, используйте свойство filter и укажите в значении функцию invert со значением 1:
[list]::-webkit-calendar-picker-indicator { filter: invert(1);}
[list]::-webkit-calendar-picker-indicator {
filter: invert(1);
}