Snap.svg — это мощная библиотека для работы с векторной графикой в формате SVG в браузере. Основное преимущество библиотеки заключается в удобных методах создания, модификации и анимации SVG-элементов через JavaScript. Генераторы SVG в Snap.svg позволяют динамически создавать графические элементы и управлять ими программно, что делает библиотеку идеальной для интерактивной визуализации.
Для начала необходимо создать экземпляр Snap, который будет представлять контейнер SVG:
var s = Snap("#svgContainer");
Здесь #svgContainer — идентификатор элемента
<svg> в HTML. Snap.svg также позволяет создавать SVG
с нуля:
var s = Snap(800, 600); // Создание SVG 800x600 пикселей
document.body.appendChild(s.node);
Использование генераторов SVG начинается с вызова методов
circle, rect, ellipse,
line, polyline, polygon и
path.
Круг
var circle = s.circle(150, 150, 100); // x, y, радиус
circle.attr({
fill: "#3498db",
stroke: "#2980b9",
strokeWidth: 5
});
Прямоугольник
var rect = s.rect(50, 50, 200, 100); // x, y, ширина, высота
rect.attr({
fill: "#e74c3c",
stroke: "#c0392b",
strokeWidth: 4,
rx: 15, // Скругление по горизонтали
ry: 15 // Скругление по вертикали
});
Эллипс
var ellipse = s.ellipse(300, 300, 150, 100); // cx, cy, rx, ry
ellipse.attr({
fill: "#2ecc71",
stroke: "#27ae60",
strokeWidth: 3
});
Линия
var line = s.line(50, 50, 400, 400);
line.attr({
stroke: "#f1c40f",
strokeWidth: 6
});
Многоугольники и полигоны
var polyline = s.polyline([100,100, 200,50, 300,100, 400,50]);
polyline.attr({
fill: "none",
stroke: "#8e44ad",
strokeWidth: 2
});
var polygon = s.polygon([50,150, 150,250, 250,150, 350,250]);
polygon.attr({
fill: "#9b59b6",
stroke: "#8e44ad",
strokeWidth: 3
});
pathМетод path позволяет создавать произвольные кривые и
формы с помощью SVG-путей:
var path = s.path("M100,100 C200,50 300,150 400,100");
path.attr({
fill: "none",
stroke: "#e67e22",
strokeWidth: 5
});
Ключевые команды пути:
M x,y — переместиться в точку (x, y)L x,y — линия до точки (x, y)H x / V y — горизонтальная / вертикальная
линияC x1,y1 x2,y2 x,y — кубическая кривaя БезьеQ x1,y1 x,y — квадратичная кривая БезьеZ — замкнуть путьSnap.svg позволяет создавать элементы на основе данных:
var data = [50, 100, 150, 200, 250];
data.forEach(function(value, index){
var circle = s.circle(100 + index*70, 300, value/10);
circle.attr({
fill: "#1abc9c",
stroke: "#16a085",
strokeWidth: 2
});
});
Такой подход позволяет строить диаграммы, графики и интерактивные визуализации, где размеры, позиции и цвета элементов зависят от внешних данных.
Для упрощения работы с несколькими элементами можно использовать группы:
var g = s.group();
var c1 = s.circle(50,50,30);
var c2 = s.circle(150,50,30);
g.add(c1, c2);
g.attr({transform: "translate(100,100)"}); // перемещение всей группы
Группы упрощают анимацию и изменение свойств сразу для нескольких объектов.
Генераторы удобно комбинировать с анимацией:
var circle = s.circle(200, 200, 50);
circle.attr({fill: "#e74c3c"});
circle.animate({r: 100, fill: "#f39c12"}, 1000, mina.bounce);
Snap.svg поддерживает линейные и нелинейные функции интерполяции
(mina.linear, mina.easein,
mina.bounce) для плавной анимации.
Для сложных визуализаций удобно создавать функции-генераторы:
function createStar(cx, cy, spikes, outerRadius, innerRadius) {
var pathStr = "";
var angle = Math.PI / spikes;
for(var i = 0; i < 2 * spikes; i++){
var r = (i % 2 === 0) ? outerRadius : innerRadius;
var x = cx + Math.cos(i * angle) * r;
var y = cy + Math.sin(i * angle) * r;
pathStr += (i === 0 ? "M" : "L") + x + "," + y + " ";
}
pathStr += "Z";
return s.path(pathStr).attr({
fill: "#f1c40f",
stroke: "#f39c12",
strokeWidth: 2
});
}
createStar(400, 300, 5, 80, 40);
Такой подход позволяет генерировать любые повторяющиеся или сложные формы программно, без ручного указания каждой точки.
Snap.svg сочетает простоту и мощь генераторов SVG, позволяя создавать
динамические и интерактивные графические элементы. Использование методов
circle, rect, ellipse,
line, polygon и особенно path
обеспечивает полный контроль над формами, позициями, стилями и
анимациями SVG-элементов.