๐ drag and drop ๊ตฌํํ๊ธฐ
์ด๊ฑฐ ๋จน์ด๋ด? ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ ์ฌ์ง์ ์๋ฒ์ ์ ์กํ๊ธฐ ์ํด ์ด๋ค ๊ธฐ๋ฅ์ ๊ตฌํํด๋ณผ๊น ํ๋ค๊ฐ ํ์ ์ฐ๋ฆฌ๊ฐ ์น์ฌ์ดํธ์ ์์ฃผ ๋ณผ ์ ์๋ ๊ธฐ๋ฅ์ธ ํ์ผ์ ์
๋ก๋ํ๋ ค๋ฉด ๋๋๊ทธํ๊ฑฐ๋ ํด๋ฆญํ์ธ์
๋ฅผ ๊ตฌํํด๋ณด๊ณ ์ถ์๋ค. ํด๋น ๊ธฐ๋ฅ์ ๊ตฌ๊ธ๋ง ํด๋ณด๋๊น drag-drop
์ด๋ผ๋ npm
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ์์์ง๋ง, ๊ตณ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์์๋ MDN
์์ ์ ๊ณตํ๋ HTML ๋๋๊ทธ ์ค ๋๋กญ API์ ํตํด์๋ ๊ตฌํํ ์ ์๋ค๊ณ ์๊ฐํ๊ณ ์ง์ ๋ฐ๋๋ผ๋ก ๊ตฌํํ๋ค. ํ๋จ์ gif
๋ฅผ ํตํด ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค. codePen
์ ์์ ์์๋ ํ์ผ ์ ํจ์ฑ ๊ฒ์ฌ ํจ์ ์ฝ๋๋ ์ ๊ฑฐํ๋ค.
See the Pen image-drag-and-drop by an (@YWTechIT) on CodePen.
๐ค ์์ธํ ์ฝ๋๋ ๊นํ๋ธ ์ฐธ๊ณ
์ฐ์ , ํด๋ฆญํ์ฌ ํ์ผ์ ์
๋ก๋๋ฅผ ํ ๋๋ drag
์ด๋ฒคํธ๊ฐ ํ์ํ์ง ์๊ณ ๋์ input
ํ๊ทธ์ addEventListener('change', handleUpdate)
๋ฅผ ๋ถ์ฌ์ ๊ตฌํํ๋ค. ์ด๋ input
์์ฑ์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ๋ค. ๊ฐ attribute
๋ณ๋ก ์ด๋ค ์๋ฏธ๋ฅผ ๋ํ๋ด๋์ง ์ดํด๋ณด์. accept
๋ ํ์ผ ์ ํ์ ์๋ฏธํ๊ณ type
์ ํ์ผ์, required
๋ form
์์์์ ๊ผญ ํ์ํ ๊ฐ์ ์๋ฏธํ๊ณ , multiple
์ ์ฌ๋ฌ ๊ฐ์ ํ์ผ์ ์
๋ก๋ํ ์ ์๋ค. hidden
์ label
์ ์ฐ๊ฒฐํด์ ์ฌ์ฉํ๊ธฐ ์ํด true
๋ก ๋ฃ์ด ๊ฒ์ผ๋ก ๋ณด์ด์ง ์๊ฒ ์ค์ ํ๋ค.
<input id="input" class="input" accept="image/*" type="file" required="true" multiple="true" hidden="true">
์ฌ๊ธฐ์ ์ ๊น ์ง๊ณ ๋์ด๊ฐ ๊ฒ์ด accept
๋ฅผ image/*
๋ก ์ค์ ํ๋ค๊ณ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ์ด๋ฏธ์ง ํ์ผ๋ง ์ฌ๋ฆฐ๋ค๊ณ ์๊ฐํ๋ฉด ํฐ ์ค์ฐ์ด๋ค. MDN
์์๋ input accept
์ ํ์ ์ ํํ ํ์ผ ์ ํ์ ๊ฒ์ฆํ์ง๋ ์์ผ๋ฉฐ, ๋จ์ํ ๋ธ๋ผ์ฐ์ ๊ฐ ์ฌ์ฉ์๋ฅผ ์ฌ๋ฐ๋ฅธ ํ์ผ ์ ํ์ผ๋ก ์ ๋ํ๋๋ก ํํธ๋ฅผ ์ ๊ณตํ ๋ฟ์ด๋ค. ์ฌ์ฉ์๊ฐ ์ต์
์ ๋ฐ๊พธ๋ฉด ๋ค๋ฅธ ํํ์ ํ์ผ๋ ๊ฒ์ํ ์ ์์ผ๋ฏ๋ก ์๋ฒ์ฌ์ด๋์์ ์ ํจ์ฑ ๊ฒ์ฆ์ ํตํด accept
ํน์ฑ์ ๋ณด์กฐํด์ผ ํ๋ค๋ผ๊ณ ๋ช
์๋์ด์๋ค.
๊ทธ๋์ ๋๋ ํ๋ก ํธ๋จ์์ ํํฐ ์ญํ ์ ํ ์ ์๊ฒ ํ์ผ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ถ๊ฐํด์คฌ๋ค. isValidType
์ isValidSize
์ธ ํจ์๋ฅผ ํต๊ณผํ ํ์ผ์ ๋ํด์๋ง ์
๋ก๋ํ ์ ์๊ฒ ์ค์ ํ๋ค.
์ฌ๋ฌ ๊ฐ์ drag event (drag
, dragend
, dragenter
, dragexit
, dragleave
, dragover
, dragstart
, drop
) ์ค dragenter
์ dragleave
์ด๋ฒคํธ๋ก ํด๋น label
์ ๋๋๊ทธํ๋ฉด์ ๋ค์ด์์ ๋์ ๋๊ฐ์ ๋๋ฅผ ๊ฐ์งํ์ฌ hover
๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ , drop
์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ์ label
์ ๋๋กญํ์ ๋ ํ์ผ์ ์
๋ก๋ํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.
๋๋๊ทธ ์ค ๋๋กญ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๋ฉด DataTransfer
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๋๋ฐ, event.dataTransfer?.files
๋ฅผ ํตํด ๋ฐ์ดํฐ ์ ์ก์ ํ์ํ ํ์ผ์ ์ ๋ณด๊ฐ ๋ด๊ฒจ์๋ ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์๊ณ ์ด ๊ฐ์ ํ ๋๋ก forEach
๋ฌธ์ ์ฌ์ฉํด ์ฌ์ฉ์๊ฐ ์ ํํ ํ์ผ ๋ด์ฉ์ ๊ฐ๊ฐ ์ ๊ทผํ์ฌ fileReader
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ ์ด๋ฏธ์ง์ src
๋ฅผ ์ฝ๊ณ (์ด๋ src
๋ base-64 ํํ
) ๋น img
ํ๊ทธ๋ฅผ ๋ง๋ค์ด ์ฌ๊ธฐ์ src
๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ์๋ก์ด ์ด๋ฏธ์ง ํ๊ทธ๊ฐ ๋๋ค. ์ดํ์ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ํ๊ทธ์ append
ํด์ฃผ๋ฉด drag and drop
๊ธฐ๋ฅ์ ๋์ด ๋๋ค.
reference
- MDN: HTML ๋๋๊ทธ ์ค ๋๋กญ API
- MDN: DataTransfer
- MDN: FileReader
- example: jsfiddle.net
๋๊ธ