Select
Кастомизация стандартного Sel

Основные данные
Нативный select нет возможности полностью стилизовать, поэтому приходится создавать "кастомизированный". Но, для мобильных версий необходимо отображать стандартную версию, так как в болбольшенствебильных устройств нативный select хорошо реализован в браузере.
Терминология
При создании кастомного select в качестве примера был взят Open UI select.
select: оригинальный select, из которого будут копироваться все данные в кастомный
menu: кастомный select, корневая нода
button: нода, которая содержит информацию о выбранном пункте, так же является кнопкой вызова окна со списком доступных значений
popup: список доступных значений
option: значение (элемент списка)
Параметры
Параметры необходимо установить на нативный select (даже если он их не поддерживает)
autofocus
- реализовать нет возможности, так как необходимо отслеживать все аналогичные параметры на странице (нативно делает браузер)disabled
- определяет доступность selectform
- cвязывает список с формой, не переходит на кастомный selectmultiple - позволяет одновременно выбирать сразу несколько элементов списка
name - имя элемента для отправки на сервер или обращения через скрипты, не переходит на кастомный select
open - определяет открыт ли select при загрузке
required - список обязателен для выбора перед отправкой формы, не переходит на кастомный select
selected - определяет выбранный пeyrn меню по умолчанию
size - количество отображаемых строк списка.
Интерактивный дизайн
Управление клавиатурой
Управление с клавиатуры в точности должны повторять аналогичные действия нативного select, а именно:
Находясь на button СТРЕЛКИ меняют значения, что сразу отражается на самой button
Находясь на button ENTER открывает popup
Находясь на любом элементе menu ESC или TAB закрывает popup, а фокус возвращается на button
При открытии popup фокус попадает на выбранный option, а СТРЕЛКИ меняют значения, что сразу отражается на button
Находясь на option ENTER закрывает popup, а фокус возвращается на button
Screenreader
Руководство для разработчиков
Content (HTML)
В данном примере кастомный select будет формировать через js, основой которому будет служить нативный вариант:
<div class="select-wrapper">
<label class="options__item" for="date"></label>
<select class="options__select" id="date" name="date">
<option value="new">Сначала новые</option>
<option value="old">Сначала старые</option>
<option value="random">В случайном порядке</option>
</select>
</div>
После применения JS:
<div class="select-wrapper">
<label class="options__item" for="date"></label>
<select class="options__select" id="date" name="date">
<option value="new">Сначала новые</option>
<option value="old">Сначала старые</option>
<option value="random">В случайном порядке</option>
</select>
<div class="select__menu">
<button class="select__button">Сначала новые</button>
<ul class="select__popup">
<li tabindex="0" class="select__option" data-value="new" selected="">Сначала новые</li>
<li tabindex="-1" class="select__option" data-value="old">Сначала старые</li>
<li tabindex="-1" class="select__option" data-value="random">В случайном порядке</li>
</ul>
</div>
</div>
Behaviour (JS)
Описание создание кастомного select описываться не будет, но следует отметить, что необходимо прописать связь между значениями кастомного и нативного select
ARIA
Так как role = select, то используется следующее:
role=menu
Сообщает вспомогательным технологиям, что это меню, содержащее элементы меню.
role=menuitem
Сообщает вспомогательным технологиям, что это элементы меню.
aria-checked
Сообщает вспомогательным технологиям, какие элементы меню выбраны.
aria-haspopup
Сообщает вспомогательным, что button имеет popup, который будет показан (вызван) при нажатии
aria-expanded
Сообщает вспомогательным технологиям состояние popup (открыт\закрыт)
Last updated
Was this helpful?