Paper.js предоставляет мощный инструментарий для работы с векторной графикой на HTML5 Canvas. Одной из ключевых возможностей является управление видимостью и формой объектов с помощью обрезки (clipping) и маскирования (masking). Эти механизмы позволяют создавать сложные композиции, ограничивать области отображения объектов и реализовывать эффект «окна» для вложенных элементов.
Обрезка в Paper.js реализуется через свойство
clipMask или использование специального типа
ClippingGroup. Основная идея — один объект задаёт форму, в
пределах которой будут видны все вложенные элементы.
var rect = new Path.Rectangle({
point: [50, 50],
size: [200, 150],
fillColor: 'blue'
});
var circle = new Path.Circle({
center: [150, 125],
radius: 100,
fillColor: 'red'
});
// Создание группы и установка clipping
var group = new Group([rect, circle]);
rect.clipped = true; // rect выступает маской
Ключевой момент: свойство clipped
определяет объект, который становится маской,
показывающей только пересечение с другими элементами группы.
Path любой формы:Любая векторная форма, будь то кривая Безье или многоугольник, может быть назначена в качестве маски. При этом Paper.js автоматически вычисляет пересечение объектов и отображает только ту часть, которая находится внутри маски.
var star = new Path.Star({
center: [200, 200],
points: 5,
radius1: 60,
radius2: 120,
fillColor: 'green'
});
var image = new Raster('image.jpg');
var clipGroup = new Group([star, image]);
star.clipped = true;
Особенности:
Маска — это способ показать часть объекта на основе
прозрачности другого объекта. В Paper.js это реализуется через свойство
opacityMask или через группы с установленными
blendMode.
var gradient = new Path.Rectangle({
point: [0, 0],
size: [400, 400],
fillColor: {
gradient: {
stops: [['white', 0], ['black', 1]]
},
origin: [0, 0],
destination: [400, 400]
}
});
var raster = new Raster('image.jpg');
raster.position = view.center;
var maskGroup = new Group([raster, gradient]);
gradient.clipped = true; // градиент выступает маской непрозрачности
Особенности:
Paper.js допускает одновременное использование обрезки и маскирования:
var rect = new Path.Rectangle([100, 100], [300, 200]);
var circle = new Path.Circle([250, 200], 100);
circle.fillColor = 'orange';
var group = new Group([rect, circle]);
rect.clipped = true; // обрезка
var gradientMask = new Path.Circle({
center: [250, 200],
radius: 150,
fillColor: 'white'
});
group.addChild(gradientMask);
gradientMask.clipped = true; // дополнительная маска
Важно: порядок объектов в группе имеет значение. Paper.js применяет маску к нижележащим элементам, поэтому маски и обрезающие объекты должны располагаться правильно в иерархии.
Paper.js поддерживает анимацию масок и обрезающих объектов. Изменяя координаты, форму или кривизну маски, можно создавать плавные переходы и интерактивные эффекты.
var mask = new Path.Circle([200, 200], 50);
mask.fillColor = 'black';
var raster = new Raster('image.jpg');
raster.position = view.center;
mask.clipped = true;
view.onFr ame = function(event) {
mask.scale(1 + 0.01 * Math.sin(event.count * 0.1));
};
Эта техника позволяет реализовать эффекты «увеличивающейся области видимости» или динамическое подсвечивание объектов.
Эти механизмы делают Paper.js особенно удобной для создания интерактивной графики, инфографики, сложных UI-компонентов и анимаций, где требуется точный контроль за видимостью объектов и форм.