일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- frontend
- 개발자
- 티셔츠디자인
- 후드
- react
- 옷
- typescript
- 프론트앤드
- brand
- 지속 가능한 개발
- Jeremy Winchester
- 생각정리
- JavaScript
- jeremy
- 티셔츠
- 북 토크
- 책 후기
- 개발자패션
- 개발자옷
- 개발자후드
- 맨투맨
- 개발 책 리뷰
- HTML
- 후드티
- Winchester
- clean code
- 제레미윈체스터
- 브랜드
- 프론트엔드
- 타입스크립트
- Today
- Total
Electronic Jeremy Record
[Javascript] Drag하면 Size가 바뀌는 기능만들기 본문
윈도우에서 윈도우 창 끝에 두면 커서가 화살표로 바뀐다.
화살표를 드래그하면 해당 윈도우 창을 늘이거나 줄일 수 있다 .
이런 기능을 브라우저에서 구현해보려고 한다.
1. 사용할 윈도우 창 만들기
메모장을 만드는 걸로 해보려 한다.
윈도우 창의 우측하단 대각선 드래그 커서를 만드려고 한다.
<div class="memoDiv">
<div class="textDiv"></div>
<button class="sizeBtn"></button>
</div>
HTML을 이렇게 만들고
.memoDiv {
width: 100px;
height: 100px;
background-color: gold;
position: relative;
}
.sizeBtn {
position : absolute;
cursor:move;
right:0;
bottom:0;
padding : 5px;
background-color: transparent;
border : none;
}
CSS는 이렇게 만들었다.
이렇게 노란 메모장에 우측 하단에 마우스 커서가 바뀌는 퍼블리싱을 간단히 완성했다.
이제 기능을 만들어 보자 .
드래그 기능은
마우스다운, 마우스무브, 마우스업 이벤트를 이용해서 만들고자 한다.
계획을 설명하자면
마우스 다운 시 현재 커서의 위치와 메모의 가로세로를 저장해준다.
마우스무브 시 변동되는 커서의 거리를 계산해서 변동되는 크기만큼 메모의 사이즈에 반영해준다.
마우스업 시 사이즈 변경을 끝낸다.
이런 과정으로 만들고자 한다.
먼저 필요한 것을 변수 잡아준다.
//사이즈변경에 사용할 것들
let sizeInfo = {
x: 0,
y: 0,
width: 0,
height: 0,
}
//사이즈가 변경될 메모
const memoObj = document.querySelector(".memoDiv");
//메모의 스타일
const styles = window.getComputedStyle(memoObj);
그 다음 계획대로 먼저 마우스다운 이벤트에 넣은 핸들러를 만들어보자
//사이즈변경에 사용할 것들
let sizeInfo = {
x: 0,
y: 0,
width: 0,
height: 0,
}
//사이즈가 변경될 메모
const memoObj = document.querySelector(".memoDiv");
//메모의 스타일
const styles = window.getComputedStyle(memoObj);
function mouseDownHandler(e){
sizeInfo.x = e.clientX;
sizeInfo.y = e.clientY;
sizeInfo.width = parseInt(styles.width);
sizeInfo.height = parseInt(styles.height);
document.addEventListener('mousemove', mouseMoveHandler);
document.addEventListener('mouseup', mouseUpHandler);
}
메모의 우측하단을 마우스다운 하였을 때
현재 커서의 위치 값을 저장하고, 메모의 사이즈를 저장한다.
그리고 마우스무브와 마우스업의 이벤트를 만들어준다.
이때, 이벤트는 memoObj가 아니라 document가 되어야 마우스의 이동에 따라 포커스가 벗어나는 문제에 대해 지속시킬 수 있다.
이젠 마우스가 움직일 때 변경되는 거리를 기존 사이즈에 더해 스타일에 적용시키는 mouseMoverHandler와
드래그가 끝나고 드랍될때 이벤트를 remove하는 mouseUpHandler 를 마들어보자.
//사이즈변경에 사용할 것들
let sizeInfo = {
x: 0,
y: 0,
width: 0,
height: 0,
}
//사이즈가 변경될 메모
const memoObj = document.querySelector(".memoDiv");
//메모의 스타일
const styles = window.getComputedStyle(memoObj);
function mouseDownHandler(e){
sizeInfo.x = e.clientX;
sizeInfo.y = e.clientY;
sizeInfo.width = parseInt(styles.width);
sizeInfo.height = parseInt(styles.height);
document.addEventListener('mousemove', mouseMoveHandler);
document.addEventListener('mouseup', mouseUpHandler);
}
function mouseMoveHandler(e){
let dx = e.clientX - sizeInfo.x;
let dy = e.clientY - sizeInfo.y;
memoObj.style.width = `${sizeInfo.width + dx}px`;
memoObj.style.height = `${sizeInfo.height + dy}px`;
}
function mouseUpHandler(e){
document.removeEventListener('mousemove', mouseMoveHandler);
document.removeEventListener('mouseup', mouseUpHandler);
}
document.querySelector(".sizeBtn").addEventListener("mousedown",mouseDownHandler);
결과가 아주 이쁘다.
이렇게 만들었지만 사실 드래그 앤 드랍 플러그인이 좋은게 참 많아서
아는게 많을 수록 몸이 편한 법이고
아는게 부족하니 이렇게 몸이 고생하며 만들어 봤다.
그래도 재밋지 아니한가
'기술의기록' 카테고리의 다른 글
[Next.js] Hydration Error Touble Shooting 기록 (4) | 2022.09.17 |
---|---|
[Typescript] type vs interface 언제 써야하는가? (7) | 2022.08.16 |
[React] React Hook Form으로 Form Validation 쉽게 하기 (6) | 2022.03.13 |
[github] gitMessage, git commit 규칙 만들기 (1) | 2022.03.10 |
[TypeScript] tsConfig 설정 방법 (10) | 2022.02.11 |