Popup в Leaflet представляет собой всплывающее окно, привязанное к карте или конкретному слою (маркеру, линии, полигону). Логика его отображения включает не только координаты привязки, но и набор параметров, влияющих на смещение, автоматическое перемещение карты, ограничения видимой области и поведение при выходе за границы экрана.
Popup в Leaflet связывается с географической точкой
(LatLng) или слоем (Layer). После открытия он
вычисляет пиксельную позицию относительно контейнера карты и размещается
в соответствии с внутренним алгоритмом проекции.
Ключевой момент заключается в том, что позиция popup определяется не только координатой привязки, но и набором смещений и правил автоцентрирования.
Параметр offset задаёт сдвиг popup в пикселях
относительно его географической привязки.
L.popup({
offset: L.point(10, -20)
})
.setLatLng([55.75, 37.61])
.openOn(map);
L.point(x, y)x — горизонтальное смещение (вправо положительное)y — вертикальное смещение (вниз положительное)Частый сценарий применения — корректировка положения popup над маркером, чтобы хвостик (tip) не перекрывал сам маркер.
Параметр autoPan управляет поведением карты при открытии
popup, если он выходит за пределы видимой области.
L.popup({
autoPan: true
})
.setLatLng([55.75, 37.61])
.openOn(map);
true)autoPanPadding определяет внутренние отступы между popup
и краями карты при автоматическом смещении.
L.popup({
autoPanPadding: L.point(50, 50)
})
Более точная настройка поведения автоцентрации реализуется через раздельные параметры:
L.popup({
autoPanPaddingTopLeft: L.point(40, 80),
autoPanPaddingBottomRight: L.point(40, 40)
})
autoPanPaddingTopLeft — отступ сверху и слеваautoPanPaddingBottomRight — отступ снизу и справаИспользуется при асимметричных интерфейсах:
Параметр keepInView заставляет Leaflet постоянно
удерживать popup в пределах видимой области карты.
L.popup({
keepInView: true
})
autoPan срабатывает только при открытииkeepInView отслеживает перемещение карты в реальном
времениХотя эти параметры относятся к размеру popup, они напрямую влияют на позиционирование.
L.popup({
maxWidth: 300,
minWidth: 150
})
Параметр className позволяет влиять на визуальное
позиционирование через CSS.
L.popup({
className: 'custom-popup'
})
Пример CSS:
.custom-popup .leaflet-popup-content-wrapper {
transform: translateY(-5px);
}
transformPopup размещается в специальной панели карты (pane). Это
влияет на порядок наложения элементов.
L.popup({
pane: 'popupPane'
})
Хотя кнопка закрытия не является параметром позиционирования напрямую, она изменяет внутреннюю геометрию popup.
L.popup({
closeButton: false
})
Эти параметры управляют поведением popup относительно пользовательских действий.
L.popup({
closeOnClick: true,
closeOnEscapeKey: true
})
При использовании:
marker.bindPopup('Текст');
Leaflet автоматически вычисляет anchor — точку привязки popup к иконке маркера.
iconSizeiconAnchorПозиция popup формируется как многоступенчатая система:
LatLng)Любое изменение одного параметра может привести к перерасчёту всей цепочки позиционирования.
При изменении состояния карты:
popup пересчитывает позицию заново.
Особенности:
Наиболее устойчивые конфигурации обычно используют комбинацию:
offset для точной привязки к маркеруautoPanPadding для визуального комфортаkeepInView для интерактивных сценариевmaxWidth для предсказуемой геометрииТакая комбинация минимизирует скачки интерфейса при открытии и перемещении карты.