Мобильное взаимодействие с картой строится вокруг набора жестов: масштабирование двумя пальцами, перетаскивание, двойное касание, инерционное прокручивание и взаимодействие с элементами интерфейса поверх карты. Поведение этих жестов управляется конфигурацией карты и зависит от контекста страницы, уровня вложенности элементов и выбранной стратегии обработки сенсорных событий.
В стандартной конфигурации карты на мобильных устройствах поддерживаются следующие жесты:
Каждый из этих жестов может быть включён, ограничен или полностью отключён через параметры и CSS/DOM-обработчики.
Ключевая настройка управления жестами — gestureHandling.
Она определяет, как карта реагирует на касания и взаимодействие с
прокруткой страницы.
const map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 50.4501, lng: 30.5234 },
zoom: 10,
gestureHandling: "auto"
});
Поведение по умолчанию. Карта сама определяет, когда захватывать жесты:
cooperativeИспользуется в большинстве стандартных сценариев.
Карта перехватывает все жесты пользователя:
Подходит для приложений, где карта — основной интерфейсный элемент.
gestureHandling: "greedy"
Жесты масштабирования и прокрутки разделяются между страницей и картой:
Часто используется в информационных сайтах с текстовым контентом.
gestureHandling: "cooperative"
Полное отключение всех жестов:
gestureHandling: "none"
Помимо gestureHandling, важную роль играют отдельные
настройки карты.
draggable: false
Полностью блокирует перемещение карты пальцем или мышью.
scrollwheel: false
На мобильных напрямую не используется, но влияет на поведение гибридных устройств и браузеров с эмуляцией мыши.
zoomControl: true,
fullscreenControl: false,
mapTypeControl: false
Эти элементы часто заменяют жесты в сценариях с ограниченным взаимодействием.
На мобильных устройствах карта взаимодействует с системой через Touch Events и Pointer Events. Основная сложность заключается в конфликте между прокруткой страницы и обработкой жестов карты.
Современные браузеры используют passive: true для
улучшения производительности прокрутки. Это ограничивает возможность
вызова preventDefault() и влияет на обработку жестов внутри
контейнера карты.
Типичная проблема: карта перехватывает свайп, мешая прокрутке страницы.
Решения:
gestureHandling: cooperativedraggable в текстовых блокахИнтерактивные элементы поверх карты (маршруты, карточки, фильтры) могут блокировать жесты карты.
<div id="map"></div>
<div class="overlay"></div>
Если overlay перекрывает карту и не пропускает события, жесты перестают работать.
.overlay {
pointer-events: none;
}
Либо точечная активация:
.overlay button {
pointer-events: auto;
}
Некоторые сценарии требуют динамического изменения поведения карты.
map.setOptions({ draggable: false });
map.setOptions({ gestureHandling: "greedy" });
function openModal() {
map.setOptions({
gestureHandling: "none",
draggable: false
});
}
Используется режим greedy:
Главный принцип — минимизация препятствий между жестом и реакцией карты.
Используется cooperative:
Основной акцент — сохранение естественного скролла страницы.
Используется none:
При размещении карты внутри:
возникают особенности обработки сенсорных событий.
Если родительский контейнер имеет overflow: scroll,
жесты могут конфликтовать с картой.
Решение:
.map-container {
touch-action: manipulation;
}
При инициализации карты в скрытом блоке (display: none) жесты могут работать некорректно до первого ресайза.
Корректная инициализация:
google.maps.event.trigger(map, "resize");
map.setCenter({ lat: 50.4501, lng: 30.5234 });
Поведение жестов зависит от:
На гибридных устройствах (например, ноутбуки с тачскрином) часто
требуется явное задание gestureHandling, так как
автоопределение может переключаться между режимами.
Жесты напрямую влияют на нагрузку:
touchmoveОптимизация включает: