Leaflet опирается на набор CSS-правил, которые отвечают за корректное отображение карты, тайлов, контролов и стандартных элементов интерфейса. Без подключения стилей библиотека остаётся функционально рабочей, но визуально «разрушенной»: отсутствуют размеры контейнера карты, не отображаются элементы управления масштабом, маркеры теряют оформление, а всплывающие окна не имеют базовой структуры.
Стили Leaflet выполняют несколько ключевых задач:
CSS в Leaflet не является декоративным дополнением — это часть базовой отрисовки, без которой карта теряет структурную целостность.
Наиболее простой способ подключения стилей — использование CDN-версии:
<link
rel="stylesheet"
href="https://unpkg.com/leaflet/dist/leaflet.css"
/>
Этот файл содержит полный набор базовых стилей, необходимых для работы библиотеки.
Одновременно с CSS обычно подключается Jav * aScript:
<script src="https://unpkg.com/leaflet/dist/leaflet.js"></script>
Важно, что порядок подключения критичен: CSS должен быть загружен до инициализации карты, иначе возможны визуальные артефакты при первом рендере.
При использовании современных сборщиков (Vite, Webpack, Rollup) стили подключаются через импорт:
import "leaflet/dist/leaflet.css";
Такой подход обеспечивает:
При этом важно учитывать, что CSS Leaflet содержит ссылки на изображения (иконки маркеров), которые должны корректно резолвиться сборщиком.
Внутри leaflet.css можно выделить несколько логических блоков.
Ключевой элемент:
.leaflet-container {
height: 100%;
width: 100%;
}
Без явного задания высоты контейнера карта не будет отображаться. Это одна из наиболее частых причин «пустого блока» при инициализации.
Leaflet использует слоистую модель:
Каждому слою соответствует свой z-index, определённый в CSS:
.leaflet-pane {
position: absolute;
top: 0;
left: 0;
}
Иерархия слоёв обеспечивает предсказуемое перекрытие объектов.
Элементы управления масштабом и слоями оформляются через классы:
.leaflet-control.leaflet-bar.leaflet-control-zoomПример базовой стилизации:
.leaflet-bar a {
background-color: #fff;
border-bottom: 1px solid #ccc;
}
Эти стили задают визуальную консистентность кнопок и их hover-состояний.
Всплывающие окна реализуются через:
.leaflet-popup.leaflet-popup-content.leaflet-tooltipCSS управляет:
Одним из критических аспектов подключения стилей является зависимость карты от размеров родительского элемента.
Leaflet не задаёт фиксированную высоту карте автоматически. Поэтому:
#map {
height: 400px;
}
или:
html, body, #map {
height: 100%;
}
Без этого правило .leaflet-container { height: 100%; }
не имеет эффекта, так как процентная высота зависит от родителя.
CSS Leaflet содержит ссылки на изображения:
Они используются через стандартные пути, например:
background-image: url(images/marker-icon.png);
При использовании Webpack или Vite часто возникает ситуация, когда изображения не находятся по ожидаемому пути. В результате маркеры становятся невидимыми.
В стандартной конфигурации Leaflet использует:
import L from "leaflet";
import "leaflet/dist/leaflet.css";
Однако пути к изображениям могут быть некорректны. Для исправления применяется переопределение:
import iconUrl from "leaflet/dist/images/marker-icon.png";
import iconShadow from "leaflet/dist/images/marker-shadow.png";
L.Icon.Default.mergeOptions({
iconUrl,
shadowUrl: iconShadow
});
Это обеспечивает явное указание ресурсов, независимо от сборщика.
Leaflet поддерживает высокоплотные дисплеи через @2x
изображения.
CSS автоматически выбирает:
marker-icon-2x.png для retina.Логика выбора основана на media queries:
@media
(-webkit-min-device-pixel-ratio: 2),
(min-resolution: 192dpi) {
.leaflet-tile {
/* использование high-res тайлов */
}
}
Leaflet допускает полную кастомизацию через переопределение классов.
.leaflet-container {
background: #1e1e1e;
}
.leaflet-control-zoom a {
background-color: #222;
color: #fff;
}
.leaflet-popup-content-wrapper {
border-radius: 0;
background: #111;
color: #fff;
}
Leaflet использует классы с высокой специфичностью, но не применяет
!important повсеместно. Это означает:
Особенно часто конфликт возникает с:
box-sizing;img { max-width: 100%; };overflow: hidden.В SPA (React, Vue, Angular) подключение Leaflet CSS имеет особенности.
import "leaflet/dist/leaflet.css";
Подключение в entry-файле гарантирует, что стили попадут в бандл до рендера компонентов карты.
При ленивой загрузке карты возможна ситуация, когда CSS ещё не загружен. Это приводит к «миганию» неоформленного интерфейса.
Правильная последовательность:
L.map();Нарушение порядка приводит к:
В крупных приложениях Leaflet CSS часто конфликтует с:
Решения:
.leaflet-*;Пример:
.map-wrapper .leaflet-container {
font-family: Arial, sans-serif;
}
Хотя Leaflet не использует CSS variables по умолчанию, стили можно адаптировать через препроцессоры:
$popup-bg: #2b2b2b;
.leaflet-popup-content-wrapper {
background: $popup-bg;
}
Это упрощает поддержку темной темы и динамических интерфейсов.
Типовой минимальный набор:
<link rel="stylesheet" href="leaflet.css">
<script src="leaflet.js"></script>
или через модульную систему:
import "leaflet/dist/leaflet.css";
import L from "leaflet";
Корректное подключение стилей является обязательным условием работоспособности визуальной части карты, включая слои, контролы, маркеры и всплывающие элементы.