Snap.svg предоставляет мощный и гибкий инструмент для работы с векторной графикой в формате SVG, включая возможность создания собственных паттернов, которые могут быть использованы для заполнения фигур, фонов и градиентов. Паттерн в SVG — это повторяющийся элемент, который можно многократно использовать для заливки объектов, создавая сложные визуальные эффекты без дублирования кода.
В Snap.svg паттерн создается с помощью метода pattern()
объекта Paper. Его базовый синтаксис выглядит следующим
образом:
var s = Snap(800, 600);
var myPattern = s.pattern(x, y, width, height, function(p) {
// Здесь создаются элементы паттерна
});
Параметры метода pattern:
x, y — координаты начала паттерна внутри
SVG.width, height — размеры одного блока
паттерна.function(p) — функция обратного вызова, где
p — объект Paper, на котором создаются все
элементы паттерна.Создание шахматного паттерна с черными и белыми квадратами:
var s = Snap(400, 400);
var checkerPattern = s.pattern(0, 0, 20, 20, function(p) {
p.rect(0, 0, 10, 10).attr({ fill: "#000" });
p.rect(10, 10, 10, 10).attr({ fill: "#000" });
});
s.rect(0, 0, 400, 400).attr({ fill: checkerPattern });
В этом примере создается паттерн размером 20x20 пикселей, внутри которого размещены два черных квадрата, создавая визуальный эффект шахматной доски при масштабировании.
Snap.svg позволяет применять к паттернам трансформации, такие как поворот, масштабирование и смещение. Это особенно полезно для создания динамичных и анимированных текстур.
var s = Snap(400, 400);
var stripePattern = s.pattern(0, 0, 10, 10, function(p) {
p.rect(0, 0, 5, 10).attr({ fill: "#3498db" });
});
var rect = s.rect(0, 0, 400, 400).attr({ fill: stripePattern });
// Смещение паттерна
stripePattern.attr({ patternTransform: "translate(5,0) rotate(45)" });
Ключевой момент: Атрибут
patternTransform применяется к самому паттерну, а не к
фигуре, использующей этот паттерн. Это позволяет многократно
переиспользовать один паттерн с разными трансформациями на разных
объектах.
Паттерн может содержать любые SVG-элементы: круги, линии, полигоны, текст, пути. Snap.svg обеспечивает удобное API для их создания и стилизации внутри функции паттерна:
var s = Snap(400, 400);
var dotPattern = s.pattern(0, 0, 20, 20, function(p) {
p.circle(5, 5, 3).attr({ fill: "#e74c3c" });
p.circle(15, 15, 3).attr({ fill: "#e74c3c" });
});
s.rect(0, 0, 400, 400).attr({ fill: dotPattern });
Таким образом, можно создавать сложные геометрические и декоративные узоры, которые повторяются без потери качества.
Snap.svg позволяет анимировать элементы паттерна так же, как и обычные SVG-элементы. Можно анимировать координаты, цвет, размер или трансформацию:
var s = Snap(400, 400);
var movingDots = s.pattern(0, 0, 50, 50, function(p) {
var dot = p.circle(25, 25, 5).attr({ fill: "#2ecc71" });
dot.animate({ cx: 40 }, 1000, mina.linear, function() {
dot.attr({ cx: 10 }).animate({ cx: 25 }, 1000, mina.linear);
});
});
s.rect(0, 0, 400, 400).attr({ fill: movingDots });
Важно: Анимация внутри паттерна создает эффект движения узора на всей фигуре, что особенно полезно для динамических фоновых текстур.
p.group() внутри паттерна для логической организации
элементов.Snap.svg позволяет комбинировать паттерны с другими fill-эффектами:
p.gradient() для заливки элементов паттерна.mouseover, что открывает возможности для
интерактивных текстур.Понимание этих возможностей позволяет создавать насыщенные, динамичные и повторяемые визуальные эффекты, которые существенно обогащают интерфейс и визуальный язык веб-приложений на базе Snap.svg.