SVG.js предоставляет гибкие инструменты для создания и управления векторной графикой в браузере. Одной из ключевых задач при работе с веб-приложениями является корректное масштабирование графики под различные размеры экранов и плотности пикселей. Векторная природа SVG делает это возможным без потери качества, однако требует правильного подхода к управлению координатами, размерами и трансформациями.
viewBox и preserveAspectRatioГлавный инструмент для адаптивного масштабирования SVG — атрибут
viewBox. Он задаёт координатную систему внутреннего SVG и
определяет, какая область отображается в пределах контейнера.
const draw = SVG().addTo('body').size('100%', '100%');
draw.viewbox(0, 0, 800, 600);
0, 0 задают начальную
точку координат.Атрибут preserveAspectRatio управляет тем, как графика
вписывается в контейнер при изменении его размеров:
xMidYMid meet — сохраняет пропорции, помещая SVG
полностью внутрь контейнера.xMinYMin slice — масштабирует так, чтобы заполнить
контейнер, возможна обрезка.draw.attr('preserveAspectRatio', 'xMidYMid meet');
Использование viewBox и preserveAspectRatio
гарантирует, что все объекты внутри SVG будут масштабироваться
пропорционально, независимо от размеров окна.
SVG.js позволяет изменять размеры отдельных элементов через методы
.scale() и .size().
Пример масштабирования по оси X и Y:
const rect = draw.rect(100, 50).fill('#3498db');
rect.scale(2, 1.5); // ширина увеличена в 2 раза, высота — в 1.5
.scale(sx, sy, cx, cy) — sx и
sy — коэффициенты масштабирования, cx и
cy — точка центра трансформации.Для динамического масштабирования в зависимости от размеров окна
можно использовать обработчик resize:
window.addEventListener('resize', () => {
const scaleX = window.innerWidth / 800;
const scaleY = window.innerHeight / 600;
rect.scale(scaleX, scaleY);
});
<g>) для комплексной трансформацииДля управления масштабированием нескольких объектов одновременно удобно использовать группы.
const group = draw.group();
group.add(draw.circle(50).move(100, 100));
group.add(draw.rect(80, 40).move(50, 150));
// Масштабирование всей группы
group.scale(1.5);
Группы позволяют применять трансформации ко всем вложенным элементам одновременно, что упрощает адаптацию сложных схем под разные экраны.
Для устройств с высокой плотностью пикселей (retina и
аналогичных) важно учитывать коэффициент масштабирования
устройства (window.devicePixelRatio).
const scaleFactor = window.devicePixelRatio || 1;
draw.size(800 * scaleFactor, 600 * scaleFactor);
draw.viewbox(0, 0, 800, 600);
Такой подход обеспечивает чёткое отображение линий и текста на дисплеях с высоким разрешением.
При масштабировании важно корректно задавать размеры шрифтов и толщину линий:
const text = draw.text('SVG.js').font({ size: 24 });
const line = draw.line(0, 0, 200, 0).stroke({ width: 2 });
const scale = window.innerWidth / 800;
text.font({ size: 24 * scale });
line.stroke({ width: 2 * scale });
Таким образом, при изменении размеров контейнера сохраняется визуальная пропорциональность всех элементов, включая текст и контуры.
SVG.js поддерживает анимацию трансформаций через метод
.animate():
rect.animate(1000).scale(2).after(() => {
rect.animate(1000).scale(0.5);
});
Для адаптивного интерфейса это позволяет плавно изменять размеры элементов при изменении окна, обеспечивая красивый визуальный эффект.
devicePixelRatio для высокой плотности
пикселей.Эта последовательность действий позволяет создавать графику, которая сохраняет правильные пропорции, остаётся чёткой и корректно отображается на любых устройствах и экранах.