Snap.svg предоставляет удобные методы для работы с событиями мыши на
SVG-элементах, что позволяет реализовывать интерактивные интерфейсы,
рисование, перетаскивание объектов и сложную анимацию. Основные события,
связанные с движением мыши, — это mousedown,
mouseup и mousemove.
mousedownСобытие mousedown срабатывает в момент нажатия кнопки
мыши на элементе SVG. В Snap.svg оно подключается через метод
.mousedown(handler). Этот обработчик принимает объект
события, содержащий координаты клика и другие параметры.
var s = Snap("#svg");
var circle = s.circle(100, 100, 50);
circle.attr({
fill: "blue",
stroke: "black",
strokeWidth: 2
});
circle.mousedown(function(event) {
console.log("Нажатие на элемент", event.offsetX, event.offsetY);
this.attr({fill: "red"});
});
Ключевые моменты:
event.offsetX и event.offsetY дают
координаты клика относительно SVG-контейнера..mousedown, Snap.svg поддерживает цепочку вызовов.mouseupСобытие mouseup срабатывает в момент отпускания кнопки
мыши. Оно особенно важно при работе с интерактивными объектами, чтобы
завершить действия, инициированные mousedown.
circle.mouseup(function(event) {
console.log("Отпускание кнопки мыши", event.offsetX, event.offsetY);
this.attr({fill: "blue"});
});
Особенности mouseup:
mousedown для реализации
перетаскивания объектов.mousedown, с координатами и свойствами кнопки мыши.mousemoveСобытие mousemove срабатывает при движении мыши над
элементом. В Snap.svg оно подключается методом
.mousemove(handler) и передает объект события с
координатами текущего положения указателя.
circle.mousemove(function(event) {
console.log("Движение мыши над элементом", event.offsetX, event.offsetY);
});
Особенности использования:
mousemove можно реализовать динамическое
взаимодействие, например, изменение позиции или формы объекта в реальном
времени.mousemove комбинируется с флагом, который
включается на mousedown и выключается на
mouseup, чтобы движение учитывалось только при зажатой
кнопке мыши.var isDragging = false;
var startX, startY;
circle.mousedown(function(event) {
isDragging = true;
startX = event.offsetX - this.attr("cx");
startY = event.offsetY - this.attr("cy");
});
circle.mousemove(function(event) {
if (isDragging) {
this.attr({
cx: event.offsetX - startX,
cy: event.offsetY - startY
});
}
});
circle.mouseup(function() {
isDragging = false;
});
Разбор кода:
isDragging определяет, активен ли процесс
перетаскивания.mousedown фиксируются смещения startX
и startY между мышью и центром круга.mousemove координаты элемента обновляются только если
isDragging = true.mouseup завершает процесс перетаскивания, сбрасывая
флаг.Snap.svg хранит координаты элементов в атрибутах SVG
(cx, cy, x, y). При
работе с событиями мыши важно учитывать:
event.offsetX и event.offsetY — координаты
мыши относительно SVG-контейнера.getBBox() для получения текущей позиции
элемента или Matrix для корректной трансформации.isDragging,
isDrawing), чтобы ограничивать действия мыши в определенном
контексте.mousedown сработает только по видимой части элемента (fill
не none).requestAnimationFrame вместо прямого обновления координат в
обработчике mousemove.Часто mousedown, mousemove и
mouseup используются вместе для создания сложных
интерфейсов:
mousedown — инициализация действия.mousemove — динамическое обновление состояния
объекта.mouseup — завершение действия и сброс состояния.Такой подход позволяет создавать интерактивные элементы, такие как:
Объект события содержит event.button:
0 — левая кнопка1 — средняя кнопка (колесо)2 — правая кнопкаМожно фильтровать обработку событий для определенной кнопки:
circle.mousedown(function(event) {
if (event.button === 0) {
console.log("Только левая кнопка мыши");
}
});
.mousedown(handler) — срабатывает при нажатии кнопки
мыши на элементе..mouseup(handler) — срабатывает при отпускании кнопки
мыши..mousemove(handler) — срабатывает при движении мыши над
элементом.Эти события вместе образуют фундамент для создания интерактивных SVG-приложений с Snap.svg, позволяя строить как простые элементы перетаскивания, так и сложные динамические интерфейсы.