Выпадающий список
Оригинальное название: dropdown
Коротко
Элемент интерфейса, который в свёрнутом виде занимает одну строку, а по щелчку или нажатию клавиши раскрывает перечень вариантов, пунктов меню или фильтров.
Что такое «Выпадающий список»
Выпадающие списки экономят место: десятки городов, размеров или способов доставки прячутся за одной строкой. Под этим названием скрываются два разных по устройству элемента. Первый — поле выбора значения в форме, нативный select. Второй — меню навигации или действий, которое раскрывается по кнопке: в нём не выбирают значение, а переходят по ссылке или запускают команду.
Нативный select
<label for="city">Город доставки</label>
<select id="city" name="city">
<optgroup label="Центр">
<option value="msk">Москва</option>
<option value="tver">Тверь</option>
</optgroup>
<option value="other" selected>Другой</option>
</select>
Браузер даёт всё сразу: управление стрелками, поиск по первым буквам, системный список на телефоне, отправку значения вместе с формой. Атрибут multiple превращает его в список с множественным выбором, а для подсказок при вводе есть datalist. Минус — раскрытый список почти не поддаётся оформлению. В свежих версиях браузеров на Chromium появилась возможность стилизовать его целиком через appearance: base-select, но рассчитывать на неё во всех браузерах пока нельзя.
Что повторить в самодельном списке
Когда дизайн требует картинок в пунктах, поиска или чекбоксов, список собирают из div и скриптов. Тогда всё, что select умел сам, приходится делать вручную:
- открытие по Enter и пробелу, перемещение стрелками, закрытие по Escape;
- возврат фокуса на кнопку после выбора;
- роли и состояния ARIA:
aria-expandedна кнопке,role="listbox"иrole="option"у списка; - закрытие при щелчке мимо и правильную работу внутри прокручиваемого блока;
- передачу значения на сервер — обычно его пишут в скрытое поле формы.
Пропуск любого пункта бьёт по доступности интерфейса: список, который не открывается с клавиатуры, для части посетителей просто не существует. Поэтому, если макет позволяет, выгоднее оставить нативный элемент и оформить только его закрытое состояние.

