Snap.svg предоставляет удобный и мощный инструмент для работы с
трансформациями SVG-элементов. Любой объект, созданный с помощью Snap,
поддерживает методы transform,
translate,
rotate,
scale,
matrix, которые можно комбинировать,
создавая цепочки преобразований.
transformМетод transform позволяет задавать
полное преобразование элемента в виде строки:
element.transform("t100,50r45s2,2");
Здесь:
t100,50 — translate (перемещение) на
100px по X и 50px по Y;r45 — rotate (поворот) на 45 градусов
вокруг центра элемента;s2,2 — scale (масштабирование) по осям
X и Y.Ключевой момент: порядок операций имеет значение. Сначала применяется перемещение, затем поворот, затем масштабирование. Изменение порядка изменит итоговую позицию и вид объекта.
Каждый метод трансформации Snap.svg можно использовать отдельно, но комбинировать их удобно через цепочку:
element
.translate(50, 100)
.rotate(30)
.scale(1.5, 1.5);
Snap.svg сохраняет внутреннее состояние элемента и применяет
преобразования последовательно, как если бы они были записаны в одной
строке для transform.
Методы rotate и scale поддерживают опцию
центра трансформации:
element.rotate(45, 200, 100); // Поворот на 45° вокруг точки (200,100)
element.scale(2, 2, 50, 50); // Масштабирование с центром в (50,50)
Это особенно полезно при анимации объектов, где центр вращения или масштабирования отличается от геометрического центра элемента.
Для сложных последовательных трансформаций можно использовать матрицы:
var m = new Snap.Matrix();
m.translate(100, 50);
m.rotate(45, 0, 0);
m.scale(1.5, 1.5);
element.transform(m);
Преимущества матриц:
Snap.svg поддерживает анимацию трансформаций через метод
animate:
element.animate({ transform: "t100,50r90s1.2,1.2" }, 2000, mina.easeinout);
Особенности:
.translate(),
.rotate() и .scale() для динамического
обновления позиции элемента.mina предоставляет набор кривых ускорения, влияющих на
скорость анимации.Локальные и глобальные трансформации:
Перемещения и вращения могут быть относительно текущего состояния или
абсолютными. Методы .transform() и .matrix()
позволяют контролировать этот аспект.
Сложные комбинации: Цепочки могут содержать перемещения, повороты, масштабирование и даже наклон через матрицы. Например:
element.transform("t50,50r30,100,100s2,2");
Здесь:
Сохранение состояния: Snap.svg позволяет
получить текущее преобразование через
element.transform().localMatrix, что облегчает создание
динамических или интерактивных эффектов.
var s = Snap(400, 400);
var circle = s.circle(50, 50, 40).attr({ fill: "#f06" });
circle.animate({ transform: "t150,150r360" }, 3000, mina.linear);
Что происходит:
mina.linearЭтот пример демонстрирует, как цепочки трансформаций интегрируются с анимацией, создавая эффект одновременного движения и вращения.
Цепочки трансформаций Snap.svg позволяют строить сложные, динамические визуальные эффекты без необходимости вручную рассчитывать координаты каждого изменения. Понимание последовательности и влияния центра трансформации критично для корректного и предсказуемого поведения объектов.