Snap.svg предоставляет удобный механизм для создания повторяющихся элементов через объекты Symbol и их использование с помощью use. Это позволяет экономить ресурсы при работе с большим количеством одинаковых графических объектов и упрощает поддержку кода.
Символ в Snap.svg представляет собой шаблон графического элемента,
который можно многократно использовать без дублирования исходного кода.
Создание символа осуществляется с помощью метода
Snap.symbol():
var s = Snap("#svg"); // Инициализация SVG-контейнера
var circleSymbol = s.symbol();
circleSymbol.circle(0, 0, 50).attr({
fill: "#3498db",
stroke: "#2980b9",
strokeWidth: 4
});
Snap.symbol() создаёт контейнер для элементов.circle, rect, path,
text и группы g..attr().После создания символа его необходимо вставить в SVG-документ через
метод use:
var instance = s.use(circleSymbol);
instance.attr({
x: 100,
y: 100
});
s.use(symbol) создаёт экземпляр символа, который можно
перемещать, масштабировать и изменять независимо от оригинала.x и
y.Символы особенно полезны при множественных повторениях одного и того же элемента:
for (var i = 0; i < 5; i++) {
var inst = s.use(circleSymbol);
inst.attr({
x: 100 + i * 120,
y: 200,
fill: "#e74c3c" // Можно менять атрибуты для каждого экземпляра
});
}
fill,
stroke, transform).Экземпляры символа можно трансформировать с помощью метода
.transform():
var inst = s.use(circleSymbol);
inst.transform("translate(300,50) scale(1.5) rotate(45)");
scale(kx, ky).(cx, cy). Если точки нет, вращение происходит вокруг
(0,0).Трансформации применяются только к конкретному экземпляру, не затрагивая оригинальный Symbol.
В Snap.svg символы могут содержать другие символы:
var innerSymbol = s.symbol();
innerSymbol.rect(0, 0, 40, 40).attr({ fill: "#2ecc71" });
var outerSymbol = s.symbol();
outerSymbol.use(innerSymbol).attr({ x: 10, y: 10 });
outerSymbol.circle(50, 50, 25).attr({ fill: "#f1c40f" });
s.use(outerSymbol).attr({ x: 200, y: 100 });
Экземпляры Symbol поддерживают динамическое изменение атрибутов через
.attr():
var inst = s.use(circleSymbol);
inst.attr({
fill: "#9b59b6",
stroke: "#8e44ad",
strokeWidth: 6
});
.animate(), изменяя положение, цвет, масштаб.var starSymbol = s.symbol();
starSymbol.path("M10,0 L12,7 L20,7 L14,11 L16,18 L10,14 L4,18 L6,11 L0,7 L8,7 Z")
.attr({ fill: "#f39c12" });
for (var i = 0; i < 5; i++) {
var star = s.use(starSymbol);
star.transform(`translate(${i*50},50) scale(2)`);
}
starSymbol.Symbol и use в Snap.svg — мощный инструмент для построения повторяющихся, анимационных и сложных SVG-композиций, обеспечивающий экономию ресурсов, удобство и гибкость управления графикой.