Библиотека Slim Select предоставляет полноценную поддержку управления компонентом без использования мыши. Навигация с клавиатуры особенно важна для:
Slim Select заменяет стандартный <select>
собственным DOM-компонентом, поэтому обработка клавиатуры реализуется
внутри библиотеки через систему событий и управления фокусом.
После инициализации Slim Select создаёт собственный контейнер:
<select id="countries">
<option value="kz">Казахстан</option>
<option value="ru">Россия</option>
<option value="uz">Узбекистан</option>
</select>
new SlimSelect({
select: '#countries'
})
Переход к компоненту осуществляется стандартной клавишей:
Tab
Когда элемент получает фокус:
focus.Slim Select поддерживает несколько способов открытия выпадающего списка.
Enter
Открывает список и переводит фокус к текущему выбранному элементу.
Space
Работает аналогично Enter.
ArrowDown
Если список закрыт — открывает его.
После открытия выпадающего меню используются клавиши стрелок.
ArrowDown
Переход к следующему элементу.
ArrowUp
Переход к предыдущему элементу.
Пример поведения:
new SlimSelect({
select: '#countries'
})
При нажатии:
ArrowDown
ArrowDown
активируется третий элемент списка.
Для подтверждения выбора используется:
Enter
После нажатия:
<select>;change;Escape
Закрывает список без изменения значения.
Tab
Закрывает список и переводит фокус к следующему элементу формы.
В режиме множественного выбора клавиатурное управление становится сложнее.
Пример:
<select id="tags" multiple>
<option>JavaScript</option>
<option>TypeScript</option>
<option>Node.js</option>
<option>React</option>
</select>
new SlimSelect({
select: '#tags'
})
Особенности:
В multiple-режиме поддерживается удаление через клавиатуру.
Если строка поиска пустая:
Backspace
удаляет последний выбранный тег.
Пример поведения:
[JavaScript] [React]
^
удаляется
Если включён поиск:
new SlimSelect({
select: '#countries',
settings: {
searchText: 'Поиск...'
}
})
после открытия списка курсор автоматически помещается в поле поиска.
Доступны стандартные клавиши:
Slim Select реагирует на ввод с клавиатуры в реальном времени.
Пример:
<select id="cities">
<option>Алматы</option>
<option>Астана</option>
<option>Караганда</option>
<option>Шымкент</option>
</select>
При вводе:
ка
отобразится:
Караганда
Slim Select позволяет подключать собственные обработчики.
Пример перехвата Enter:
const select = new SlimSelect({
select: '#countries'
})
document.addEventListener('keydown', (event) => {
if (event.key === 'Enter') {
console.log('Нажат Enter')
}
})
Навигация с клавиатуры тесно связана с управлением фокусом.
const element = document.querySelector('#countries')
element.addEventListener('focus', () => {
console.log('Фокус получен')
})
element.addEventListener('blur', () => {
console.log('Фокус потерян')
})
Slim Select наследует поведение стандартного select.
Пример:
<select id="priority" tabindex="3">
<option>Low</option>
<option>Medium</option>
<option>High</option>
</select>
Порядок обхода элементов через Tab определяется значением
tabindex.
<select id="hidden-select" tabindex="-1">
<option>One</option>
<option>Two</option>
</select>
Такой элемент:
<select id="status" disabled>
<option>Active</option>
<option>Inactive</option>
</select>
Поведение:
Slim Select поддерживает <optgroup>.
Пример:
<select id="frameworks">
<optgroup label="Frontend">
<option>React</option>
<option>Vue</option>
</optgroup>
<optgroup label="Backend">
<option>Node.js</option>
<option>Laravel</option>
</optgroup>
</select>
При навигации стрелками:
Некоторые версии Slim Select поддерживают дополнительные клавиши навигации.
Home
Переход к первому элементу списка.
End
Переход к последнему элементу.
Если данные загружаются асинхронно:
new SlimSelect({
select: '#users',
events: {
search: async (search, currentData) => {
const response = await fetch('/users?q=' + search)
return response.json()
}
}
})
важно учитывать:
Типичная ошибка:
select.setData(newData)
После полной перерисовки компонент может потерять:
Распространённое решение:
const active = document.activeElement
select.setData(data)
active.focus()
При использовании Slim Select внутри модальных окон возможен конфликт клавиатурных событий.
Пример:
modal.addEventListener('keydown', (event) => {
if (event.key === 'Escape') {
event.stopPropagation()
}
})
Без контроля событий:
Slim Select добавляет ARIA-атрибуты для корректной клавиатурной работы.
Часто используются:
aria-expanded="true"
aria-selected="true"
aria-disabled="false"
role="listbox"
role="option"
Это обеспечивает:
Правильное отображение фокуса критично для клавиатурной навигации.
Пример стилизации:
.ss-main:focus {
border-color: #3b82f6;
box-shadow: 0 0 0 3px rgba(59,130,246,.3);
}
Без визуального выделения:
Slim Select можно активировать вручную.
Пример:
const slim = new SlimSelect({
select: '#countries'
})
slim.select.main.focus()
Открытие списка:
slim.open()
Закрытие:
slim.close()
При большом количестве элементов клавиатурная навигация должна сопровождаться автоматической прокруткой.
Slim Select автоматически:
Пример:
new SlimSelect({
select: '#big-list'
})
для списка из сотен элементов остаётся полностью управляемым с клавиатуры.
При отправке формы клавиатурная навигация должна оставаться предсказуемой.
Пример:
<form>
<input type="text">
<select id="category">
<option>A</option>
<option>B</option>
</select>
<button type="submit">Send</button>
</form>
Стандартный порядок:
Tab → input
Tab → Slim Select
Tab → button
Enter → submit
Иногда требуется отключить стандартное поведение.
Пример:
document.addEventListener('keydown', (event) => {
if (event.key === 'ArrowDown') {
event.preventDefault()
}
})
Использовать глобальный перехват следует осторожно, поскольку он способен:
При тестировании проверяются:
Типичный сценарий тестирования:
Tab
Enter
ArrowDown
ArrowDown
Enter
Tab
Такой набор действий покрывает основную клавиатурную механику компонента.