Работа с библиотекой Snap.svg начинается с создания SVG-контейнера, в
который будут добавляться графические элементы. Контейнер может быть
создан как из уже существующего <svg> в документе,
так и динамически.
var s = Snap(600, 400);
В этом случае создаётся новый SVG-элемент шириной 600 и высотой 400 пикселей, автоматически добавляемый в DOM.
Альтернативный вариант — привязка к существующему элементу:
var s = Snap("#svg");
Здесь используется селектор, аналогичный CSS.
Snap.svg предоставляет удобные методы для создания основных SVG-элементов.
var rect = s.rect(50, 50, 200, 100);
Параметры:
x, y — координаты верхнего левого
углаwidth, height — размерыДобавление скругления углов:
var rect = s.rect(50, 50, 200, 100, 10, 10);
var circle = s.circle(150, 150, 50);
Параметры:
cx, cy — центр кругаr — радиусvar ellipse = s.ellipse(200, 100, 80, 40);
Параметры:
cx, cy — центрrx, ry — радиусы по осямvar line = s.line(0, 0, 300, 200);
Параметры:
var polygon = s.polygon([50,10, 90,90, 10,90]);
var polyline = s.polyline([10,10, 50,50, 90,10]);
Массив задаёт последовательность координат точек.
Пути — наиболее универсальный инструмент SVG.
var path = s.path("M10 10 L100 100");
Основные команды:
M — перемещениеL — линияC — кубическая кривая БезьеZ — замыкание путиПример сложного пути:
var path = s.path("M50 50 C 70 10, 120 10, 140 50");
var text = s.text(100, 50, "Snap.svg");
Можно передавать массив строк:
var text = s.text(100, 50, ["Первая строка", "Вторая строка"]);
var img = s.image("image.png", 0, 0, 200, 200);
Параметры:
Группы позволяют объединять элементы для совместной трансформации или стилизации.
var group = s.group(rect, circle);
Также можно создавать пустую группу:
var group = s.group();
group.add(rect, circle);
Каждый элемент можно настраивать через метод attr.
rect.attr({
fill: "#3498db",
stroke: "#2c3e50",
strokeWidth: 5
});
Часто используемые атрибуты:
fill — цвет заливкиstroke — цвет обводкиstrokeWidth — толщина линииopacity — прозрачностьSnap.svg поддерживает парсинг строк SVG.
var fragment = Snap.parse('<circle cx="50" cy="50" r="40" fill="red"/>');
s.append(fragment);
Это удобно при работе с заранее подготовленной разметкой.
var copy = rect.clone();
copy.attr({ x: 300 });
Клон полностью повторяет исходный элемент, включая атрибуты.
rect.remove();
Удаляет элемент из DOM.
SVG не поддерживает z-index, порядок определяется
последовательностью в DOM.
Методы управления:
rect.toFront();
rect.toBack();
rect.insertAfter(circle);
rect.insertBefore(circle);
Фрагменты позволяют временно хранить элементы перед добавлением:
var frag = Snap.fragment(
'<rect x="10" y="10" width="50" height="50"/>',
'<circle cx="100" cy="100" r="30"/>'
);
s.append(frag);
Возможна вставка одного SVG внутрь другого:
var nested = s.svg(100, 100, 200, 200);
nested.circle(50, 50, 40);
var mask = s.circle(100, 100, 50);
var rect = s.rect(0, 0, 200, 200).attr({
mask: mask
});
var clip = s.circle(100, 100, 50);
rect.attr({
clipPath: clip
});
var symbol = s.symbol();
symbol.add(rect);
var use = symbol.use().attr({ x: 200, y: 0 });
Позволяет эффективно повторно использовать элементы.
Загрузка внешнего файла:
Snap.load("file.svg", function(data) {
s.append(data);
});
Позволяет интегрировать сложные SVG-документы.
Часто создание элементов оформляется в функции:
function createButton(s, x, y, text) {
var group = s.group();
var rect = s.rect(x, y, 120, 40, 5).attr({
fill: "#2ecc71"
});
var label = s.text(x + 20, y + 25, text).attr({
fill: "#fff"
});
group.add(rect, label);
return group;
}
appendfragment для пакетной вставкиПример оптимизации:
var frag = Snap.fragment();
for (var i = 0; i < 100; i++) {
frag.add(s.circle(i * 10, 50, 5));
}
s.append(frag);
Каждый созданный элемент — объект Snap, с которым можно работать:
var el = s.select("circle");
var all = s.selectAll("rect");
rect.attr({ id: "myRect" });
var el = Snap("#myRect");
var foreign = s.el("foreignObject", {
x: 10,
y: 10,
width: 200,
height: 100
});
var div = document.createElement("div");
div.innerHTML = "HTML внутри SVG";
foreign.node.appendChild(div);
s.append(foreign);
s.circle(50, 50, 40)
.attr({ fill: "red" })
.transform("translate(10,10)");
Позволяет компактно описывать вставку и настройку элементов.
Создание сложных объектов из простых:
var face = s.group();
var head = s.circle(100, 100, 50);
var eye1 = s.circle(80, 90, 5);
var eye2 = s.circle(120, 90, 5);
var mouth = s.path("M80 120 Q100 140 120 120");
face.add(head, eye1, eye2, mouth);
for (var i = 0; i < 10; i++) {
s.rect(i * 30, 10, 20, 20).attr({
fill: "#000"
});
}
var rect = s.rect(0, 0, 100, 50);
rect.transform("translate(100,100) rotate(45)");
Snap.svg напрямую работает с DOM, поэтому структура SVG полностью контролируема:
Это делает вставку элементов не просто добавлением графики, а полноценным управлением документом.