В Snap.svg паттерны используются для заполнения фигур повторяющимися
графическими элементами. Паттерн определяется как SVG-элемент
<pattern>, который может содержать любые SVG-объекты:
прямоугольники, линии, круги, текст или другие фигуры. После создания
паттерна его можно применить к фигуре через атрибут
fill.
Для создания паттерна в Snap.svg используется метод
paper.pattern(x, y, width, height, contentFunction).
Параметры x и y задают смещение паттерна,
width и height — размеры блока повторения, а
contentFunction — функция, возвращающая содержимое
паттерна.
Пример создания простого паттерна с горизонтальными линиями:
var s = Snap(400, 400);
var linePattern = s.pattern(0, 0, 20, 20, function(p) {
p.line(0, 0, 20, 0).attr({stroke: "#000", strokeWidth: 2});
return p;
});
var rect = s.rect(50, 50, 300, 300).attr({
fill: linePattern
});
Здесь создается паттерн размером 20x20 пикселей с одной горизонтальной линией. Этот паттерн применяется к прямоугольнику размером 300x300, который автоматически заполняется повторяющимися линиями.
Паттерны поддерживают большинство стандартных атрибутов SVG:
patternUnits, patternContentUnits,
patternTransform.
userSpaceOnUse
(размеры в пикселях) и objectBoundingBox (относительные
размеры от 0 до 1).userSpaceOnUse обеспечивает
точное позиционирование элементов внутри паттерна.Пример с трансформацией:
var rotatedPattern = s.pattern(0, 0, 40, 40, function(p) {
p.rect(0, 0, 20, 20).attr({fill: "#f06"});
return p;
});
rotatedPattern.attr({
patternTransform: "rotate(45 20 20)"
});
s.circle(200, 200, 100).attr({
fill: rotatedPattern
});
В этом примере квадрат внутри паттерна поворачивается на 45° вокруг центра блока 20x20, создавая эффект диагонального повторения.
Паттерн может содержать несколько объектов, включая группы
(<g>). Snap.svg позволяет добавлять сложные
композиции, используя вложенные элементы и комбинируя фигуры с разными
цветами и прозрачностью.
Пример паттерна с несколькими элементами:
var complexPattern = s.pattern(0, 0, 50, 50, function(p) {
p.rect(0, 0, 25, 25).attr({fill: "#ff0"});
p.circle(25, 25, 10).attr({fill: "#00f"});
p.line(0, 50, 50, 0).attr({stroke: "#f00", strokeWidth: 2});
return p;
});
s.ellipse(200, 200, 150, 100).attr({
fill: complexPattern
});
Результат — повторяющийся узор с желтыми квадратиками, синими кругами и красными диагональными линиями. Такой подход позволяет создавать богатые визуальные эффекты без использования растровой графики.
Паттерны можно использовать не только для заливки фигуры
(fill), но и для обводки (stroke). Для этого
достаточно назначить паттерн в атрибут stroke:
var strokePattern = s.pattern(0, 0, 10, 10, function(p) {
p.line(0, 0, 10, 10).attr({stroke: "#0f0", strokeWidth: 2});
return p;
});
s.rect(50, 50, 200, 200).attr({
fill: "#fff",
stroke: strokePattern,
strokeWidth: 10
});
Здесь обводка прямоугольника получает паттерн из зеленых линий, создавая декоративный эффект.
Snap.svg поддерживает анимацию элементов внутри паттернов. Можно изменять координаты, цвет или прозрачность объектов, что позволяет создавать динамические текстуры.
Пример анимации движения линий внутри паттерна:
var animPattern = s.pattern(0, 0, 30, 30, function(p) {
var line = p.line(0, 0, 30, 0).attr({stroke: "#00f", strokeWidth: 2});
line.animate({y1: 15, y2: 15}, 1000, mina.easeinout, function() {
line.animate({y1: 0, y2: 0}, 1000, mina.easeinout);
});
return p;
});
s.rect(100, 100, 200, 200).attr({
fill: animPattern
});
Это позволяет создавать эффекты движущейся текстуры без использования сложного кода Canvas или WebGL.
Использование паттернов в Snap.svg позволяет создавать повторяющиеся декоративные элементы с высокой гибкостью, управляя их формой, цветом, трансформацией и анимацией. Этот инструмент идеально подходит для динамических интерфейсов, визуализации данных и интерактивных графических приложений.