Snap.svg — мощная библиотека для работы с векторной графикой в браузере на основе SVG. Создание иконок начинается с инициализации объекта Snap, который представляет рабочее пространство SVG:
var s = Snap(200, 200); // создаёт SVG размером 200x200
Это пространство станет контейнером для всех элементов иконки: фигур, линий, текста и групп.
Иконка обычно строится из простых геометрических фигур. Snap.svg предоставляет методы для создания:
rect(x, y, width, height)circle(cx, cy, r)ellipse(cx, cy, rx, ry)line(x1, y1, x2, y2)polygon(points)path(d)Пример создания круга и прямоугольника:
var circle = s.circle(50, 50, 40).attr({
fill: "#4CAF50",
stroke: "#333",
strokeWidth: 3
});
var rect = s.rect(100, 20, 80, 60).attr({
fill: "#FFC107",
stroke: "#333",
strokeWidth: 2
});
attr() позволяет задавать стили: fill для
заливки, stroke для контура, strokeWidth для
толщины линии.
Для удобного управления иконками применяется группировка элементов:
var group = s.group(circle, rect);
group.attr({opacity: 0.8});
Группы позволяют одновременно трансформировать, перемещать и изменять стиль сразу для всех элементов.
Snap.svg поддерживает трансформации:
element.transform("t100,50")element.transform("s1.5,1.5")element.transform("r45,50,50")Можно комбинировать несколько трансформаций:
rect.transform("t50,20 r30 s1.2,1.2");
Важно помнить порядок трансформаций: сначала масштабирование, потом вращение и перемещение.
Иконки часто строятся с помощью сложных кривых. Snap.svg использует командную строку SVG Path:
M x,y — переместиться в точкуL x,y — линия до точкиC x1,y1 x2,y2 x,y — кубическая кривизнаQ x1,y1 x,y — квадратичная кривизнаZ — замкнуть путьПример иконки стрелки:
var arrow = s.path("M10,80 L90,50 L10,20 Z").attr({
fill: "#2196F3",
stroke: "#0D47A1",
strokeWidth: 2
});
Пути позволяют создавать любые сложные контуры, комбинируя прямые линии и кривые.
Snap.svg поддерживает заливки градиентами и прозрачностью:
var gradient = s.gradient("l(0, 0, 1, 1)#FF5722-#FFC107");
rect.attr({fill: gradient});
l — линейный градиент, r —
радиальный.fill-opacity.Цвета также можно задавать через HEX, RGB или именованные цвета:
circle.attr({fill: "rgb(76, 175, 80)"});
Иконки становятся динамичными с помощью animate:
circle.animate({r: 60, fill: "#F44336"}, 1000, mina.easeinout);
mina.linear, mina.easein,
mina.easeout, mina.easeinout.Интерактивность достигается через события:
circle.click(function() {
this.animate({fill: "#FFC107"}, 500);
});
События: click, mouseover,
mouseout, mousemove.
Иконки часто повторяются в интерфейсе. Snap.svg позволяет создавать символы:
var starSymbol = s.symbol();
var star = s.path("M50,15 L61,35 L85,35 L66,50 L75,70 L50,58 L25,70 L34,50 L15,35 L39,35 Z");
starSymbol.add(star);
var instance = s.use(starSymbol).attr({x: 10, y: 10});
symbol создаёт шаблон, который можно многократно
вставлять с помощью use.Пример иконки «дом» с кругами, прямоугольниками и путями:
var base = s.rect(50, 70, 100, 80).attr({fill: "#8BC34A", stroke: "#33691E", strokeWidth: 3});
var roof = s.path("M50,70 L100,30 L150,70 Z").attr({fill: "#CDDC39", stroke: "#827717", strokeWidth: 3});
var door = s.rect(90, 110, 20, 40).attr({fill: "#795548", stroke: "#3E2723", strokeWidth: 2});
var houseGroup = s.group(base, roof, door);
houseGroup.transform("s1.2,1.2 t10,5");
Сочетание фигур, путей, трансформаций и атрибутов создаёт гибкую и легко настраиваемую иконку, готовую к анимации и интеграции в интерфейс.