Работа с библиотекой Snap.svg начинается с создания SVG-контейнера — основной рабочей области, внутри которой будут размещаться все графические элементы. Этот контейнер может быть как уже существующим элементом на странице, так и созданным динамически.
Snap.svg предоставляет удобный интерфейс для управления SVG через
объект Snap.
<svg>Если SVG-элемент уже присутствует в DOM:
<svg id="canvas" width="600" height="400"></svg>
Инициализация:
var s = Snap("#canvas");
В этом случае объект s становится точкой доступа ко всем
элементам внутри указанного SVG.
При отсутствии заранее созданного элемента:
var s = Snap(600, 400);
Такой вызов автоматически создаёт новый <svg> с
заданными размерами и добавляет его в DOM.
Рабочая область определяется не только шириной и высотой, но и системой координат.
s.attr({
width: 800,
height: 600
});
viewBoxАтрибут viewBox задаёт внутреннюю систему координат
SVG:
s.attr({
viewBox: "0 0 400 300"
});
Это позволяет масштабировать содержимое без изменения фактических размеров контейнера.
Преимущества viewBox:
SVG использует декартову систему координат с началом в левом верхнем углу:
Это важно учитывать при позиционировании элементов.
var circle = s.circle(50, 50, 40);
50, 50 — координаты центра40 — радиусПосле создания рабочей области можно добавлять графические объекты.
var rect = s.rect(10, 10, 100, 50);
var circle = s.circle(200, 100, 40);
var line = s.line(0, 0, 300, 200);
Каждый элемент автоматически становится дочерним элементом SVG-контейнера.
Группы позволяют объединять несколько объектов и управлять ими как единым целым.
var group = s.group(rect, circle);
Или:
var group = s.g();
group.add(rect, circle);
Преимущества группировки:
Snap.svg полностью интегрирован с DOM-структурой SVG.
var rect = s.select("rect");
var elements = s.selectAll("circle");
var group = s.group();
group.add(s.rect(0, 0, 50, 50));
group.add(s.circle(25, 25, 20));
SVG-элементы можно стилизовать через атрибуты:
rect.attr({
fill: "#3498db",
stroke: "#2c3e50",
strokeWidth: 2
});
svg {
background-color: #f5f5f5;
}
SVG не имеет встроенного свойства background, поэтому
фон задаётся через прямоугольник:
var bg = s.rect(0, 0, 800, 600).attr({
fill: "#ffffff"
});
Чтобы фон не перекрывал другие элементы, он должен добавляться первым.
Рабочая область может быть адаптивной при использовании сочетания
viewBox и CSS:
<svg id="canvas" width="100%" height="100%"></svg>
s.attr({
viewBox: "0 0 800 600",
preserveAspectRatio: "xMidYMid meet"
});
Хотя трансформации чаще применяются к отдельным элементам, их можно использовать и на уровне групп или контейнера.
s.transform("scale(1.5)");
Однако чаще создаётся корневая группа:
var root = s.group();
root.transform("translate(100, 50)");
И все элементы добавляются в неё.
Рабочая область может реагировать на пользовательские действия:
s.click(function(event) {
console.log(event.offsetX, event.offsetY);
});
s.click(function(e) {
s.circle(e.offsetX, e.offsetY, 10).attr({
fill: "#e74c3c"
});
});
Удаление всех элементов:
s.clear();
Это полезно при перерисовке сцены.
Snap.svg позволяет загружать и вставлять внешние SVG-файлы:
Snap.load("image.svg", function(fragment) {
s.append(fragment);
});
Для сложных сцен важно придерживаться иерархии:
var background = s.group();
var objects = s.group();
var ui = s.group();
Такой подход упрощает:
При работе с большой сценой:
Пример:
rect.attr({
x: 10,
y: 20,
width: 100,
height: 50
});
var s = Snap(800, 600);
// фон
s.rect(0, 0, 800, 600).attr({ fill: "#ecf0f1" });
// группа объектов
var layer = s.group();
// элементы
var circle = s.circle(100, 100, 50).attr({ fill: "#3498db" });
var rect = s.rect(200, 50, 100, 100).attr({ fill: "#e74c3c" });
// добавление в группу
layer.add(circle, rect);
// трансформация
layer.transform("translate(50, 50)");
Snap()viewBoxРабочая область в Snap.svg — это не просто контейнер, а управляемая сцена, в которой каждая деталь влияет на производительность, масштабируемость и удобство дальнейшей разработки.