拖拽

Drag Source 指的是被點擊要拖曳的物件,也就是藍色的圓,通常是一個 element Drop Target 指的是拖曳的物件被放置的區域,也就是右邊的綠色區域,通常是一個 div container

事件

Drag Source
Drop Target

dragstart

drag

dragenter

dragenter

dragover

dragleave

drop

dragend

drag:在 drag source 被拖曳時會持續被觸發。 dragover:當拖曳的 drag source 在 drop target 上方時會持續被觸發。

css Style

針對要被拖曳的元素(Drag Source)可以透過 CSS 的屬性設定,避免讓使用者在拖曳該元素時選取到裡面的內容:

[draggable="true"] {
  /*
   To prevent user selecting inside the drag source
  */
  user-select: none;
  -moz-user-select: none;
  -webkit-user-select: none;
  -ms-user-select: none;
}

HTML Attribute

針對能夠被拖曳的元素,在其 HTML 標籤上添加屬性 draggable="true":

<div id="drag-source" draggable="true"></div>

js

針對要被拖曳的元素(dragSource) 監聽 dragstart 事件,並且把要傳遞給 dropTarget 的資料透過 setData 加以設定:

let dragSource = document.querySelector('#drag-source')
dragSource.addEventListener('dragstart', dragStart)

function dragStart (e) {
  console.log('dragStart')
  e.dataTransfer.setData('text/plain', e.target.id)
}

針對要被置放的容器 dropTarget 監聽 drop 事件,來處理當使用者放掉的時候要執行的行為,並透過 getData 來取得傳遞的資料;監聽 dragenter 和 dragover 事件來避免預設行為:

let dropTarget = document.querySelector('#target-container')
dropTarget.addEventListener('drop', dropped)
dropTarget.addEventListener('dragenter', cancelDefault)
dropTarget.addEventListener('dragover', cancelDefault)

function dropped (e) {
  console.log('dropped')
  cancelDefault(e)
  let id = e.dataTransfer.getData('text/plain')
  e.target.appendChild(document.querySelector('#' + id))
}

function cancelDefault (e) {
  e.preventDefault()
  e.stopPropagation()
  return false
}

最后更新于

这有帮助吗?