Snap.svg предоставляет гибкий и мощный API для работы с векторной графикой SVG в браузере. Подсветка элементов — один из базовых приёмов интерактивной визуализации, позволяющий изменять внешний вид объектов при наведении мыши, клике или по другим событиям. В основе лежит изменение атрибутов элемента, таких как цвет заливки, обводка, прозрачность, фильтры и трансформации.
Для начала необходимо создать экземпляр Snap и выбрать элемент для подсветки:
var s = Snap("#svgCanvas");
var circle = s.circle(100, 100, 50).attr({
fill: "#3498db",
stroke: "#2980b9",
strokeWidth: 2
});
Ключевые методы для работы с подсветкой:
element.attr({}) — изменяет атрибуты SVG-элемента.element.animate(attrs, duration, easing, callback) —
плавная анимация изменения атрибутов.element.hover(f_in, f_out) — обработка событий
наведения и ухода курсора.Для классической подсветки элемента достаточно изменить цвет заливки или обводки:
circle.hover(
function() { // Наведение
this.attr({ fill: "#e74c3c", strokeWidth: 4 });
},
function() { // Уход
this.attr({ fill: "#3498db", strokeWidth: 2 });
}
);
Особенности:
hover принимает две функции: для события
mouseenter и mouseleave.strokeWidth делает подсветку более
заметной.opacity) для эффекта плавного появления.Snap.svg поддерживает анимацию атрибутов через animate,
что позволяет сделать переходы плавными:
circle.hover(
function() {
this.animate({ fill: "#e74c3c", strokeWidth: 6 }, 300, mina.easein);
},
function() {
this.animate({ fill: "#3498db", strokeWidth: 2 }, 300, mina.easeout);
}
);
Параметры метода animate:
attrs — объект новых атрибутов.duration — время анимации в миллисекундах.easing — функция сглаживания, предоставляемая Snap.svg
(mina.linear, mina.easein,
mina.easeout, mina.elastic).callback — функция, вызываемая после завершения
анимации.Snap.svg позволяет применять фильтры SVG, например, размытие или свечение:
var glow = s.filter(Snap.filter.blur(5, 5));
circle.hover(
function() { this.attr({ filter: glow }); },
function() { this.attr({ filter: null }); }
);
Примечания:
s.filter.Snap.filter.blur().merge(Snap.filter.shadow()).Для текста или групп (<g>), подсветка работает
аналогично, но с учётом структуры:
var group = s.group(
s.rect(50, 50, 150, 50).attr({ fill: "#2ecc71" }),
s.text(75, 80, "Надпись").attr({ fill: "#ffffff", fontSize: 20 })
);
group.hover(
function() {
this.select("rect").animate({ fill: "#27ae60" }, 200);
this.select("text").animate({ fill: "#ffff00" }, 200);
},
function() {
this.select("rect").animate({ fill: "#2ecc71" }, 200);
this.select("text").animate({ fill: "#ffffff" }, 200);
}
);
Особенности:
group.select(selector) позволяет выбирать отдельные
элементы внутри группы.Snap.svg хорошо сочетается с данными. Например, изменение цвета элемента в зависимости от значения:
var data = [10, 20, 30, 40];
data.forEach((val, i) => {
var rect = s.rect(50 + i*60, 150, 50, val * 2).attr({ fill: "#2980b9" });
rect.hover(
function() {
this.animate({ fill: "#f39c12", transform: 's1.1 1.1' }, 200);
},
function() {
this.animate({ fill: "#2980b9", transform: 's1 1' }, 200);
}
);
});
Особенности:
transform добавляет эффект
масштабирования.Можно создавать обобщённые функции подсветки для разных элементов:
function addHighlight(element, options) {
var colorIn = options.colorIn || "#e74c3c";
var colorOut = options.colorOut || element.attr("fill");
var duration = options.duration || 300;
element.hover(
function() { this.animate({ fill: colorIn }, duration); },
function() { this.animate({ fill: colorOut }, duration); }
);
}
addHighlight(circle, { colorIn: "#9b59b6", duration: 400 });
Преимущества:
Snap.svg предоставляет богатые возможности для создания интерактивной подсветки: изменение цвета, обводки, прозрачности, трансформаций и фильтров. Комбинирование этих методов позволяет создавать сложные визуальные эффекты, при этом код остаётся компактным и легко поддерживаемым.