В Leaflet tooltip представляет собой всплывающий текстовый слой, привязанный к географическому объекту (маркеру, полигону, линии) или координате. Tooltip отличается от popup тем, что чаще используется для краткой контекстной информации и может быть привязан к событиям наведения или постоянному отображению.
Механика tooltip в Leaflet строится вокруг метода
bindTooltip, который закрепляет подсказку за слоем карты и
управляет её жизненным циклом через внутренний слой
Tooltip.
Tooltip создаётся через привязку к объекту слоя:
marker.bindTooltip("Точка интереса");
После этого tooltip появляется при наведении мыши (поведение по умолчанию зависит от платформы и типа устройства).
Эквивалентная запись с настройками:
marker.bindTooltip("Точка интереса", {
direction: "top",
offset: [0, -10],
opacity: 0.9
});
direction — направление отображения относительно
объекта:
topbottomleftrightcenterautooffset — смещение относительно точки
привязки
opacity — прозрачность
className — CSS-класс для стилизации
interactive — возможность взаимодействия с
tooltip
Tooltip в Leaflet делятся на два основных режима поведения:
Временный tooltip появляется при наведении курсора или при событии
mouseover, и исчезает при mouseout.
Пример:
marker.bindTooltip("Временная подсказка");
Поведение:
Постоянный tooltip отображается всегда, независимо от событий мыши. Он закреплён за объектом и ведёт себя как статическая подпись.
marker.bindTooltip("Постоянная подпись", {
permanent: true
});
Tooltip можно контролировать программно:
marker.openTooltip();
marker.closeTooltip();
Если tooltip привязан, но не отображается, его можно принудительно открыть:
marker.openTooltip();
И закрыть вручную:
marker.closeTooltip();
Опция sticky изменяет поведение временного tooltip: он
начинает следовать за курсором внутри слоя.
marker.bindTooltip("Следует за курсором", {
sticky: true
});
Tooltip часто применяется к слоям GeoJSON:
L.geoJSON(data, {
onEachFeature: function (feature, layer) {
layer.bindTooltip(feature.properties.name);
}
}).addTo(map);
При работе с GeoJSON tooltip обычно формируется динамически из свойств объекта.
Содержимое tooltip можно менять без повторного bind:
marker.setTooltipContent("Новое значение");
Также возможно обновление через повторный bind:
marker.bindTooltip("Обновлённый текст");
Первый вариант предпочтительнее, так как не пересоздаёт слой.
Leaflet позволяет управлять поведением tooltip через события:
marker.on("mouseover", function () {
this.openTooltip();
});
marker.on("mouseout", function () {
this.closeTooltip();
});
Это полезно при создании кастомных сценариев отображения.
При включении interactive: true tooltip начинает
реагировать на события мыши.
marker.bindTooltip("Интерактивный tooltip", {
interactive: true
});
Пример HTML tooltip:
marker.bindTooltip(`
<div>
<b>Объект</b><br>
<button oncl ick="alert('click')">Действие</button>
</div>
`, {
interactive: true
});
Tooltip можно стилизовать через класс className:
marker.bindTooltip("Стилизованный tooltip", {
className: "custom-tooltip"
});
CSS:
.custom-tooltip {
background: #1e1e1e;
color: #fff;
border-radius: 6px;
padding: 6px 10px;
font-size: 12px;
}
Также можно переопределить стандартные классы Leaflet:
.leaflet-tooltip.leaflet-tooltip-top.leaflet-tooltip-bottomTooltip автоматически пересчитывает позицию при:
Однако при частом обновлении данных важно учитывать производительность:
При работе с множеством объектов применяется стратегия условного отображения:
if (map.getZoom() > 12) {
layer.bindTooltip(feature.name, { permanent: true });
} else {
layer.unbindTooltip();
}
Такой подход снижает визуальный шум и нагрузку на DOM.
Tooltip можно полностью отвязать:
marker.unbindTooltip();
После этого слой перестаёт хранить tooltip и освобождает ресурсы.
На сенсорных устройствах hover отсутствует, поэтому Leaflet адаптирует поведение:
Tooltip в Leaflet реализован как отдельный DOM-элемент, который:
closeTooltip и
unbindTooltipКаждый tooltip связан с конкретным Layer, но рендерится
в общем контейнере карты (mapPane), что обеспечивает
синхронизацию всех слоёв.
Tooltip часто используется совместно с popup:
marker.bindTooltip("Кратко");
marker.bindPopup("Подробная информация");
Типичный сценарий:
При этом popup имеет более высокий z-index и блокирует взаимодействие с картой при открытии.
Tooltip тесно связан с параметрами слоя:
riseOnHover влияет на перекрытие tooltipopacity tooltip не зависит от opacity слояpane может менять порядок отображенияВ больших картах tooltip используется с ограничениями:
Эти ограничения позволяют сохранять стабильную производительность при тысячах объектов на карте.