В Snap.svg метод translate используется для перемещения
графических элементов по координатной сетке SVG. Он изменяет положение
элемента относительно его исходной позиции, не влияя на его форму,
размеры или другие атрибуты. Синтаксис метода:
element.transform(`translate(dx, dy)`);
где dx — смещение по оси X, dy — смещение
по оси Y. Значения могут быть как положительными, так и отрицательными,
что позволяет перемещать объекты в любом направлении.
Для перемещения отдельного объекта, например прямоугольника или круга:
var s = Snap(400, 400);
var circle = s.circle(50, 50, 40).attr({
fill: "#3498db"
});
circle.transform("translate(100, 150)");
В этом примере круг сначала создается в точке (50, 50), затем
перемещается на 100 пикселей вправо и 150 пикселей вниз. Метод
transform принимает строку с указанием типа трансформации,
а translate — наиболее используемый вариант для сдвига
объектов.
Snap.svg позволяет применять несколько трансформаций одновременно. Например, перемещение с масштабированием:
circle.transform("translate(100, 150) scale(1.5)");
Трансформации выполняются последовательно слева направо: сначала сдвиг, затем масштабирование. Порядок важен, так как он влияет на итоговое положение и размер элемента.
Метод animate в Snap.svg позволяет плавно изменять
положение объекта:
circle.animate({ transform: "translate(200, 100)" }, 1000, mina.easeinout);
Здесь круг плавно перемещается в координаты (200, 100) за 1 секунду. Snap.svg автоматически вычисляет промежуточные состояния трансформации, обеспечивая плавную анимацию. Можно комбинировать несколько свойств, например:
circle.animate({ transform: "translate(200, 100) scale(1.2)" }, 1500, mina.elastic);
Для управления несколькими объектами сразу используют элемент
<g> или объект Paper.group:
var rect1 = s.rect(10, 10, 50, 50).attr({ fill: "#e74c3c" });
var rect2 = s.rect(70, 10, 50, 50).attr({ fill: "#2ecc71" });
var group = s.group(rect1, rect2);
group.transform("translate(100, 50)");
В этом примере оба прямоугольника перемещаются на указанные координаты одновременно. При необходимости к группе можно применять любые трансформации так же, как к отдельным элементам.
Snap.svg интегрируется с обычным JavaScript, позволяя изменять координаты объектов динамически:
var dx = 0;
function moveRight() {
dx += 10;
circle.transform(`translate(${dx}, 0)`);
}
Каждый вызов функции увеличивает смещение по оси X на 10 пикселей, создавая эффект движения. Такой подход удобен для интерактивных интерфейсов и простых игр.
Метод transform заменяет текущую трансформацию. Чтобы
сохранить предыдущие изменения, используют функцию
transform().localMatrix или комбинируют трансформации через
matrix:
circle.transform(circle.transform().localMatrix.translate(50, 0));
В этом случае новый сдвиг добавляется к уже существующему, что предотвращает потерю предыдущих трансформаций.
Snap.svg различает относительные и абсолютные трансформации. Для
относительных сдвигов используют dx и dy в
методе translate. Для абсолютного позиционирования лучше
комбинировать transform с matrix, чтобы задать
точные координаты элемента относительно SVG-контейнера:
var m = new Snap.Matrix();
m.translate(150, 200);
circle.transform(m);
Метод Snap.Matrix позволяет строить сложные цепочки
трансформаций с точным контролем над каждым шагом.
Метод translate тесно связан с rotate,
scale и skew. При комбинировании важно помнить
порядок операций, так как трансформации не коммутативны. Например:
circle.transform("rotate(45) translate(50, 50)");
Отличается от:
circle.transform("translate(50, 50) rotate(45)");
Первый вариант сначала вращает элемент вокруг исходного центра, затем перемещает его, второй — сначала сдвигает, затем вращает вокруг нового положения.
translate лучше комбинировать с
mina-функциями для плавного движения.localMatrix и Snap.Matrix, что упрощает
комбинирование разных типов трансформаций.Метод translate в Snap.svg является базовой и мощной
возможностью для работы с позиционированием графики, обеспечивая
контроль над движением объектов и создавая основу для интерактивной
анимации.