Клавиатурная навигация в MapLibre GL JS представляет собой встроенный механизм взаимодействия с картой без использования мыши или сенсорного ввода. Она реализуется через набор обработчиков событий клавиатуры, интегрированных в систему управления картой и тесно связанных с состоянием canvas и интерактивными контроллерами.
Поведение клавиатуры по умолчанию ориентировано на доступность и соответствует типовым паттернам веб-картографических интерфейсов: перемещение карты, изменение масштаба и (при включённых соответствующих режимах) управление поворотом.
В MapLibre GL JS клавиатурная навигация контролируется через опцию и внутренний обработчик событий.
При инициализации карты используется параметр:
const map = new maplibregl.Map({
container: 'map',
style: 'https://demotiles.maplibre.org/style.json',
center: [30.3, 59.9],
zoom: 10,
keyboard: true
});
Значение keyboard: true включает обработку клавиш,
false полностью отключает её. При отключении карта
перестаёт реагировать на стрелки, клавиши масштабирования и другие
встроенные комбинации.
Стандартная модель управления предполагает следующие действия:
Клавиши-стрелки изменяют центр карты:
Скорость смещения зависит от текущего масштаба: чем ближе масштаб, тем меньше шаг перемещения.
Клавиши управления масштабом:
+ / = — увеличение масштаба- — уменьшение масштабаМасштабирование выполняется плавно, с анимацией, аналогично жесту колесика мыши или pinch-to-zoom.
Если активированы соответствующие возможности камеры:
Эти действия зависят от конфигурации dragRotate и
поддержки pitch/rotation в стиле.
Клавиатурная навигация невозможна без корректного фокуса
DOM-элемента. В MapLibre GL JS canvas автоматически получает
tabindex, что позволяет переводить фокус на карту через
клавишу Tab.
Внутренняя структура включает контейнер:
map.getContainer() — внешний divmap.getCanvas() — canvas-элемент рендеринга WebGLПри потере фокуса клавиатурные события перестают обрабатываться, даже
если keyboard: true.
Ключевая особенность обработки клавиатуры заключается в том, что карта должна «уступать» ввод в элементы интерфейса.
Типичное поведение:
<input>,
<textarea> или любом editable-элементе — обработка
клавиш картой отключается автоматическиЭто предотвращает конфликт между вводом текста и управлением картой.
Внутри MapLibre GL JS клавиатурная логика реализована через
KeyboardHandler, который является частью системы
handlers.
Он отвечает за:
keydownpanBy,
zoomIn, zoomOut, easeTo)Обработчик привязывается к карте при создании и может быть отключён через API:
map.keyboard.disable();
или включён обратно:
map.keyboard.enable();
Хотя базовая логика встроена, карта предоставляет доступ к низкоуровневым событиям DOM.
Пример перехвата нажатий:
map.getCanvas().addEventListener('keydown', (e) => {
if (e.key === 'r') {
map.resetNorth();
}
});
В этом случае кастомная логика дополняет стандартную систему, но требует аккуратного управления:
e.preventDefault() может блокировать
встроенные действияКлючевые проблемные сценарии возникают при совмещении карты с интерфейсными компонентами:
Если веб-приложение использует глобальные сочетания клавиш, они могут конфликтовать с картой.
Решение:
document.activeElementПри наличии панели поиска или фильтров карта должна игнорировать клавиши:
keyboard.enable()/disable()Клавиатурная навигация в MapLibre GL JS тесно связана с доступностью интерфейса.
Реализация включает:
Canvas сам по себе не семантический элемент, поэтому важную роль играет контейнер карты, которому назначаются атрибуты доступности:
role="region"aria-labeltabindex="0"В некоторых приложениях требуется изменение стандартной схемы управления.
Типовые подходы:
map.getCanvas().addEventListener('keydown', (e) => {
if (e.key === 'ArrowUp') {
e.preventDefault();
map.panBy([0, -100]);
}
});
Можно фильтровать поведение внутри собственного слоя управления:
+/-При сложных интерфейсах клавиатурная навигация карты полностью заменяется кастомной системой управления:
map.keyboard.disable();
Далее управление реализуется через внешние hotkeys-библиотеки.
Клавиатурные события генерируются с высокой частотой при удержании клавиши. Внутренняя реализация MapLibre оптимизирует:
Это предотвращает перегрузку render loop WebGL и сохраняет стабильную частоту кадров даже при длительном удержании клавиш.
Несмотря на ориентированность на десктоп:
В результате поведение клавиатурной навигации всегда зависит от контекста окружения, а не только от самой библиотеки.
Любое клавиатурное действие транслируется в операции над камерой:
Таким образом, клавиатура не является отдельным слоем управления, а лишь альтернативным источником команд для единой камеры отображения.