Для рабочего проекта у меня есть требование ограничить масштабируемый элемент SVG внутри контейнера. У меня есть уменьшенный пример проблемы здесь:
https://codesandbox.io/s/ryzp6x5lkn
В приведенных выше кодах и ящике у меня есть красный rect
, содержащийся в g
(container
) в квадрате svg
(node
).
К container
применен зум 'zoom
'. При увеличении масштаба d3.event.transform
применяется к rect
.
Требуется, чтобы rect
содержался в svg node
во всех масштабах увеличения.
Для этого я применяю zoom.translateExtent
и обновляю его при каждом преобразовании.
const updateTranslateExtent = () => {
const scale = container.property("__zoom").k;
const containerBBox = container.node().getBBox();
const containerTransform = container.node().getCTM();
const containerTranslateX = containerTransform.e;
const containerTranslateY = containerTransform.f;
const viewportWidth = parseInt(node.attr("width"));
const viewportHeight = parseInt(node.attr("height"));
const extent = [
[
(viewportWidth - containerBBox.width - containerTranslateX) / scale * -1,
(viewportHeight - containerBBox.height - containerTranslateY) / scale * -1
],
[
viewportWidth / scale + containerTranslateX * scale,
viewportHeight / scale + containerTranslateY * scale
]
];
zoom.translateExtent(extent);
};
Это работает в определенной степени, но не работает при применении шкалы.
Может ли кто-нибудь с любым опытом работы с зумом d3 помочь мне здесь?
Я пробовал интенсивное поиск в Google и пробную версию + ошибку при расчете экстента, но не смог заставить его работать на 100%.
Заранее спасибо!