При работе с графикой важно уметь сохранять соотношение сторон объектов при масштабировании и трансформациях. В SVG.js для этого предусмотрены несколько подходов и методов, которые позволяют управлять размерами элементов без искажения формы.
viewboxviewbox задает область координат для контейнера SVG и
позволяет масштабировать все вложенные элементы пропорционально.
Синтаксис:
const draw = SVG().addTo('body').size(500, 300);
draw.viewbox(0, 0, 500, 300);
Пояснение ключевых моментов:
viewbox(x, y, width, height) задают
виртуальную координатную сетку.size() и viewbox() позволяет
адаптировать графику к разным размерам экрана.scale()Метод scale() используется для изменения размеров
элементов. Существует несколько вариантов:
const rect = draw.rect(100, 50).fill('blue');
rect.scale(2); // Увеличение в 2 раза по обеим осям
rect.scale(1.5, 2); // Разное масштабирование по x и y
Особенности:
size()Метод size(width, height) изменяет размеры объекта, а
для сохранения пропорций часто используют вычисление соотношения:
const circle = draw.circle(100).fill('red');
const ratio = circle.width() / circle.height();
circle.size(150, 150 / ratio);
Принцип работы:
preserveAspectRatioSVG поддерживает атрибут preserveAspectRatio, который
управляет тем, как элемент вписывается в контейнер:
draw.image('example.png').size(300, 200).attr({
preserveAspectRatio: 'xMidYMid meet'
});
Расшифровка значений:
xMidYMid — выравнивание по центру.meet — масштабирование, при котором весь объект
помещается в контейнер без обрезки.slice — объект заполняет весь контейнер, возможна
обрезка частей.При комбинировании трансформаций (поворот, масштаб, смещение) важно соблюдать порядок операций:
rect.scale(2).translate(50, 50).rotate(45);
const group = draw.group();
group.add(rect).add(circle);
group.scale(1.5);
SVG.js предоставляет методы bbox() и
transform() для вычисления размеров и корректного
масштабирования:
const box = rect.bbox();
const scale = Math.min(500 / box.width, 300 / box.height);
rect.transform({ scale });
bbox() возвращает реальные размеры объекта с учетом
всех трансформаций.Для динамического масштабирования с сохранением пропорций удобно
комбинировать animate() и вычисленные коэффициенты:
rect.animate(1000).transform({ scale: 2 });
Эти методы и подходы обеспечивают гибкое управление размерами и пропорциями объектов в SVG.js, делая графику масштабируемой и визуально корректной на любых устройствах.