Snap.svg предоставляет гибкие возможности для работы с векторной графикой, включая точный контроль над размерами и пропорциями элементов. Сохранение пропорций важно при масштабировании объектов, чтобы форма оставалась правильной, а изображение не искажалось.
Для изменения размеров элементов используется метод
.transform() или специализированные функции
.attr(). Пропорциональное масштабирование достигается
сохранением соотношения ширины и высоты:
var s = Snap("#svg");
var rect = s.rect(0, 0, 100, 50);
// Масштабирование с сохранением пропорций
var scaleFactor = 2; // коэффициент увеличения
rect.transform('s' + scaleFactor); // 's' = scale
Метод s в трансформации увеличивает объект по обоим осям
одновременно. Если требуется масштабирование относительно определённой
точки, можно указать координаты центра:
rect.transform('s2,2,50,25'); // масштабирование относительно центра прямоугольника
Элемент <svg> поддерживает атрибут
viewBox, который позволяет автоматически подгонять
содержимое под размеры контейнера, сохраняя пропорции. В Snap.svg это
делается через метод .attr():
s.attr({
viewBox: "0 0 200 100",
preserveAspectRatio: "xMidYMid meet"
});
Ключевые моменты:
viewBox задаёт координатную систему для всех
элементов SVG.
preserveAspectRatio управляет поведением при
изменении размеров контейнера:
"xMinYMin meet" — масштабирование, сохраняющее
пропорции, привязка к верхнему левому углу."xMidYMid meet" — масштабирование по центру с
сохранением пропорций."none" — растягивает содержимое без сохранения
пропорций..attr()Snap.svg позволяет напрямую менять ширину и высоту с сохранением пропорций:
var circle = s.circle(50, 50, 40);
var originalRadius = circle.attr("r");
var scaleFactor = 1.5;
circle.attr({
r: originalRadius * scaleFactor
});
Для прямоугольников или эллипсов важно вычислять масштабный коэффициент для каждой оси одинаковым образом:
var rect = s.rect(0, 0, 100, 50);
var scale = 1.8;
rect.attr({
width: rect.attr("width") * scale,
height: rect.attr("height") * scale
});
Snap.svg поддерживает группировку объектов через g().
Масштабирование группы автоматически сохраняет пропорции всех вложенных
элементов:
var group = s.group(rect, circle);
group.transform('s1.5,1.5,0,0'); // масштабирование всей группы относительно начала координат
Это особенно удобно для комплексных композиций, где важно сохранить целостность форм при адаптации под разные размеры.
Можно использовать события, чтобы масштабировать объекты динамически, сохраняя пропорции. Например, привязка к ползунку:
var slider = document.getElementById("scaleSlider");
slider.addEventListener("input", function() {
var scale = this.value;
rect.transform('s' + scale + ',' + scale + ',50,25');
});
В этом примере масштабирование идёт относительно центра прямоугольника, что предотвращает смещение при увеличении или уменьшении.
Для объектов с несоразмерными шириной и высотой можно заранее вычислить коэффициент масштабирования по минимальному или максимальному размеру:
var w = rect.attr("width");
var h = rect.attr("height");
var maxSize = 200;
var scale = Math.min(maxSize / w, maxSize / h);
rect.transform('s' + scale + ',' + scale + ',0,0');
Такой подход гарантирует, что объект вписывается в заданный контейнер, сохраняя исходные пропорции.
Snap.svg предоставляет вспомогательные функции для управления
размерами и трансформациями: .getBBox(),
.getTotalLength(), .clone(). Например:
var bbox = rect.getBBox();
var scale = 150 / bbox.width;
rect.transform('s' + scale);
getBBox() возвращает реальные размеры объекта с учётом
трансформаций, что позволяет корректно вычислять коэффициент
масштабирования для любых фигур.
Эти подходы обеспечивают точное управление размерами и пропорциями объектов в Snap.svg, поддерживая визуальную целостность SVG-графики при динамических изменениях размеров и адаптации под разные экраны.