В библиотеке Leaflet параметр style используется для
задания визуального оформления векторных слоёв, прежде всего
GeoJSON-объектов и всех классов, основанных на Path
(полилинии, полигоны, окружности и их производные). Он определяет
внешний вид геометрии при отрисовке в SVG- или Canvas-рендерере и
управляет набором графических свойств, влияющих на отображение линий,
заливок и границ.
Объект, передаваемый в style, представляет собой набор
ключей, соответствующих визуальным параметрам:
color — цвет линии (обводки)weight — толщина линии в пикселяхopacity — прозрачность линии (0–1)fillColor — цвет заливки (для полигонов и
окружностей)fillOpacity — прозрачность заливкиfill — включение/выключение заливкиdashArray — пунктирный стиль линииlineCap — форма концов линии (butt,
round, square)lineJoin — тип соединения сегментов
(miter, round, bevel)interactive — включение интерактивности слояЭти параметры относятся к классу Path и наследуются
всеми векторными объектами, построенными поверх него.
style в
L.geoJSONОсновной сценарий использования параметра style связан с
загрузкой GeoJSON-данных. При создании слоя через L.geoJSON
можно задать единый стиль для всех объектов:
L.geoJSON(geojsonData, {
style: {
color: "#3388ff",
weight: 3,
opacity: 1,
fillColor: "#3388ff",
fillOpacity: 0.2
}
}).addTo(map);
В этом случае каждый полигон и линия в наборе данных будет отрисован с одинаковыми параметрами.
style и динамическая стилизацияНаиболее гибкий вариант — передача функции вместо объекта. Функция
получает feature и возвращает объект стиля, что позволяет
применять условное форматирование на основе свойств данных.
L.geoJSON(geojsonData, {
style: function (feature) {
return {
color: feature.properties.density > 50 ? "#e74c3c" : "#2ecc71",
weight: 2,
fillOpacity: 0.5
};
}
}).addTo(map);
Такой подход используется при построении тематических карт, где внешний вид зависит от атрибутов данных: плотности населения, температуры, уровня риска и других параметров.
Разные типы геометрии реагируют на параметры style
по-разному:
color, weight, opacity,
dashArray)fillColor, fillOpacity)Важно, что fill по умолчанию включён для полигонов, но
может быть отключён явно:
fill: false
Leaflet позволяет динамически изменять стиль уже созданного слоя с
помощью метода setStyle. Он доступен для всех объектов,
основанных на Path.
const layer = L.geoJSON(geojsonData).addTo(map);
layer.setStyle({
color: "#ff0000",
weight: 4
});
Метод применяется ко всем дочерним объектам слоя, если используется
L.geoJSON.
style часто используется в сочетании с событиями мыши
для реализации интерактивного поведения: подсветка при наведении,
выделение выбранного объекта, изменение прозрачности при клике.
function defaultStyle() {
return {
color: "#3498db",
weight: 2,
fillOpacity: 0.3
};
}
function highlightStyle() {
return {
color: "#f1c40f",
weight: 4,
fillOpacity: 0.6
};
}
L.geoJSON(geojsonData, {
style: defaultStyle,
onEachFeature: function (feature, layer) {
layer.on({
mouseover: function () {
layer.setStyle(highlightStyle());
},
mouseout: function () {
layer.setStyle(defaultStyle());
}
});
}
}).addTo(map);
Такой подход позволяет строить визуально отзывчивые карты без перерисовки всего слоя.
Стиль, заданный через style, может быть
переопределён:
setStyleL.polygon,
L.polyline)Path
defaults)Leaflet применяет последний установленный стиль, что важно учитывать при динамическом управлении слоями.
Path и внутренней моделью отрисовкиВсе векторные объекты Leaflet наследуются от класса
Path. Это означает, что style фактически
является набором свойств, передаваемых в SVG или Canvas-рендерер.
В SVG-режиме:
color → strokeweight → stroke-widthopacity → stroke-opacityfillColor → fillfillOpacity → fill-opacityВ Canvas-режиме те же параметры транслируются в контекст
CanvasRenderingContext2D.
style с CircleMarkerCircleMarker отличается тем, что его размер фиксирован в
пикселях, а не в метрах. Тем не менее, он поддерживает полный набор
стилевых параметров:
L.circleMarker([51.5, -0.09], {
radius: 8,
color: "#8e44ad",
fillColor: "#9b59b6",
fillOpacity: 0.8
}).addTo(map);
Здесь style может быть передан как объект или функция,
аналогично GeoJSON.
При большом количестве объектов использование функции
style с вычислениями на каждый feature может
снижать производительность. В таких случаях применяется:
Также важно учитывать, что изменение стиля через
setStyle на больших слоях приводит к перерисовке всех
дочерних элементов.
style и classNameLeaflet поддерживает дополнительный способ стилизации через CSS-классы:
L.geoJSON(geojsonData, {
style: {
className: "custom-region"
}
}).addTo(map);
Или:
className: function (feature) {
return feature.properties.type === "urban" ? "urban-zone" : "rural-zone";
}
CSS-стили позволяют разгрузить JavaScript-логику и перенести часть визуального управления в таблицы стилей.
Комбинация opacity и fillOpacity позволяет
управлять визуальной иерархией слоёв:
Leaflet использует стандартные стили для векторных объектов, если
style не задан:
Эти значения можно переопределить глобально через расширение
L.Path.options, влияя на все создаваемые объекты:
L.Path.prototype.options.color = "#1abc9c";
L.Path.prototype.options.weight = 2;
Такой подход применяется для унификации визуального языка карты во всём приложении.