Snap.svg предоставляет удобный и интуитивно понятный способ работы с
интерактивными элементами SVG через обработчики событий мыши. Для
каждого элемента можно назначить реакции на события click,
mouseover, mouseout, mousedown,
mouseup, mousemove и другие.
var s = Snap("#svg"); // создаём канвас SVG
var circle = s.circle(100, 100, 50); // создаём круг
circle.attr({
fill: "#3498db",
stroke: "#2980b9",
strokeWidth: 3
});
// Обработчик клика
circle.click(function() {
this.attr({ fill: "#e74c3c" });
});
В данном примере при клике на круг его цвет изменяется на красный.
this внутри функции ссылается на сам элемент Snap.svg.
1. click – срабатывает при нажатии и
отпускании кнопки мыши на элементе. 2.
dblclick – срабатывает при двойном клике.
3. mouseover / mouseout –
срабатывают при наведении курсора на элемент и при уходе курсора с
элемента соответственно. 4. mousedown /
mouseup – фиксируют момент нажатия и отпускания
кнопки мыши. 5. mousemove – отслеживает
движение мыши над элементом.
Использование нескольких обработчиков на одном элементе позволяет создавать сложные интерактивные эффекты.
circle.hover(
function() { this.attr({ fill: "#2ecc71" }); },
function() { this.attr({ fill: "#3498db" }); }
);
Метод hover является удобным сокращением для назначения
одновременно mouseover и mouseout.
Можно использовать замыкания для передачи дополнительных параметров в функции обработчиков.
function changeColor(color) {
return function() {
this.attr({ fill: color });
}
}
circle.click(changeColor("#f1c40f"));
Такой подход позволяет повторно использовать одну и ту же логику для разных элементов с разными параметрами.
Snap.svg поддерживает удаление обработчиков с помощью метода
unhover и unclick для соответствующих
событий.
circle.unclick(); // убирает обработчик click
circle.unhover(); // убирает hover (mouseover + mouseout)
Для более сложных событий можно использовать метод
element.node.removeEventListener, если нужен полный
контроль.
Snap.svg позволяет объединять элементы в группы через
g(). Обработчики можно назначать как на отдельные элементы,
так и на всю группу целиком.
var group = s.group(circle, s.rect(50, 50, 100, 50));
group.click(function() {
this.attr({ opacity: 0.5 });
});
При клике на любой элемент группы изменится прозрачность всей группы. Это полезно для создания интерактивных интерфейсов и сложных визуализаций.
Объект события доступен в обработчиках через аргумент функции. Он содержит стандартные свойства JavaScript-событий:
circle.click(function(event) {
console.log("Координаты клика:", event.clientX, event.clientY);
});
Snap.svg автоматически передаёт DOM-событие, что позволяет
использовать свойства clientX, clientY,
target и другие для точного контроля над взаимодействием
пользователя.
Эффекты мыши можно сочетать с анимациями Snap.svg, создавая плавные интерактивные переходы.
circle.hover(
function() { this.animate({ r: 70 }, 300, mina.easeinout); },
function() { this.animate({ r: 50 }, 300, mina.easeinout); }
);
В этом примере радиус круга плавно увеличивается при наведении и возвращается при уходе мыши.
Для работы с набором элементов можно использовать метод
forEach, назначая обработчики каждому элементу
коллекции.
var circles = [s.circle(50, 50, 30), s.circle(150, 50, 30), s.circle(250, 50, 30)];
circles.forEach(function(c, i) {
c.attr({ fill: "#9b59b6" });
c.click(function() {
this.attr({ fill: "#f39c12" });
});
});
Такой подход позволяет эффективно управлять интерактивными элементами без дублирования кода.
Snap.svg не имеет встроенной поддержки touch, но DOM-события можно использовать напрямую:
circle.node.addEventListener("touchstart", function(e) {
this.setAttribute("fill", "#1abc9c");
});
Таким образом, элементы остаются интерактивными на мобильных устройствах.
click, hover,
mousedown, mouseup для простых
интеракций.addEventListener.Эта система событий в Snap.svg позволяет создавать динамичные и отзывчивые SVG-интерфейсы без сложных внешних библиотек.