์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 | 31 |
- ๋คํฌ๋ชจ๋ํ ๊ธ
- ui์ปดํฌ๋ํธ
- ๋คํฌ๋ชจ๋
- ์น์ ๊ทผ์ฑ
- uiux๋์์ธ
- ํ ๋ง์๋์ ํ
- ์ ๊ทผ์ฑ
- ์น๋์์ธ
- preferscolorscheme
- ์๋ฐ์คํฌ๋ฆฝํธ์ปดํฌ๋ํธ
- ์น๊ฐ๋ฐ
- UIUX
- ์ธํฐ๋ ํฐ๋ธui
- ์ฝ๋ฉ์์
- ์คํฌ๋กค์ ๋๋ฉ์ด์
- ์๋ฐ์คํฌ๋ฆฝํธui
- ๋ฐ๋๋ผ์คํฌ๋ฆฝํธ
- ๋ก์ปฌ์คํ ๋ฆฌ์ง
- css๋ณ์
- js์คํฌ๋กค์ด๋ฒคํธ
- ๋ฐ๋๋ผjs
- ์นUI
- UX๋์์ธ
- ์นui๋์์ธ
- ์๋ฐ์คํฌ๋ฆฝํธ
- css์ ๋๋ฉ์ด์
- ํ๋ก ํธ์๋
- JavaScript
- ์คํฌ๋ฆฐ๋ฆฌ๋์ง์
- ๋ฐ์ํ์น
- Today
- Total
UI Code Lab
๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋๋๊ทธ ์ค ๋๋กญ UI ์ปดํฌ๋ํธ ๊ตฌํํ๊ธฐ – ์ค์ ์ฌ๋ก ์ค์ฌ ๋ณธ๋ฌธ
๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋๋๊ทธ ์ค ๋๋กญ UI ์ปดํฌ๋ํธ ๊ตฌํํ๊ธฐ – ์ค์ ์ฌ๋ก ์ค์ฌ
๐ฏ๊ฟ์์ด๐ 2025. 7. 11. 14:39
์น UI์์ ์ฌ์ฉ์์์ ์ํธ์์ฉ์ ์์ฐ์ค๋ฝ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ ์ค ํ๋๊ฐ
๋ฐ๋ก ๋๋๊ทธ ์ค ๋๋กญ ์ธํฐํ์ด์ค(Drag and Drop UI) ์ ๋๋ค.
ํ์ผ ์ฒจ๋ถ, ๋ฆฌ์คํธ ์ ๋ ฌ, ๋์๋ณด๋ ๊ตฌ์ฑ ๋ฑ ๋ค์ํ ์ค๋ฌด ์ฌ๋ก์์ ์ฌ์ฉ๋๋ ์ด ๊ธฐ๋ฅ์
์ฌ์ฉ์ ๊ฒฝํ(UX)์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ด ๊ธ์์๋ ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ(Vanilla JavaScript)๋ฅผ ํ์ฉํ์ฌ
๋ค์ ์ธ ๊ฐ์ง ์ค์ ์ฌ๋ก๋ฅผ ์ค์ฌ์ผ๋ก ๋๋๊ทธ ์ค ๋๋กญ UI๋ฅผ ๊ตฌํํด ๋ณด๊ฒ ์ต๋๋ค.
- โ Gmail ์คํ์ผ์ ํ์ผ ์ฒจ๋ถ ๋๋กญ์กด
- โ TODO ์ฑ์์ ํ ์ผ ์์ ๋ณ๊ฒฝ ๊ธฐ๋ฅ
- โ ๋์๋ณด๋ ์์ ฏ ์์น ์ด๋ UI
๐ 1. ํ์ผ ์ฒจ๋ถ ๋๋กญ์กด UI – Gmail ์คํ์ผ ๊ตฌํ
๋๋๊ทธ ์ค ๋๋กญ ๋ฐฉ์์ผ๋ก ํ์ผ์ ์ฒจ๋ถํ ์ ์๋ UI๋
์ด๋ฉ์ผ, ๊ฒ์ํ, ๊ด๋ฆฌ์ ํ์ด์ง ๋ฑ์์ ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค.
๐ง ์ฃผ์ ๊ธฐ๋ฅ
- dragenter, dragover, drop ์ด๋ฒคํธ๋ฅผ ํ์ฉํ ๋๋กญ์กด ๊ตฌํ
- ์ ๋ก๋๋ ํ์ผ ๋ชฉ๋ก ์ค์๊ฐ ์๊ฐํ
- ํ์ผ ํ์ ํํฐ๋ง ๋ฐ ์ด๋ฏธ์ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ
๐ก UX ๊ฐํ ํ
- ์ฌ์ฉ์๊ฐ ํ์ผ์ ๋๋กญํ ๋ ๋ฐฐ๊ฒฝ์ ๋ณ๊ฒฝ ๋ฑ ์๊ฐ์ ํผ๋๋ฐฑ ์ ๊ณต
- DataTransfer.items๋ฅผ ํ์ฉํด ํด๋ ๋๋๊ทธ ๋ฐฉ์ง ์ฒ๋ฆฌ
dropZone.addEventListener('drop', (e) => {
e.preventDefault();
const files = [...e.dataTransfer.files];
renderFileList(files);
});
๐ 2. ๋ฆฌ์คํธ ์ ๋ ฌ ๊ธฐ๋ฅ – TODO ๋ฆฌ์คํธ ํญ๋ชฉ ์์ ๋ณ๊ฒฝ
๋๋๊ทธ๋ฅผ ํตํด ํ ์ผ ๋ชฉ๋ก์ ์์๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค๋ฉด
์ฌ์ฉ์๋ ๋์ฑ ์ง๊ด์ ์ผ๋ก ๋ฆฌ์คํธ๋ฅผ ์กฐ์ํ ์ ์์ต๋๋ค.
๐ง ์ฃผ์ ๊ธฐ๋ฅ
- ๊ฐ ํญ๋ชฉ์ draggable="true" ์์ฑ ๋ถ์ฌ
- dragstart, dragover, drop ์ด๋ฒคํธ๋ก DOM ์์ ์ถ์ ๋ฐ ์ ๋ ฌ
- insertBefore ๋ฉ์๋๋ฅผ ํ์ฉํด ๋ฆฌ์คํธ ์์ ๋ณ๊ฒฝ
๐ก UX ๊ฐํ ํ
- ๋๋๊ทธ ์ค์ธ ํญ๋ชฉ์ dragging ํด๋์ค ์ถ๊ฐํ์ฌ ์คํ์ผ ๊ฐํ
- ๋๋กญ ์์น์ ์๊ฐ์ ํํธ(placeholder DOM) ์ถ๊ฐ
list.addEventListener('drop', (e) => {
const dragged = document.querySelector('.dragging');
const target = e.target.closest('li');
list.insertBefore(dragged, target);
});
๐ฆ 3. ๋์๋ณด๋ ์์ ฏ ์ด๋ – ๋ฐ์ค ๊ธฐ๋ฐ ๋๋๊ทธ ๊ตฌํ
HTML Drag API ์ธ์๋ mousedown, mousemove, mouseup๋ฅผ ํ์ฉํ
์ปค์คํ ๋ฐฉ์์ ๋๋๊ทธ UI๋ ๊ฐ๋ฅํฉ๋๋ค.
ํนํ ๋์๋ณด๋์ ์นด๋๋ ์์ ฏ ๋ฐฐ์น๋ฅผ ์์ ๋กญ๊ฒ ์กฐ์ ํ ๋ ์ ์ฉํฉ๋๋ค.
๐ง ์ฃผ์ ๊ธฐ๋ฅ
- ์ปค์คํ ์ด๋ฒคํธ ์ฒด์ธ์ผ๋ก ์์น ์ ์ด
- position: absolute์ left/top ์์ฑ ๋ณ๊ฒฝ์ ํตํ ์ด๋
- ์ปค์ ์คํ์ผ ๋ณ๊ฒฝ ๋ฐ ๊ฒฝ๊ณ์ ํํธ ์ถ๊ฐ ๊ฐ๋ฅ
document.addEventListener('mousemove', (e) => {
if (isDragging) {
box.style.left = `${e.pageX - offsetX}px`;
box.style.top = `${e.pageY - offsetY}px`;
}
});
๐ ๋ฐ์ํ & ์ ๊ทผ์ฑ ๊ณ ๋ ค
- ๋ชจ๋ฐ์ผ ๋์์ ์ํด touchstart, touchmove ์ด๋ฒคํธ๋ ๋ณํ ์ฒ๋ฆฌ
- ํค๋ณด๋ ํ์ ๊ฐ๋ฅํ ๊ตฌ์กฐ์ ์๊ฐ์ ํผ๋๋ฐฑ์ ํตํด ์ ๊ทผ์ฑ ๊ฐํ
- ์ํ ์ ์ฅ์ ์ํด localStorage์ ์ฐ๋ํ์ฌ UX ์ง์์ฑ ํ๋ณด
๐ ๊ฒฐ๋ก
๋๋๊ทธ ์ค ๋๋กญ UI๋ ์ฌ์ฉ์ ์ธํฐ๋์ ์ ๊ฐํํ๋ฉด์๋
UX๋ฅผ ๋งค๋๋ฝ๊ฒ ๋ง๋ค ์ ์๋ ์ค์ํ ๊ธฐ๋ฅ์ ๋๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กดํ์ง ์๊ณ ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๊ตฌํํ๋ค๋ฉด
์ฌ์ฌ์ฉ์ฑ๊ณผ ํ์ฅ์ฑ๊น์ง ํ๋ณดํ ์ ์์ต๋๋ค.
์ด ๊ธ์ ์ฌ๋ก๋ค์ ํ์ฉํด
์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ์๋
์์ฐ์ค๋ฌ์ด ๋๋๊ทธ ์ค ๋๋กญ UI๋ฅผ ์ ์ฉํด ๋ณด์ธ์.