Paper.js предоставляет гибкие инструменты для интеграции с
HTML-документом, позволяя связывать графические объекты с DOM-элементами
и управлять взаимодействием между ними. Основная точка интеграции — это
объект PaperScope, через который
осуществляется доступ к канвасу и сцене.
Для привязки Paper.js к HTML используется тег
<canvas>. Канвас должен быть идентифицирован через
атрибут id:
<canvas id="myCanvas" width="800" height="600"></canvas>
Инициализация Paper.js происходит через метод setup:
paper.setup('myCanvas');
После этого все объекты Paper.js будут рендериться внутри указанного канваса.
Paper.js можно использовать в связке с любыми HTML-элементами, чтобы взаимодействовать с ними динамически. Например, получение координат мыши относительно канваса:
const canvas = document.getElementById('myCanvas');
canvas.addEventListener('mousemove', (event) => {
const rect = canvas.getBoundingClientRect();
const x = event.clientX - rect.left;
const y = event.clientY - rect.top;
console.log(`Mouse position: (${x}, ${y})`);
});
В Paper.js координаты мыши можно получить через глобальный объект
view:
canvas.addEventListener('mousemove', (event) => {
const point = paper.view.getEventPoint(event);
console.log(point); // Point {x, y}
});
HTML-формы и элементы управления можно связать с графикой Paper.js.
Например, изменение цвета объекта через
<input type="color">:
<input type="color" id="colorPicker" value="#ff0000">
<canvas id="myCanvas" width="800" height="600"></canvas>
paper.setup('myCanvas');
const circle = new paper.Path.Circle({
center: [400, 300],
radius: 50,
fillColor: 'red'
});
document.getElementById('colorPicker').addEventListener('input', (event) => {
circle.fillColor = event.target.value;
});
Paper.js поддерживает динамическое создание и удаление объектов в зависимости от состояния DOM. Например, создание графических элементов на основе списка:
<ul id="pointsList">
<li data-x="100" data-y="150">Point 1</li>
<li data-x="300" data-y="250">Point 2</li>
<li data-x="500" data-y="100">Point 3</li>
</ul>
<canvas id="myCanvas" width="800" height="600"></canvas>
paper.setup('myCanvas');
const pointsList = document.querySelectorAll('#pointsList li');
pointsList.forEach(item => {
const x = parseFloat(item.dataset.x);
const y = parseFloat(item.dataset.y);
const circle = new paper.Path.Circle({
center: [x, y],
radius: 10,
fillColor: 'blue'
});
item.addEventListener('mouseover', () => {
circle.fillColor = 'orange';
});
item.addEventListener('mouseout', () => {
circle.fillColor = 'blue';
});
});
Paper.js имеет собственный цикл обновления через обработчик
onFrame, который можно сочетать с изменениями в HTML:
paper.view.onFr ame = (event) => {
const sliderValue = parseFloat(document.getElementById('sizeSlider').value);
circle.scale(1 + sliderValue * 0.01);
};
HTML-элемент <input type="range" id="sizeSlider">
может управлять размером объекта в реальном времени, создавая
динамическую связь между DOM и Paper.js.
Можно синхронизировать позицию HTML-элемента и графического объекта
Paper.js. Например, перемещение <div> по координатам
объекта:
<div id="marker" style="position:absolute; width:20px; height:20px; background:red;"></div>
paper.view.onFr ame = () => {
const position = circle.position;
const marker = document.getElementById('marker');
marker.style.left = `${position.x - 10}px`;
marker.style.top = `${position.y - 10}px`;
};
Такой подход позволяет создавать интерфейсы, где Paper.js отвечает за визуализацию, а HTML-элементы за пользовательский ввод и интерактивность.
Paper.js объекты поддерживают собственные обработчики событий
(onMouseDown, onMouseDrag,
onMouseUp), но их можно комбинировать с событиями HTML:
circle.onMouseD rag = (event) => {
circle.position = event.point;
document.getElementById('coordDisplay').textContent =
`X: ${event.point.x.toFixed(0)}, Y: ${event.point.y.toFixed(0)}`;
};
HTML-элемент <span id="coordDisplay"></span>
обновляется в реальном времени, показывая координаты объекта.
Paper.js позволяет создавать канвасы на лету:
const newCanvas = document.createElement('canvas');
newCanvas.width = 400;
newCanvas.height = 300;
document.body.appendChild(newCanvas);
const newScope = new paper.PaperScope();
newScope.setup(newCanvas);
const rect = new newScope.Path.Rectangle({
point: [50, 50],
size: [100, 100],
fillColor: 'green'
});
Такой подход полезен для интерфейсов с несколькими независимыми визуализациями на одной странице.
Paper.js можно сочетать с CSS для плавных переходов и эффектов:
#overlay {
position: absolute;
top: 0;
left: 0;
transition: transform 0.3s ease;
}
circle.onMouseM ove = () => {
const overlay = document.getElementById('overlay');
overlay.style.transform = `translate(${circle.position.x}px, ${circle.position.y}px)`;
};
Эта техника позволяет объединять векторную графику Paper.js с визуальными эффектами CSS, создавая сложные интерактивные интерфейсы.