Анимация в SVG-графике позволяет не только улучшить визуальное восприятие данных, но и управлять вниманием, поэтапно раскрывая информацию. В контексте Snap.svg анимация становится инструментом, который объединяет данные, дизайн и интерактивность.
Ключевые преимущества:
Библиотека Snap.svg предоставляет встроенный метод
animate, который применяется к любому SVG-элементу.
Синтаксис:
element.animate(attrs, duration, easing, callback);
attrs — объект с конечными значениями атрибутов;duration — длительность в миллисекундах;easing — функция сглаживания;callback — функция, вызываемая после завершения.Пример:
var circle = Snap("#svg").circle(50, 50, 20);
circle.animate({
cx: 150
}, 1000);
Анимации выглядят более естественно при использовании easing-функций.
Популярные варианты:
mina.linearmina.easeinmina.easeoutmina.easeinoutmina.bounceПример:
circle.animate({ cx: 150 }, 1000, mina.easeinout);
Snap.svg поддерживает анимацию практически всех атрибутов:
Позиция и размеры:
rect.animate({ x: 200, width: 150 }, 800);
Цвет:
circle.animate({ fill: "#ff0000" }, 500);
Прозрачность:
element.animate({ opacity: 0.3 }, 600);
Для инфографики часто требуется поэтапное появление элементов.
Цепочка через callback:
circle.animate({ cx: 100 }, 500, function() {
circle.animate({ cy: 100 }, 500);
});
Рекурсивный подход:
function move() {
circle.animate({ cx: 150 }, 500, function() {
circle.animate({ cx: 50 }, 500, move);
});
}
move();
Несколько элементов могут анимироваться одновременно:
circle.animate({ cx: 150 }, 1000);
rect.animate({ x: 200 }, 1000);
Группировка (group) позволяет управлять несколькими
элементами как одним объектом.
var group = Snap("#svg").group(circle, rect);
group.animate({ transform: "translate(100,0)" }, 1000);
Это особенно полезно для инфографики, где блоки данных перемещаются или масштабируются синхронно.
Анимация трансформаций используется для вращения, масштабирования и перемещения.
Пример:
element.animate({
transform: "rotate(45, 100, 100)"
}, 1000);
Комбинированные трансформации:
element.animate({
transform: "translate(50,50) scale(1.5)"
}, 1000);
Один из ключевых приёмов инфографики — «рисование» линии.
Используется stroke-dasharray и
stroke-dashoffset.
var path = Snap("#svg").path("M10 100 L200 100");
var length = path.getTotalLength();
path.attr({
strokeDasharray: length,
strokeDashoffset: length
});
path.animate({
strokeDashoffset: 0
}, 1500);
Эффект: линия «прорисовывается» слева направо.
Создание сектора:
function sector(cx, cy, r, startAngle, endAngle) {
var rad = Math.PI / 180;
var x1 = cx + r * Math.cos(-startAngle * rad);
var y1 = cy + r * Math.sin(-startAngle * rad);
var x2 = cx + r * Math.cos(-endAngle * rad);
var y2 = cy + r * Math.sin(-endAngle * rad);
var largeArc = endAngle - startAngle > 180 ? 1 : 0;
return "M" + cx + "," + cy +
"L" + x1 + "," + y1 +
"A" + r + "," + r + " 0 " + largeArc + ",0 " + x2 + "," + y2 +
"Z";
}
Анимация заполнения:
var path = paper.path(sector(100, 100, 80, 0, 0));
Snap.animate(0, 120, function(val) {
path.attr({ d: sector(100, 100, 80, 0, val) });
}, 1000);
Плавное появление столбцов:
var rect = paper.rect(50, 200, 40, 0);
rect.animate({
y: 100,
height: 100
}, 800, mina.easeout);
Для более сложных сценариев используется
Snap.animate.
Синтаксис:
Snap.animate(from, to, stepFunction, duration, easing, callback);
Пример:
Snap.animate(0, 100, function(value) {
circle.attr({ cx: value });
}, 1000);
Snap.animate позволяет изменять не только координаты, но и любые параметры:
Snap.animate(0, 1, function(val) {
element.attr({ opacity: val });
}, 500);
Инфографика часто включает числовые значения.
var text = paper.text(100, 100, "0");
Snap.animate(0, 100, function(val) {
text.attr({ text: Math.round(val) });
}, 1000);
Анимация может запускаться по событиям:
element.click(function() {
element.animate({ transform: "scale(1.2)" }, 300);
});
Наведение:
element.hover(
function() {
this.animate({ opacity: 0.7 }, 200);
},
function() {
this.animate({ opacity: 1 }, 200);
}
);
Задержка реализуется через setTimeout:
setTimeout(function() {
circle.animate({ cx: 150 }, 1000);
}, 500);
Типичная структура:
Рекомендации:
var paper = Snap("#svg");
var path = paper.path("M10 150 L100 80 L200 120");
var length = path.getTotalLength();
path.attr({
fill: "none",
stroke: "#000",
strokeDasharray: length,
strokeDashoffset: length
});
path.animate({
strokeDashoffset: 0
}, 1500);
Добавление точек:
var points = [
[10,150],
[100,80],
[200,120]
];
points.forEach(function(p, i) {
var c = paper.circle(p[0], p[1], 0);
setTimeout(function() {
c.animate({ r: 5 }, 300);
}, i * 300);
});
Эффективная реализация требует:
Для сложных инфографик полезно хранить состояние:
var state = {
active: false,
value: 0
};
Это упрощает:
При обновлении данных:
function update(value) {
Snap.animate(current, value, function(val) {
bar.attr({ height: val });
}, 800);
}
Анимированные инфографики используются для:
Snap.svg остаётся удобным инструментом для создания таких решений благодаря сочетанию декларативного SVG и гибкой анимационной модели.