При разработке интерактивных карт на базе HERE Technologies в JavaScript особое значение приобретает поведение интерфейса на сенсорных устройствах. Тач-взаимодействие отличается высокой плотностью событий, ограниченными вычислительными ресурсами мобильных браузеров и необходимостью минимизировать задержки между жестом пользователя и визуальным откликом карты.
В JavaScript API HERE Maps работа с сенсорным вводом строится вокруг модуля событий карты и слоя поведения (map behavior layer). Ключевую роль играет объект поведения, который инкапсулирует жесты масштабирования, перемещения и вращения.
Основной принцип заключается в том, что все взаимодействия с картой должны проходить через единый слой обработки событий, а не через разрозненные DOM-обработчики.
В типичном сценарии используется связка:
Именно Behavior отвечает за интерпретацию touch-событий в действия карты.
Сенсорные устройства генерируют большое количество событий
touchstart, touchmove, touchend,
которые при прямой обработке могут перегружать главный поток.
Критическим улучшением производительности является применение пассивных обработчиков:
element.addEventListener('touchmove', handler, { passive: true });
Ключевой эффект: браузер не блокирует прокрутку в ожидании завершения обработчика, что снижает задержки при жестах.
В контексте HERE Maps это особенно важно при наложении пользовательских слоёв поверх карты.
Событие touchmove может вызываться десятки раз в
секунду. Без ограничения частоты:
Оптимальный подход — throttle с привязкой к
requestAnimationFrame:
let ticking = false;
function onTouchMove(e) {
if (!ticking) {
window.requestAnimationFrame(() => {
updateInteraction(e);
ticking = false;
});
ticking = true;
}
}
Результат: синхронизация обновлений с рендерным циклом браузера.
В HERE Technologies API жесты управляются через объект поведения карты.
На мобильных устройствах часто требуется ограничение набора жестов для повышения точности взаимодействия с UI-элементами:
const beh * avior = new H.mapevents.Behavior(mapEvents);
// отключение инерционного скролла
behavior.disable(H.mapevents.Behavior.Feature.FLICKING);
Практический эффект: снижение случайных перемещений карты при коротких свайпах.
При наличии интерактивных элементов поверх карты необходимо предотвращать “захват” жеста картой.
Используется CSS:
.overlay-ui {
touch-action: manipulation;
}
или более строго:
.overlay-ui {
touch-action: none;
}
Важно: выбор значения влияет на то, будет ли браузер передавать жест карте или UI-слою.
Pinch-жест является наиболее ресурсоёмким, так как вызывает:
Одним из подходов является ограничение дискретизации zoom-level:
map.getViewModel().addEventListener('sync', () => {
const zoom = map.getZoom();
map.setZoom(Math.round(zoom * 2) / 2);
});
Эффект: уменьшается количество промежуточных состояний масштаба.
Анимации должны опираться на аппаратное ускорение:
Каждый HTML overlay поверх карты увеличивает нагрузку на layout engine.
Рекомендации:
При большом количестве точек:
Это снижает количество touch-target элементов, улучшая отзывчивость интерфейса.
Современные мобильные браузеры поддерживают Pointer Events, которые объединяют мышь, touch и стилус в единый поток событий.
element.addEventListener('pointermove', onMove);
Преимущества:
В контексте карт это позволяет упростить взаимодействие между UI-слоями и картой.
Одной из основных проблем тач-карт является конфликт скролла страницы и перемещения карты.
Контейнер карты должен быть полностью изолирован:
.map-container {
height: 100vh;
overflow: hidden;
position: fixed;
}
Результат: исключается конкуренция между прокруткой страницы и жестами карты.
На тач-устройствах hit-test становится критическим из-за:
Маркерные области должны быть увеличены:
const icon = new H.map.Icon(svgMarkup, {
size: { w: 48, h: 48 }
});
Принцип: фактическая зона взаимодействия должна превышать визуальную.
Для кластеров и полигонов применяется расширенный hit-radius, чтобы облегчить выбор объектов.
Любая логика обработки данных карты должна быть вынесена из UI thread:
При обработке больших наборов геоданных:
переносится в background thread.
Перемещение карты (pan) должно быть максимально плавным.
Нельзя выполнять тяжёлые операции в:
mapviewchangedragstartdragВместо этого используется отложенная обработка:
dragendИнерционные движения (kinetic scrolling) могут перегружать рендер, если одновременно активны:
Оптимальный подход — отключение вторичных обновлений во время инерции и их выполнение после стабилизации положения карты.
Сенсорные устройства ограничены по памяти, поэтому важно:
Особенно критично при работе с долгоживущими SPA-приложениями на базе карт.
В рамках HERE Technologies API оптимизированная сенсорная карта строится на следующих принципах: