При создании пользовательских интерфейсов в 2D-приложениях часто
возникает необходимость масштабировать панели, кнопки, окна и другие
элементы произвольного размера. Простое изменение width и
height у спрайта в PixiJS приводит к искажению изображения:
углы растягиваются, рамки становятся непропорциональными, декоративные
элементы теряют форму.
Для решения этой задачи используется принцип 9-slice (nine-slice scaling) — способ масштабирования, при котором изображение делится на девять областей, каждая из которых масштабируется по своим правилам.
Исходное изображение делится на сетку 3×3:
+----+-----------+----+
| TL | T | TR |
+----+-----------+----+
| L | CENTER | R |
+----+-----------+----+
| BL | B | BR |
+----+-----------+----+
Где:
Благодаря этому кнопка или панель может принимать любые размеры без визуальных искажений рамки.
В PixiJS поддержка 9-slice реализована через класс:
PIXI.NineSlicePlane
Этот класс основан на PIXI.SimplePlane и автоматически
разбивает текстуру на девять частей с заданными отступами.
const panel = new PIXI.NineSlicePlane(
texture,
leftWidth,
topHeight,
rightWidth,
bottomHeight
);
Параметры:
texture — текстураleftWidth — ширина левой фиксированной областиtopHeight — высота верхней фиксированной областиrightWidth — ширина правой фиксированной областиbottomHeight — высота нижней фиксированной областиЭти значения определяют размеры нерастягиваемых областей.
const app = new PIXI.Application({
width: 800,
height: 600
});
document.body.appendChild(app.view);
const texture = PIXI.Texture.from('panel.png');
const panel = new PIXI.NineSlicePlane(
texture,
20, // левая граница
20, // верхняя граница
20, // правая граница
20 // нижняя граница
);
panel.width = 400;
panel.height = 300;
panel.position.set(200, 150);
app.stage.addChild(panel);
В этом примере:
Корректная работа метода напрямую зависит от подготовки графики.
Если границы заданы неверно:
NineSlicePlane позволяет изменять размеры в реальном
времени:
panel.width = 600;
panel.height = 120;
Перерасчёт происходит автоматически.
Это удобно для:
Границы можно изменять динамически:
panel.leftWidth = 30;
panel.rightWidth = 30;
panel.topHeight = 15;
panel.bottomHeight = 15;
После изменения происходит перерасчёт геометрии.
Важно учитывать:
leftWidth + rightWidth не должна превышать ширину
текстурыtopHeight + bottomHeight не должна превышать
высоту текстурыNineSlicePlane создаёт сетку из 4×4 вершин (16 точек),
формируя 9 прямоугольных областей.
При изменении размеров:
Фактически используется модифицированная сетка (mesh), а не девять отдельных спрайтов. Это повышает производительность по сравнению с ручной реализацией через контейнер из 9 объектов.
Преимущества использования NineSlicePlane:
Ручная реализация через 9 спрайтов:
При большом количестве UI-элементов это становится критичным.
const button = new PIXI.NineSlicePlane(texture, 16, 16, 16, 16);
button.width = 200;
button.height = 60;
Для нестандартных форм требуется использование Mesh или
пользовательских шейдеров.
| Подход | Результат |
|---|---|
sprite.scale.set(2) |
Искажение всех элементов |
sprite.width/height |
Пропорциональное растяжение |
NineSlicePlane |
Корректное масштабирование рамок |
Метод 9-slice — стандарт индустрии для UI-графики.
Если границы заданы меньше фактической толщины рамки:
Это может привести к визуальному «пустому» пространству по краям.
Если центр слишком мал, при масштабировании появится сильное растяжение текстуры.
scale, использовать
width и heightconst label = new PIXI.Text('Start', style);
label.anchor.set(0.5);
label.position.set(button.width / 2, button.height / 2);
button.addChild(label);
Текст центрируется внутри масштабируемой кнопки.
app.ticker.add(() => {
panel.width = 300 + Math.sin(Date.now() * 0.005) * 50;
});
NineSlicePlane корректно пересчитывает геометрию при
каждом кадре.
В крупных проектах 9-slice используется как базовый строительный элемент:
Поверх него строится логика состояний (hover, active, disabled) через замену текстур или использование спрайт-листов.
Метод 9-slice в PixiJS является фундаментальным инструментом создания гибких, адаптивных и производительных интерфейсов. Правильная подготовка текстур и корректная настройка границ позволяют создавать UI-элементы произвольного размера без визуальных искажений и с минимальными затратами производительности.