Класс Popup в MapLibre GL JS представляет собой
инструмент для отображения всплывающих информационных окон, привязанных
к координатам карты или к экранным событиям. Popup используется для
отображения краткой информации о геообъектах, точках интереса,
результатах взаимодействия с картой и динамически формируемых
данных.
Popup строится поверх карты в отдельном DOM-слое и синхронизируется с координатами через проекцию географических значений в экранные пиксели.
Экземпляр Popup создаётся через конструктор:
import maplibregl from "maplibre-gl";
const popup = new maplibregl.Popup();
При создании можно передать объект конфигурации, определяющий поведение и внешний вид всплывающего окна:
const popup = new maplibregl.Popup({
closeButton: true,
closeOnClick: true,
closeOnMove: false,
offset: 10,
maxWidth: "300px",
className: "custom-popup"
});
closeButton Управляет отображением кнопки закрытия.
true — кнопка отображаетсяfalse — скрытаcloseOnClick Определяет закрытие popup при клике по карте.
true — закрывается при любом клике по картеfalse — остаётся открытымcloseOnMove Закрывает popup при изменении положения карты (pan, zoom, rotate).
offset Смещение popup относительно точки привязки.
Поддерживает:
offset: {
top: [0, 10],
bottom: [0, -10],
left: [10, 0],
right: [-10, 0]
}
maxWidth Ограничивает ширину контейнера popup.
maxWidth: "240px"
className Добавляет пользовательский CSS-класс к корневому элементу popup.
Popup не отображается сам по себе. Для отображения он должен быть добавлен на карту и привязан к координатам.
popup
.setLngLat([37.6173, 55.7558])
.setHTML("<strong>Москва</strong>")
.addTo(map);
Метод addTo(map) регистрирует popup в DOM карты и
запускает его рендеринг.
Определяет географическую позицию popup:
popup.setLngLat([longitude, latitude]);
При изменении координат popup автоматически пересчитывает позицию на экране.
Устанавливает HTML-содержимое:
popup.setHTML(`
<div>
<h3>Объект</h3>
<p>Описание точки интереса</p>
</div>
`);
HTML вставляется напрямую в DOM без дополнительной обработки, что требует контроля за безопасностью данных.
Устанавливает текстовое содержимое без HTML-разметки:
popup.setText("Простой текстовый заголовок");
Используется для безопасного вывода данных.
Позволяет передать готовый DOM-элемент:
const container = document.createElement("div");
container.innerHTML = "<b>Динамический блок</b>";
popup.setDOMContent(container);
Подходит для сложной логики рендера, включая интеграцию с фреймворками.
Добавляет popup на карту:
popup.addTo(map);
Без вызова addTo popup остаётся неактивным.
Удаляет popup из карты:
popup.remove();
Используется при ручном управлении состоянием или очистке интерфейса.
Проверка состояния:
popup.isOpen();
Возвращает true, если popup отображается.
Popup часто используется совместно с маркерами:
const marker = new maplibregl.Marker()
.setLngLat([37.6173, 55.7558])
.setPopup(
new maplibregl.Popup().setText("Маркер в Москве")
)
.addTo(map);
При клике на маркер popup открывается автоматически.
Popup реагирует на события карты через внутреннюю систему пересчёта координат:
При включённом closeOnMove любое движение карты приводит
к удалению popup.
Popup автоматически выбирает положение относительно точки, но может быть явно задано:
const popup = new maplibregl.Popup({
anchor: "top"
});
Возможные значения anchor:
topbottomleftrighttop-lefttop-rightbottom-leftbottom-rightAnchor влияет на направление «хвоста» popup и его смещение.
Offset играет ключевую роль в UX при плотных интерфейсах.
Пример комбинированной настройки:
const popup = new maplibregl.Popup({
offset: {
bottom: [0, -20],
top: [0, 20]
}
});
Такая конфигурация позволяет избегать перекрытия маркеров и UI-элементов карты.
Popup можно обновлять без пересоздания:
popup.setHTML(`<div>Загрузка...</div>`);
fetch("/api/info")
.then(res => res.json())
.then(data => {
popup.setHTML(`<div>${data.title}</div>`);
});
Этот подход применяется для асинхронных данных и API-интеграций.
Так как содержимое popup — это DOM, возможна регистрация событий:
popup.setHTML(`
<button id="btn">Нажать</button>
`);
document.addEventListener("click", (e) => {
if (e.target && e.target.id === "btn") {
console.log("Клик внутри popup");
}
});
В более строгих архитектурах обработчики привязываются через
setDOMContent.
MapLibre GL JS не ограничивает количество popup, однако:
Пример паттерна переиспользования:
const popup = new maplibregl.Popup();
map.on("click", (e) => {
popup
.setLngLat(e.lngLat)
.setHTML("Данные точки")
.addTo(map);
});
Popup имеет стандартную структуру DOM:
.maplibregl-popup.maplibregl-popup-content.maplibregl-popup-tip.maplibregl-popup-close-buttonПереопределение стилей:
.maplibregl-popup-content {
background: #1e1e1e;
color: white;
border-radius: 6px;
}
.maplibregl-popup-tip {
border-top-color: #1e1e1e;
}
Popup влияет на производительность через:
Оптимизационные практики:
setText вместо setHTML для
простых случаевПри вызове:
map.remove();
все связанные popup автоматически удаляются, включая DOM-узлы и обработчики событий, что предотвращает утечки памяти.