드롭존

Dropzone

파일을 끌어다 놓을 수 있는 영역. 파일이 위로 올라오면 테두리가 반응해 놓을 수 있음을 알려줍니다.

다른 이름: File dropzoneUpload areaDrag-and-drop uploader
···
html
<div class="dz" id="dz">
  <div class="dzicon" id="dzi">⬆</div>
  <div class="dztext" id="dzt">파일을 끌어다 놓으세요</div>
  <div class="dzfile" id="dzf"><span>📄 report.pdf</span><i>✓</i></div>
</div>
css
.dz{width:min(230px,90%);height:78%;max-height:150px;border:2px dashed var(--line);border-radius:14px;
  display:grid;place-items:center;gap:6px;transition:border-color .2s,background .2s,transform .2s;position:relative}
.dz[data-over]{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 8%, transparent);transform:scale(1.02)}
.dzicon{font-size:20px;color:var(--muted);transition:color .2s}
.dz[data-over] .dzicon{color:var(--accent)}
.dztext{font-size:12px;color:var(--muted)}
.dzfile{position:absolute;display:flex;align-items:center;gap:8px;background:var(--surface);border:1px solid var(--line);border-radius:9px;
  padding:7px 12px;font-size:12px;color:var(--fg);opacity:0;transform:translateY(8px) scale(.9);transition:opacity .25s,transform .25s}
.dzfile[data-show]{opacity:1;transform:translateY(0) scale(1)}
.dzfile i{color:#18c29c;font-weight:700}
js
const dz = document.getElementById('dz'), dzf = document.getElementById('dzf'), dzt = document.getElementById('dzt'), dzi = document.getElementById('dzi');
function loop() {
  dz.setAttribute('data-over', '');
  setTimeout(() => {
    dz.removeAttribute('data-over');
    dzt.style.opacity = '0'; dzi.style.opacity = '0';
    dzf.setAttribute('data-show', '');
    setTimeout(() => {
      dzf.removeAttribute('data-show');
      dzt.style.opacity = ''; dzi.style.opacity = '';
      setTimeout(loop, 900);
    }, 1400);
  }, 900);
}
loop();

드래그로 반응하는 테두리는 장식일 뿐, 실제 파일 선택은 숨겨진 <input type="file">이 맡아야 합니다. 그래야 드롭존 자체를 <label>로 감싸 클릭했을 때도 파일 선택창이 열리고, 키보드로 Tab해 들어와 Enter를 눌러도 동작합니다 — 드래그 앤 드롭은 마우스가 있어야만 가능한 조작이라 반드시 대체 경로가 필요합니다.

인터랙션 로스터의 "drag-and-drop"이 그 끌어놓는 동작 자체를 다룬다면, 드롭존은 그 동작이 적용되는 "표적 영역" UI라는 관계입니다. dragenter/dragover 이벤트에서 preventDefault를 호출하지 않으면 브라우저가 파일을 새 탭으로 열어버리는 흔한 실수를 조심해야 합니다.

파일 형식·용량 제한이 있다면 드롭 즉시가 아니라 드롭 직후 검증하고, 거부된 파일은 이유와 함께 명확히 알려줍니다.