DOM-структура Leaflet строится вокруг заранее определённого набора CSS-классов и нескольких ключевых идентификаторов контейнеров, через которые библиотека управляет визуализацией карты, слоями и интерактивными элементами. Понимание системы классов и идентификаторов критично для кастомизации интерфейса, стилизации элементов и интеграции карты в сложные веб-приложения.
Инициализация карты всегда привязывается к DOM-элементу, который становится корневым контейнером Leaflet:
const map = L.map('map');
В этом случае строка 'map' соответствует id
HTML-элемента:
<div id="map"></div>
Leaflet использует этот id исключительно как точку
привязки. После инициализации контейнер получает дополнительные классы,
которые формируют базовую структуру отображения:
leaflet-container — основной класс картыleaflet-touch — добавляется на сенсорных
устройствахleaflet-fade-anim, leaflet-grab,
leaflet-dragging — динамические классы состоянияИдентификатор (id) остаётся неизменным и используется
только для получения ссылки на контейнер, тогда как классы управляют
внешним видом и поведением.
После создания карты Leaflet формирует вложенную структуру элементов:
div.leaflet-container
├── div.leaflet-pane
├── div.leaflet-pane
├── div.leaflet-control-container
└── div.leaflet-shadow-pane (и другие слои)
Каждый элемент в этой структуре имеет строго определённую роль и класс.
Система panes — основа визуального порядка слоёв карты. Все объекты (тайлы, маркеры, попапы) размещаются внутри отдельных контейнеров:
leaflet-map-pane — общий контейнер трансформацийleaflet-tile-pane — слой тайловleaflet-overlay-pane — векторные слои (GeoJSON,
polyline, polygon)leaflet-shadow-pane — тени маркеровleaflet-marker-pane — маркерыleaflet-tooltip-pane — подсказкиleaflet-popup-pane — всплывающие окнаКаждый pane имеет собственный z-index, что определяет
порядок наложения элементов. Например, маркеры всегда находятся выше
тайлов, а popups — выше маркеров.
.leaflet-marker-pane {
z-index: 600;
}
.leaflet-popup-pane {
z-index: 700;
}
Изменение этих классов напрямую влияет на визуальную иерархию карты.
Тайлы создаются внутри leaflet-tile-pane и получают
класс:
leaflet-tile — каждый тайловый элементleaflet-tile-loaded — загруженный тайлleaflet-fade-anim — анимация появленияCSS управление тайлами позволяет влиять на визуальное качество загрузки:
.leaflet-tile {
filter: contrast(1.1) saturate(1.2);
}
Маркеры используют класс leaflet-marker-icon и
leaflet-marker-shadow. Однако ключевую роль играет
DivIcon, который позволяет задавать пользовательские
классы:
const icon = L.divIcon({
className: 'custom-marker'
});
В DOM это преобразуется в:
<div class="leaflet-marker-icon custom-marker"></div>
Таким образом, className в DivIcon
становится основным механизмом стилизации кастомных маркеров.
Типичные классы маркеров:
leaflet-div-iconleaflet-interactiveclassNameВекторные объекты (Polyline, Polygon, Circle) используют SVG-элементы
внутри leaflet-overlay-pane. Для них применяется параметр
className:
L.polyline(latlngs, {
className: 'route-line'
});
В DOM это становится:
<path class="leaflet-interactive route-line"></path>
Базовые классы:
leaflet-interactive — включает обработку событий
мышиleaflet-clickable — устаревший, но встречающийся в
некоторых версияхSVG-структура позволяет использовать сложные селекторы:
.route-line {
stroke: red;
stroke-width: 3;
}
Попапы и тултипы формируют отдельные DOM-узлы внутри своих pane:
Попап:
leaflet-popupleaflet-zoom-animatedleaflet-popup-content-wrapperleaflet-popup-contentТултип:
leaflet-tooltipleaflet-tooltip-top,
leaflet-tooltip-bottom и т.д.Пример структуры попапа:
<div class="leaflet-popup">
<div class="leaflet-popup-content-wrapper">
<div class="leaflet-popup-content"></div>
</div>
</div>
Кастомизация осуществляется через переопределение классов:
.leaflet-popup-content-wrapper {
background: #1e1e1e;
color: #fff;
border-radius: 8px;
}
UI-элементы управления картой используют систему классов
leaflet-control:
leaflet-controlleaflet-barleaflet-control-zoomleaflet-control-attributionleaflet-control-layersСтруктура zoom-контрола:
<div class="leaflet-control-zoom leaflet-bar leaflet-control">
<a class="leaflet-control-zoom-in"></a>
<a class="leaflet-control-zoom-out"></a>
</div>
CSS-иерархия контролов позволяет унифицировать внешний вид всех элементов управления:
.leaflet-bar a {
background-color: #333;
color: #fff;
}
Leaflet предоставляет возможность задавать классы на уровне слоя:
const geojson = L.geoJSON(data, {
className: 'geo-layer'
});
Это особенно важно для массовой стилизации объектов через CSS, без необходимости обработки каждого элемента отдельно.
Каждый объект карты предоставляет доступ к корневому DOM-элементу:
map.getContainer();
Контейнер всегда содержит класс:
leaflet-containerПрямое использование идентификатора и класса позволяет строить глобальные стили:
#map {
height: 500px;
}
.leaflet-container {
background: #000;
}
При создании нескольких карт каждый контейнер должен иметь уникальный
id:
<div id="map1"></div>
<div id="map2"></div>
L.map('map1');
L.map('map2');
Leaflet не генерирует новые id, поэтому управление
множественными экземплярами полностью зависит от структуры DOM.
Leaflet позволяет создавать собственные panes:
map.createPane('customPane');
После создания автоматически формируется класс:
leaflet-pane leaflet-customPane-paneСтилизация:
.leaflet-customPane-pane {
z-index: 650;
}
Это ключевой механизм управления порядком отображения без вмешательства в стандартные слои.
Leaflet использует предсказуемый префикс leaflet- для
всех системных классов, что снижает риск конфликтов. Однако при создании
пользовательских классов требуется избегать пересечения:
app-,
map-, geo-)leaflet-container, если не
требуется глобальная темаПример безопасного расширения:
.geo-highlight {
fill: yellow;
opacity: 0.6;
}
DOM-события Leaflet часто завязаны на класс
leaflet-interactive. Элементы без него не реагируют на
pointer-события.
L.circle([50, 30], {
className: 'clickable-circle'
});
Если элемент не получает leaflet-interactive, он
остаётся визуальным, но не интерактивным.
Каждый pane имеет фиксированную систему слоёв:
Изменение z-index через CSS классы напрямую влияет на
перекрытие объектов, но может нарушить предсказуемость отображения при
сложных композициях слоёв.
.leaflet-overlay-pane {
z-index: 400;
}
Такая модификация применяется только при необходимости переопределения стандартной логики визуализации.