Я делаю редактор в 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
Как добавить ограничение движения с помощью Transform Translate? ⇐ Javascript
Форум по Javascript
-
Anonymous
1751980630
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, чтобы выяснить, пересекла ли пользователь границу, но я не могу понять, как ограничить движение. Если я добавлю вернуть ложь, движение будет заблокировано.
Подробнее здесь: [url]https://stackoverflow.com/questions/79694263/how-to-add-movement-restriction-with-transform-translate[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия