Snap.svg предоставляет гибкий и мощный инструмент для работы с векторной графикой в браузере, что делает его идеальным для создания интерактивных карт. Основной принцип построения карты — это использование SVG-элементов для отображения геометрии объектов (страны, регионы, города) и привязка событий для интерактивности.
var s = Snap("#svgCanvas"); // Инициализация холста
var mapGroup = s.group(); // Создание группы для элементов карты
Группы и элементы позволяют логически объединять объекты карты, что облегчает управление их состояниями и анимациями.
Для каждого региона карты можно использовать path,
rect или circle, в зависимости от формы
объекта. Чаще всего применяются сложные кривые path,
описывающие контуры областей.
var region = s.path("M10,10 L50,10 L50,50 L10,50 Z");
region.attr({
fill: "#c0e0ff",
stroke: "#0055aa",
strokeWidth: 2,
cursor: "pointer"
});
mapGroup.add(region);
Ключевые атрибуты:
fill — цвет заливки области.stroke — цвет контура.strokeWidth — толщина линии.cursor — указатель при наведении.Snap.svg позволяет привязывать события непосредственно к элементам SVG. Для карт это могут быть наведение, клики, перетаскивания.
region.hover(
function() { this.attr({ fill: "#88c0ff" }); }, // Наведение
function() { this.attr({ fill: "#c0e0ff" }); } // Уход курсора
);
region.click(function() {
console.log("Выбран регион");
});
Использование hover и click создаёт эффект подсветки и позволяет реализовать интерактивные действия, например, отображение информации о регионе.
Группы (group) позволяют управлять несколькими
элементами одновременно: перемещать, скрывать или анимировать их как
единое целое.
var cities = s.group();
var city1 = s.circle(30, 30, 5).attr({ fill: "red" });
var city2 = s.circle(70, 40, 5).attr({ fill: "red" });
cities.add(city1, city2);
// Перемещение всех городов
cities.transform("t10,20");
Преимущества группирования:
Snap.svg поддерживает плавные анимации атрибутов и трансформаций. Для интерактивных карт это может быть изменение цвета региона при выборе, перемещение маркеров или масштабирование карты.
region.animate({ fill: "#ff8080" }, 500, mina.easeinout);
Параметры анимации:
duration — время в миллисекундах.easing — функция плавности (mina.linear,
mina.easein, mina.easeout,
mina.easeinout).Анимации можно комбинировать для создания сложных эффектов, например, плавное увеличение выбранного региона.
Для отображения информации о регионе удобно использовать текстовые элементы и всплывающие подсказки.
var tooltip = s.text(0, 0, "Регион A").attr({
fill: "#000",
fontSize: "12px",
visibility: "hidden"
});
region.hover(
function() {
tooltip.attr({ x: this.getBBox().cx, y: this.getBBox().cy, visibility: "visible" });
},
function() {
tooltip.attr({ visibility: "hidden" });
}
);
Особенности:
getBBox() позволяет точно позиционировать
подсказку над элементом.visibility управляет показом текста без его
удаления из DOM.Для полноценной интерактивности важно дать возможность пользователю увеличивать и перемещать карту. Snap.svg поддерживает трансформации элементов:
mapGroup.drag(
function(dx, dy) { this.transform(`t${dx},${dy}`); }, // drag move
function() {}, // drag start
function() {} // drag end
);
mapGroup.attr({ transform: "s1.5,1.5" }); // Масштабирование
Drag и transform позволяют легко реализовать динамическую навигацию по карте.
Для отображения информации по регионам можно использовать объекты с данными и связывать их с элементами карты:
var data = {
"region1": { population: 500000 },
"region2": { population: 1200000 }
};
region.click(function() {
alert("Население: " + data["region1"].population);
});
Такой подход облегчает создание интерактивных тематических карт, где визуальные изменения зависят от данных.
Snap.svg сочетает простоту создания SVG-графики с мощной системой событий и анимаций, что делает его идеальным инструментом для интерактивных карт, позволяя реализовать динамические подсветки, всплывающие подсказки, масштабирование и интеграцию данных без необходимости использования сторонних библиотек.