Popup в Mapbox GL JS представляет собой всплывающее окно, привязанное к координатам карты или к объектам слоя. Оно используется для отображения дополнительной информации поверх карты без изменения её состояния. Архитектурно Popup является DOM-элементом, управляемым через API библиотеки и интегрированным в систему координат Web Mercator, используемую Mapbox GL JS.
Создание экземпляра Popup выполняется через конструктор:
const popup = new mapboxgl.Popup(options);
Параметр options управляет поведением и внешним видом
окна. Наиболее значимые поля конфигурации:
closeButton — отображение кнопки закрытияcloseOnClick — закрытие при клике по картеcloseOnMove — закрытие при перемещении картыoffset — смещение относительно точки привязкиanchor — автоматическое позиционирование (top, bottom,
left, right и др.)className — пользовательский CSS-классmaxWidth — максимальная ширина окнаfocusAfterOpen — фокусировка после открытияКаждый параметр влияет на взаимодействие Popup с картой и DOM-структурой.
Ключевая операция Popup — закрепление на географической позиции:
popup.setLngLat([longitude, latitude]);
Координаты задаются в формате [lng, lat],
соответствующем стандарту GeoJSON и внутренней системе Mapbox GL JS.
После установки позиции Popup становится геопривязанным элементом,
синхронизированным с трансформацией карты (zoom, pitch, bearing).
Отображение Popup выполняется через привязку к объекту карты:
popup.addTo(map);
Метод addTo интегрирует Popup в слой интерфейса карты,
создавая соответствующий DOM-узел внутри контейнера Mapbox. При этом
Popup не является частью слоя данных — он относится к UI-слою (overlay
layer).
Удаление выполняется методом:
popup.remove();
После удаления DOM-узел уничтожается или деактивируется в зависимости от внутреннего состояния экземпляра.
Popup поддерживает несколько способов задания содержимого.
popup.setHTML("<strong>Точка интереса</strong><br>Описание объекта");
Метод setHTML интерпретирует строку как HTML-разметку и
вставляет её внутрь контейнера Popup. Это наиболее гибкий, но
потенциально рискованный способ из-за возможности инъекций при работе с
внешними данными.
popup.setText("Точка интереса");
setText экранирует HTML-символы и гарантирует безопасный
вывод строки без интерпретации разметки.
const container = document.createElement("div");
container.innerText = "Информация";
popup.setDOMContent(container);
Метод setDOMContent позволяет передать готовый DOM-узел,
обеспечивая полный контроль над структурой и поведением содержимого,
включая вложенные события и компоненты.
Popup автоматически рассчитывает положение относительно координаты и
размеров экрана. Свойство anchor определяет
предпочтительную сторону отображения:
topbottomleftrighttop-lefttop-rightbottom-leftbottom-rightПри использовании anchor: "auto" библиотека
самостоятельно выбирает оптимальное расположение, избегая выхода за
границы viewport.
Дополнительно применяется offset, который может
задаваться числом или массивом:
offset: 10
или
offset: [0, -20]
Смещение позволяет адаптировать Popup под маркеры или сложные визуальные композиции.
Popup может реагировать на изменения состояния карты:
closeOnClick: true — закрытие при клике по картеcloseOnMove: true — закрытие при панорамировании или
масштабированииЭти параметры используются для управления жизненным циклом всплывающих окон в динамических интерфейсах.
Пример сценария:
const popup = new mapboxgl.Popup({
closeOnClick: true,
closeOnMove: false
});
Такое поведение характерно для статических информационных окон.
Наиболее распространённый сценарий — связывание Popup с маркером:
const marker = new mapboxgl.Marker()
.setLngLat([30.5, 50.5])
.setPopup(
new mapboxgl.Popup().setText("Маркер на карте")
)
.addTo(map);
В этом случае Popup автоматически открывается при взаимодействии с маркером. Внутренне Mapbox GL JS синхронизирует события DOM-слоя маркера с состоянием Popup.
Popup не имеет явного метода toggle, но подобная логика
реализуется вручную:
if (popup.isOpen()) {
popup.remove();
} else {
popup.addTo(map);
}
const lngLat = popup.getLngLat();
Возвращает текущие координаты привязки, что важно при динамическом перемещении объектов.
Некоторые реализации используют проверку состояния через внутренние флаги экземпляра или DOM-проверку.
Опция trackPointer позволяет привязать Popup к положению
курсора мыши:
const popup = new mapboxgl.Popup({
trackPointer: true
});
В этом режиме координаты обновляются в реальном времени при движении мыши по карте. Это используется для интерактивных подсказок и hover-информации.
Визуальное оформление контролируется через CSS. Базовая структура включает:
.mapboxgl-popup.mapboxgl-popup-content.mapboxgl-popup-tip.mapboxgl-popup-close-buttonПример переопределения:
.mapboxgl-popup-content {
background: #1e1e1e;
color: #ffffff;
border-radius: 8px;
padding: 12px;
}
Изменение стилей позволяет интегрировать Popup в дизайн интерфейса без ограничения стандартной темы.
Popup проходит несколько стадий:
setLngLataddToremoveКаждый этап синхронизирован с внутренним event-loop Mapbox GL JS и системой рендеринга WebGL-карты.
Popup не является частью WebGL-слоя и не рендерится через GPU. Он накладывается поверх canvas как HTML-элемент, что определяет ряд особенностей:
Эти особенности влияют на архитектуру интерфейсов с большим количеством интерактивных точек.