Как добавить ограничение движения с помощью Transform Translate?Javascript

Форум по Javascript
Ответить
Anonymous
 Как добавить ограничение движения с помощью Transform Translate?

Сообщение Anonymous »

Я делаю редактор в React. Элементы холста генерируются с использованием HTML. Я добавил функцию для перемещения вокруг холста, используя Transform Translate. Теперь я не могу выяснить, как добавить ограничение, если пользователь прокрутился на границу холста, теперь он может прокручивать бесконечно. Размер самого холста всегда составляет 1920 на 1080 (почти всегда больше, чем родительский Div). < /P>
Вот код для движения и мои попытки добавить ограничение + jsx markup: < /p>
// drag
const [space, setSpace] = useState(false);
const [origin, setOrigin] = useState({ x: 0, y: 0 });
const [translate, setTranslate] = useState({ x: 0, y: 0 });

useEffect(() => {
const scrollDown = (event: KeyboardEvent): void => {
if (event.code === 'Space') {
setSpace(true);
}
};

const scrollUp = (event: KeyboardEvent): void => {
if (event.code === 'Space') {
setSpace(false);
}
};
window.addEventListener('keydown', scrollDown);
window.addEventListener('keyup', scrollUp);
return () => {
window.removeEventListener('keydown', scrollDown);
window.removeEventListener('keyup', scrollUp);
};
}, []);

const clampTranslate =
( x: number, y: number ):
{ x: number; y: number } | false => {
const wrapper = scrollWrapperRef.current;
const canvasWrapper = canvas.current;
if (!wrapper && !canvasWrapper) return { x, y };

const rect = wrapper.getBoundingClientRect();
const canvasRect = canvasWrapper.getBoundingClientRect();

const rectMaxX = rect.left + 50; // left
const rectMinX = rect.right + 50; // right
const rectMaxY = rect.top + 50; // top
const rectMinY = rect.bottom + 50; // bottom

console.log(rectMaxX, rectMinX, rectMaxY, rectMinY, x, y, canvasRect);

if (canvasRect.right < rectMinX) {
console.log('You have gone beyond the right edge');
}

if (canvasRect.left > rectMaxX) {
console.log('You have gone beyond the left edge');
}

if (canvasRect.top > rectMaxY) {
console.log('You have gone beyond the top edge.');
}

if (canvasRect.bottom < rectMinY) {
console.log('You have gone beyond the bottom edge');
}

console.log(maxX, minX, maxY, minY);

return {
x: x,
y: y,
};
};

// trackpad
const handleWheel = (event: React.WheelEvent): void => {
setIsDragging(true);

setTranslate((prev) => {
const next = { x: prev.x - event.deltaX, y: prev.y - event.deltaY };
return clampTranslate(next.x, next.y);
});
};

const handleMouseDown = (event: React.MouseEvent): void => {
if (!space) return;
setIsDragging(true);
setOrigin({ x: event.clientX - translate.x, y: event.clientY - translate.y });

event.preventDefault();
};

const handleMouseMove = (event: React.MouseEvent): void => {
if (!space) return;
if (!isDragging) return;
const newX = event.clientX - origin.x;
const newY = event.clientY - origin.y;

setTranslate(clampTranslate(newX, newY));
};

const handleMouseUp = (): void => {
setIsDragging(false);
};





{(draft || [])?.map((item, index) => {
return (
{
handleLayerClick(item.id);
}}
index={index}
disableDragging={isDragging}
/>
);
})}



;
< /code>
В функции Clamptranslate я могу использовать координаты родительского Div и Canvas, чтобы выяснить, пересекла ли пользователь границу, но я не могу понять, как ограничить движение. Если я добавлю вернуть ложь, движение будет заблокировано.

Подробнее здесь: https://stackoverflow.com/questions/796 ... -translate
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»