Интеграция с HTML элементами

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 к DOM-элементам

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-форм для управления объектами

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 в HTML-страницу с динамическим контентом

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';
    });
});

Интеграция с анимацией и обновлением DOM

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 для позиционирования и взаимодействия

Можно синхронизировать позицию 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-элементы за пользовательский ввод и интерактивность.

Работа с событиями DOM и Paper.js

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> обновляется в реальном времени, показывая координаты объекта.

Динамическое создание канвасов и DOM-связь

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-анимациями

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, создавая сложные интерактивные интерфейсы.