Popup представляет собой всплывающий интерфейсный слой, привязанный к
координате карты или к DOM-объекту. Он используется для отображения
контекстной информации о геообъектах без перехода к отдельным страницам
или панелям интерфейса. В архитектуре MapLibre GL JS popup является
частью API Popup, который интегрируется с картой через
WebGL-рендеринг и DOM-оверлеи.
Основная модель popup основана на привязке к географической точке
(LngLat) и динамическом формировании содержимого через HTML
или DOM-элементы.
Создание popup выполняется через конструктор
maplibregl.Popup, возвращающий экземпляр всплывающего
окна.
const popup = new maplibregl.Popup();
По умолчанию popup создаётся без координат и содержимого. Для отображения требуется задать позицию и контент.
Popup отображается на карте через метод setLngLat,
принимающий массив координат [longitude, latitude].
const popup = new maplibregl.Popup()
.setLngLat([37.6173, 55.7558])
.setHTML("<h3>Москва</h3><p>Столица</p>")
.addTo(map);
Ключевые особенности:
[lng, lat]Метод setHTML задаёт содержимое в виде строки HTML.
popup.setHTML(`
<div>
<strong>Объект</strong>
<p>Описание объекта на карте</p>
</div>
`);
Особенности:
Метод setDOMContent позволяет использовать уже созданный
DOM-узел.
const container = document.createElement("div");
container.className = "popup-content";
container.innerText = "Динамический контент";
popup.setDOMContent(container);
Преимущества:
Popup часто используется совместно с маркерами.
const popup = new maplibregl.Popup({ offset: 25 })
.setHTML("Маркер");
const marker = new maplibregl.Marker()
.setLngLat([37.6173, 55.7558])
.setPopup(popup)
.addTo(map);
Поведение:
Конструктор принимает объект настроек:
const popup = new maplibregl.Popup({
closeButton: true,
closeOnClick: false,
maxWidth: "300px",
anchor: "top"
});
Управляет отображением кнопки закрытия.
true — кнопка отображаетсяfalse — отключенаОпределяет закрытие popup при клике на карту.
true — закрывается при клике вне popupfalse — остаётся открытымОграничивает ширину содержимого.
200px, 20em,
none)Определяет точку привязки popup относительно координаты.
Возможные значения:
topbottomleftrighttop-lefttop-rightbottom-leftbottom-rightpopup.addTo(map);
popup.remove();
или
popup.isOpen();
Проверка состояния позволяет управлять логикой интерфейса при множественных popup.
Popup часто создаётся на основе клика по слоям карты.
map.on("click", "cities-layer", (e) => {
const feature = e.features[0];
new maplibregl.Popup()
.setLngLat(feature.geometry.coordinates)
.setHTML(`<strong>${feature.properties.name}</strong>`)
.addTo(map);
});
Особенности работы:
e.features содержит данные из vector tile слояqueryRenderedFeaturesДля более гибкой логики popup формируется на основе запроса к рендеру:
map.on("click", (e) => {
const features = map.queryRenderedFeatures(e.point, {
layers: ["cities-layer"]
});
if (!features.length) return;
const feature = features[0];
new maplibregl.Popup()
.setLngLat(feature.geometry.coordinates)
.setHTML(feature.properties.name)
.addTo(map);
});
Механика:
Параметр offset управляет смещением относительно точки
привязки.
const popup = new maplibregl.Popup({
offset: [0, -10]
});
Варианты:
Popup может следовать за курсором при движении мыши:
const popup = new maplibregl.Popup({
closeButton: false,
closeOnClick: false
});
map.on("mousemove", (e) => {
popup
.setLngLat(e.lngLat)
.setHTML(`x: ${e.lngLat.lng}, y: ${e.lngLat.lat}`)
.addTo(map);
});
Поведение:
Визуальное оформление управляется через CSS классы MapLibre:
.maplibregl-popup.maplibregl-popup-content.maplibregl-popup-tipПример кастомизации:
.maplibregl-popup-content {
background-color: #1e1e1e;
color: #fff;
border-radius: 6px;
padding: 10px;
}
.maplibregl-popup-tip {
border-top-color: #1e1e1e;
}
При создании нескольких popup требуется контроль перекрытий:
let activePopup = null;
map.on("click", (e) => {
if (activePopup) activePopup.remove();
activePopup = new maplibregl.Popup()
.setLngLat(e.lngLat)
.setHTML("Новый popup")
.addTo(map);
});
Логика:
Popup поддерживает события DOM:
const container = document.createElement("div");
const button = document.createElement("button");
button.textContent = "Действие";
button.addEventListener("click", () => {
console.log("click inside popup");
});
container.appendChild(button);
const popup = new maplibregl.Popup()
.setLngLat([37.6, 55.7])
.setDOMContent(container)
.addTo(map);
Особенности:
Popup автоматически синхронизируется с состоянием карты:
Если координата выходит за пределы viewport, popup может быть скрыт или смещён в зависимости от anchor-логики.
Popup может управляться глобально через карту:
map.closePopup();
или через хранение ссылок на экземпляры.
Модель управления: