Адаптивный дизайн в Paper.js строится на динамическом управлении
размером и расположением элементов в зависимости от размера холста.
Холст Paper.js создается через тег <canvas> и
управляется объектом PaperScope. Для обеспечения
адаптивности важна правильная привязка координат и масштабирование
элементов.
const canvas = document.getElementById('myCanvas');
paper.setup(canvas);
function resizeCanvas() {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
paper.view.viewSize = new paper.Size(canvas.width, canvas.height);
}
window.addEventListener('resize', resizeCanvas);
resizeCanvas();
Ключевые моменты:
paper.view.viewSize синхронизируется с размерами
<canvas>.resize позволяет динамически
подстраивать сцену под новые размеры окна.Использование относительных координат вместо абсолютных обеспечивает корректное масштабирование. Например, если нужно создать круг, центрированный в середине окна:
const center = paper.view.center;
const radius = Math.min(paper.view.size.width, paper.view.size.height) * 0.1;
const circle = new paper.Path.Circle(center, radius);
circle.fillColor = 'lightblue';
Особенности:
* 0.1) позволяет элементу
оставаться пропорциональным при изменении окна.Для создания интерфейсных элементов удобно использовать привязку к краям:
function createRectangle(margin = 20) {
const rect = new paper.Path.Rectangle({
point: [margin, margin],
size: [paper.view.size.width - 2 * margin, paper.view.size.height / 4],
fillColor: 'lightgreen'
});
return rect;
}
let header = createRectangle();
Подходы:
point и size вычисляются динамически через
paper.view.size.Для поддержания адаптивности при изменении окна необходимо пересчитывать координаты всех объектов:
function updateScene() {
circle.position = paper.view.center;
header.bounds.width = paper.view.size.width - 40;
}
window.addEventListener('resize', updateScene);
Рекомендации:
bounds для изменения размеров
прямоугольников.position гарантирует
равномерное расположение при любом размере холста.Группы позволяют масштабировать набор объектов как единое целое:
const group = new paper.Group([circle, header]);
group.scale(paper.view.size.width / 800);
Преимущества:
Текстовые объекты также требуют адаптивного подхода:
const text = new paper.PointText({
point: [paper.view.size.width / 2, paper.view.size.height * 0.9],
justification: 'center',
fontSize: paper.view.size.width * 0.03,
fillColor: 'black'
});
Особенности:
fontSize зависит от ширины или высоты холста.justification и point обеспечивают
корректное позиционирование при изменении размеров окна.При создании анимации важно учитывать текущий размер холста:
paper.view.onFr ame = function(event) {
circle.position.x += 2;
if(circle.position.x - circle.bounds.width / 2 > paper.view.size.width) {
circle.position.x = -circle.bounds.width / 2;
}
}
Принцип:
paper.view.size вместо фиксированных
координат позволяет объектам адаптироваться к изменению окна.resize для пересчета координат и
масштабов.Эта структура позволяет создавать интерфейсы и графические сцены в Paper.js, которые автоматически подстраиваются под размер экрана и обеспечивают корректное отображение на любых устройствах.