The <datalist>
contains a set of <option>
elements that represent the permissible or recommended options available to choose from within other controls.
Content categories | Flow content, phrasing content. |
---|---|
Permitted content | Either phrasing content or zero or more <option> elements. |
Tag omission | None, both the starting and ending tag are mandatory. |
Permitted parents | Any element that accepts phrasing content. |
Implicit ARIA role | listbox |
Permitted ARIA roles | No role permitted |
DOM interface | HTMLDataListElement |
This element has no other attributes than the global attributes, common to all elements.
<label for="myBrowser">Choose a browser from this list:</label> <input list="browsers" id="myBrowser" name="myBrowser" /> <datalist id="browsers"> <option value="Chrome"> <option value="Firefox"> <option value="Internet Explorer"> <option value="Opera"> <option value="Safari"> <option value="Microsoft Edge"> </datalist>
The style of the list produced by a <datalist>
element is platform-dependent, so if you want to customize the display of the options, you have to implement your own custom solution that overrides the default behavior. The below example provides a simple solution for this. Note how we haven't specified the <datalist>
id
inside the <input>
list
attribute in this case, as that stops the browser-specific display of the data list items from kicking in. Instead, we are setting the selected <datalist>
value in the <input>
via JavaScript.
Note: Since ::after
is not permitted on <input>
elements, if you want to reproduce the arrow-down icon you will have to wrap the <input>
element in another element that you can hang the styling on (or some other suitable solution).
<input list="" name="option" id="input" autocomplete="off" > <datalist id="datalist"> <option>Carrots</option> <option>Peas</option> <option>Beans</option> </datalist>
datalist { position: absolute; background-color: lightgrey; font-family: sans-serif; font-size: 0.8rem; } option { background-color: #bbb; padding: 4px; margin-bottom: 1px; cursor: pointer; }
input.onfocus = function () { datalist.style.display = 'block'; } for (let option of datalist.options) { option.onclick = function () { input.value = this.value; datalist.style.display = 'none'; } } datalist.style.width = input.offsetWidth + 'px'; datalist.style.left = input.offsetLeft + 'px'; datalist.style.top = input.offsetTop + input.offsetHeight + 'px';
Specification | Status | Comment |
---|---|---|
HTML Living Standard The definition of '<datalist>' in that specification. | Living Standard | |
HTML5 The definition of '<datalist>' in that specification. | Recommendation |
Desktop | ||||||
---|---|---|---|---|---|---|
datalist |
20 | 12 | 4 | 10 | 9.5 | 12.1 |
Mobile | ||||||
---|---|---|---|---|---|---|
datalist |
4.4.3 | 33 | 4
|
Partial
|
12.2 | 2.0 |
Include this polyfill to provide support for older and currently incompatible browsers:
datalist-polyfill
© 2005–2020 Mozilla and individual contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/datalist