React에서 드래그로 요소 크기 조절하기
KaTeX Playground에서 저장된 수식이 길면 사이드바를 넘어 안 보이는 경우가 있습니다.

드래그를 통해 사이드 바의 크기를 조절할 수 있는 기능을 추가했습니다.
작동 원리
먼저 드래그할 부분에 실제로 드래그할 요소를 생성합니다. 이 요소를 엣지라고 부르겠습니다. 엣지를 클릭하면 드래그가 시작되고 드래그에 따라 사이드바의 너비를 변경해 줄 겁니다.
엣지의 mouseDown
이벤트는 드래그의 시작을 알립니다.
드래그가 시작되면 페이지 어디서나 마우스가 움직이면 사이드바를 resize 하도록 document의 mouseMove
이벤트에 resize 이벤트 리스너를 추가합니다. 마우스가 움직이면 mouseMove
이벤트가 발생하고 사이드바가 resize 됩니다.
드래그를 끝내는 mouseUp
이벤트가 페이지 어디에서든 발생하면 mouseMove
이벤트에 등록된 resize를 지워 더 이상 사이드바가 마우스 움직임에 resize 되지 않도록 합니다.
- 엣지에서
mouseDown
이벤트 발생(드래그 시작)- document의
mouseMove
이벤트에 resize 이벤트 리스너 추가(이후 마우스 움직이면 사이드바 resize) - document의
mouseUp
이벤트에 resize 지우는 이벤트 리스너 추가
- document의
- document에서
mouseUp
이벤트 발생(드래그 종료)- document의 resize 이벤트 리스너 제거
mouseUp
이벤트 리스너 제거(once: true)
구현
먼저 엣지를 만들어 사이드바의 직계 자식 노드로 넣어줍니다.
<div className='absolute top-0 bottom-0 w-2 cursor-col-resize left-0' onMouseDown={dragHandler} />
const dragHandler: MouseEventHandler<HTMLDivElement> = (e) => {
const target = e.currentTarget.parentElement;
if (!target) return;
const resize: EventListener = (e) => {
const right = target.getBoundingClientRect().left + target.getBoundingClientRect().width;
const left = (e as MouseEvent).clientX;
const width = Math.max(MIN_WIDTH, right - left);
target.style.width = `${width}px`;
};
document.addEventListener('mousemove', resize);
document.addEventListener('mouseup', () => document.removeEventListener('mousemove', resize), { once: true });
};
엣지를 누르면 dragHandler
가 실행됩니다.
target
은 엣지의 부모노드로 사이드바입니다.
'Toy Projects > KaTeX Playground' 카테고리의 다른 글
[KaTeX Playground] 자주 쓰는 수식을 저장, 공유해 보세요! (0) | 2023.09.18 |
---|
React에서 드래그로 요소 크기 조절하기
KaTeX Playground에서 저장된 수식이 길면 사이드바를 넘어 안 보이는 경우가 있습니다.

드래그를 통해 사이드 바의 크기를 조절할 수 있는 기능을 추가했습니다.
작동 원리
먼저 드래그할 부분에 실제로 드래그할 요소를 생성합니다. 이 요소를 엣지라고 부르겠습니다. 엣지를 클릭하면 드래그가 시작되고 드래그에 따라 사이드바의 너비를 변경해 줄 겁니다.
엣지의 mouseDown
이벤트는 드래그의 시작을 알립니다.
드래그가 시작되면 페이지 어디서나 마우스가 움직이면 사이드바를 resize 하도록 document의 mouseMove
이벤트에 resize 이벤트 리스너를 추가합니다. 마우스가 움직이면 mouseMove
이벤트가 발생하고 사이드바가 resize 됩니다.
드래그를 끝내는 mouseUp
이벤트가 페이지 어디에서든 발생하면 mouseMove
이벤트에 등록된 resize를 지워 더 이상 사이드바가 마우스 움직임에 resize 되지 않도록 합니다.
- 엣지에서
mouseDown
이벤트 발생(드래그 시작)- document의
mouseMove
이벤트에 resize 이벤트 리스너 추가(이후 마우스 움직이면 사이드바 resize) - document의
mouseUp
이벤트에 resize 지우는 이벤트 리스너 추가
- document의
- document에서
mouseUp
이벤트 발생(드래그 종료)- document의 resize 이벤트 리스너 제거
mouseUp
이벤트 리스너 제거(once: true)
구현
먼저 엣지를 만들어 사이드바의 직계 자식 노드로 넣어줍니다.
<div className='absolute top-0 bottom-0 w-2 cursor-col-resize left-0' onMouseDown={dragHandler} />
const dragHandler: MouseEventHandler<HTMLDivElement> = (e) => {
const target = e.currentTarget.parentElement;
if (!target) return;
const resize: EventListener = (e) => {
const right = target.getBoundingClientRect().left + target.getBoundingClientRect().width;
const left = (e as MouseEvent).clientX;
const width = Math.max(MIN_WIDTH, right - left);
target.style.width = `${width}px`;
};
document.addEventListener('mousemove', resize);
document.addEventListener('mouseup', () => document.removeEventListener('mousemove', resize), { once: true });
};
엣지를 누르면 dragHandler
가 실행됩니다.
target
은 엣지의 부모노드로 사이드바입니다.
'Toy Projects > KaTeX Playground' 카테고리의 다른 글
[KaTeX Playground] 자주 쓰는 수식을 저장, 공유해 보세요! (0) | 2023.09.18 |
---|