При создании экземпляра карты Mapbox GL JS автоматически подключает набор обработчиков пользовательского взаимодействия. Они отвечают за масштабирование колесом мыши, перемещение карты перетаскиванием, вращение, изменение наклона, масштабирование двойным щелчком и другие действия.
По умолчанию карта максимально интерактивна. Однако во многих проектах возникает необходимость ограничить или полностью отключить отдельные способы взаимодействия:
Каждый встроенный обработчик может быть отключён независимо от остальных.
Экземпляр объекта Map содержит несколько встроенных
обработчиков.
| Обработчик | Назначение |
|---|---|
scrollZoom |
Масштабирование колесом мыши |
boxZoom |
Масштабирование выделением области |
dragRotate |
Вращение карты правой кнопкой мыши |
dragPan |
Перемещение карты перетаскиванием |
keyboard |
Управление с клавиатуры |
doubleClickZoom |
Масштабирование двойным щелчком |
touchZoomRotate |
Масштабирование и вращение жестами |
touchPitch |
Изменение наклона карты жестами |
Каждый обработчик предоставляет методы:
enable()
disable()
isEnabled()
Масштабирование колесом является одним из наиболее часто используемых способов навигации. В некоторых интерфейсах оно вызывает проблемы, поскольку пользователь может случайно изменять масштаб при прокрутке страницы.
Отключение выполняется следующим образом:
map.scrollZoom.disable();
Проверка состояния:
console.log(map.scrollZoom.isEnabled());
Повторное включение:
map.scrollZoom.enable();
После отключения колесо мыши продолжит прокручивать страницу, но не будет влиять на карту.
Перетаскивание карты отвечает за изменение её центра посредством удержания левой кнопки мыши.
Отключение:
map.dragPan.disable();
Включение:
map.dragPan.enable();
После отключения пользователь не сможет перемещать карту мышью или пальцем.
Такой подход часто применяется в информационных виджетах, где карта служит лишь визуальным элементом.
По умолчанию двойной щелчок увеличивает масштаб карты.
Для отключения:
map.doubleClickZoom.disable();
Для повторного включения:
map.doubleClickZoom.enable();
Это особенно полезно в интерфейсах, где двойной щелчок используется для выполнения других действий.
Mapbox GL JS поддерживает вращение карты вокруг вертикальной оси.
Отключение:
map.dragRotate.disable();
Включение:
map.dragRotate.enable();
После отключения карта сохраняет текущий угол поворота, но пользователь больше не сможет его изменять.
Если требуется вернуть северное направление:
map.resetNorth();
Обработчик boxZoom позволяет удерживать клавишу Shift и
выделять прямоугольную область для быстрого приближения.
Отключение:
map.boxZoom.disable();
Включение:
map.boxZoom.enable();
Функция редко используется обычными пользователями, поэтому её отключение практически не влияет на удобство работы.
Mapbox GL JS поддерживает управление клавишами:
+ и - для изменения масштаба;Полное отключение:
map.keyboard.disable();
Повторное включение:
map.keyboard.enable();
Данная возможность полезна при разработке специализированных интерфейсов, где клавиатура используется для других задач.
На мобильных устройствах активно используется обработчик
touchZoomRotate.
Он отвечает за:
Отключение:
map.touchZoomRotate.disable();
Включение:
map.touchZoomRotate.enable();
После отключения жесты масштабирования перестают работать.
Иногда требуется сохранить масштабирование, но запретить вращение.
Для этого существует специальный метод:
map.touchZoomRotate.disableRotation();
Теперь карта будет реагировать на масштабирование, но не на вращение.
Возврат стандартного поведения:
map.touchZoomRotate.enableRotation();
Подобная настройка широко применяется в мобильных приложениях и веб-картах, где вращение зачастую только усложняет навигацию.
В версиях библиотеки, поддерживающих отдельный обработчик наклона,
используется объект touchPitch.
Отключение:
map.touchPitch.disable();
Включение:
map.touchPitch.enable();
После отключения пользователь не сможет изменять угол обзора карты жестами.
Для создания полностью статичной карты можно отключить все стандартные обработчики одновременно.
map.scrollZoom.disable();
map.boxZoom.disable();
map.dragRotate.disable();
map.dragPan.disable();
map.keyboard.disable();
map.doubleClickZoom.disable();
map.touchZoomRotate.disable();
map.touchPitch.disable();
В результате карта будет отображаться, но пользователь не сможет изменять её состояние.
Распространённый сценарий — информационная карта, на которой разрешено только перемещение.
Например, можно запретить масштабирование и вращение:
map.scrollZoom.disable();
map.doubleClickZoom.disable();
map.touchZoomRotate.disable();
map.dragRotate.disable();
При этом пользователь сможет перемещать карту:
map.dragPan.enable();
Такой режим обеспечивает контролируемое взаимодействие без риска потерять нужный масштаб.
Обработчики можно изменять в любой момент после создания карты.
Например, переключение режима редактирования:
function enableEditing() {
map.dragPan.enable();
map.scrollZoom.enable();
}
function disableEditing() {
map.dragPan.disable();
map.scrollZoom.disable();
}
Вызов функций может зависеть от роли пользователя, текущего режима интерфейса или состояния приложения.
Каждый обработчик предоставляет метод isEnabled().
Пример:
if (map.scrollZoom.isEnabled()) {
console.log('Масштабирование активно');
}
Проверка позволяет избежать повторного вызова методов и строить более сложную логику управления.
Некоторые параметры можно задавать ещё на этапе инициализации карты.
Пример:
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v12',
center: [37.6176, 55.7558],
zoom: 10,
dragPan: false,
scrollZoom: false,
doubleClickZoom: false
});
Такой подход предотвращает даже кратковременную активацию обработчиков после загрузки карты.
interactive: falseДля полного отключения взаимодействия существует специальная настройка:
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/streets-v12',
interactive: false
});
В этом режиме:
Например, масштаб можно изменять из кода:
map.setZoom(8);
Даже при отключённой интерактивности методы объекта Map
продолжают работать.
interactive: falseЕсли карта была создана как неинтерактивная, необходимые обработчики можно включить вручную.
map.dragPan.enable();
map.scrollZoom.enable();
Таким образом можно сформировать собственный набор разрешённых действий.
Следующий пример создаёт карту, на которой разрешено только перемещение без вращения и изменения масштаба:
const map = new mapboxgl.Map({
container: 'map',
style: 'mapbox://styles/mapbox/light-v11',
center: [30.3158, 59.9398],
zoom: 12
});
map.scrollZoom.disable();
map.doubleClickZoom.disable();
map.boxZoom.disable();
map.dragRotate.disable();
map.touchZoomRotate.disable();
Пользователь сможет перемещать карту, сохраняя фиксированный масштаб и ориентацию.
interactive: false
Карта используется исключительно как визуальный элемент.
map.scrollZoom.disable();
Исключается случайное изменение масштаба при прокрутке.
map.touchZoomRotate.disableRotation();
Сохраняется привычная навигация без потери ориентации.
map.dragPan.disable();
map.scrollZoom.disable();
map.keyboard.disable();
Положение карты контролируется только программно.
map.dragPan.disable();
Используется во время рисования объектов или редактирования геометрии.
Несколько важных моментов:
Гибкая система обработчиков Mapbox GL JS позволяет точно контролировать способы взаимодействия с картой и создавать интерфейсы с любым уровнем интерактивности — от полностью статичных представлений до сложных геоинформационных приложений с собственными механизмами навигации.