Как правильно подойти к вопросу: смещение группы в fabric.js?

Ссылка скопирована
1 ответ

По вводным: создаю группу объектов через php массив, и передаю через json в сам fabric.js.
Сейчас ситуация такая: в Группе задаю смещение left и top, но ничего не происходит, не могу найти причину.

Песочница

$horizontalCreasing = [ 'type' => 'group', "name" => "horizontal_creasing", // смещение вниз 'left' => 0, 'top' => self::$height, 'objects' => [], ]; // Объект внутри $crease_5 = [ 'type' => 'line', 'x1' => 0, 'y1' => 0, 'x2' => self::$length - self::$thickness, 'y2' => 0, 'stroke' => self::$creasingColor, 'strokeWidth' => 2, ]; array_push($horizontalCreasing['objects'], $crease_5);
<canvas id="canvas" width="1000" height="600" data-dieline="{{ json_encode($dieline, JSON_HEX_QUOT|JSON_HEX_APOS) }}"></canvas>
import * as fabric from 'fabric'; // Загружаем данные let dataCanvas = document.getElementById('canvas'); let dieline = dataCanvas.dataset.dieline; let json = JSON.parse(dieline); // Fabric.js const canvas = new fabric.StaticCanvas('canvas'); // Обязательная перерисовка после загрузки canvas.loadFromJSON(json, function() { canvas.requestRenderAll(); canvas.toSVG(); });
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Web-разработка Ответ

В fabric.js смещение группы через left и top может “не работать”, если объекты внутри группы уже имеют абсолютные координаты, группа пересчитывает bounding box, или после изменения координат не вызывается setCoords()/requestRenderAll(). Группа в Fabric — это не просто div с left/top; при создании она нормализует координаты дочерних объектов относительно центра/границ группы.

Типичный правильный порядок:

const group = new fabric.Group(objects, {
  left: 100,
  top: 100,
  originX: 'left',
  originY: 'top'
});
 
canvas.add(group);
group.setCoords();
canvas.requestRenderAll();

const group = new fabric.Group(objects, { left: 100, top: 100, originX: 'left', originY: 'top' }); canvas.add(group); group.setCoords(); canvas.requestRenderAll();

Если вы создаёте объекты из JSON/PHP и потом группируете их, сначала убедитесь, что у каждого объекта корректные left/top, а после создания группы не перезаписываете её координаты другим кодом.

Если нужно сдвинуть уже созданную группу:

group.set({
  left: group.left + 50,
  top: group.top + 30
});
group.setCoords();
canvas.requestRenderAll();

group.set({ left: group.left + 50, top: group.top + 30 }); group.setCoords(); canvas.requestRenderAll();

Если внутри группы используются линии/складки/элементы с отрицательными координатами, bounding box может быть не там, где вы ожидаете. Для диагностики временно включите рамку группы или выведите координаты:

console.log(group.left, group.top, group.width, group.height);
group.getObjects().forEach(o =&gt; console.log(o.type, o.left, o.top));

console.log(group.left, group.top, group.width, group.height); group.getObjects().forEach(o =&gt; console.log(o.type, o.left, o.top));

Также проверьте, не используете ли absolutePositioned, clipPath или transformMatrix. Эти параметры могут менять поведение позиционирования.

Итог: задавайте координаты при создании группы, используйте одинаковые origin, после изменения вызывайте setCoords() и requestRenderAll(). Если координаты приходят из PHP/JSON, сначала проверьте их после парсинга и до группировки.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно