本記事では、以下のように直感的にアイテムを操作できるドラッグ&ドロップの基本的な実装方法について紹介します。
こちらのブロックをドラッグできます。
ドラッグしたブロックは以下エリアにドロップできます。
HTML / CSS / JavaScript コード
<div class="draggable" draggable="true" id="draggable-item"></div>
<div id="draggable-zone">
<div class="dropzone" id="dropzone"></div>
</div>
実装のポイント
HTML構造:特定の要素をドラッグできるようにする
draggable="true"
属性を設定することで、設定された要素がドラッグできるようになります。
CSSスタイル:ドラッグ&ドロップできそうなスタイルを適用する
cursor: grab;
を設定することで、カーソルが手を開いた形(パー)に変化します。cursor: grabbing;
を設定することで、カーソルが手を握った形(グー)に変化します。
JavaScriptイベント:ドラッグ&ドロップに関する各種イベントを設定する。
dragstart
イベント-
ドラッグが開始されたときに発生します。
draggableItem.addEventListener('dragstart', (e) => { e.dataTransfer.setData('text/plain', draggableItem.id); });
e.dataTransfer.setData('text/plain', draggableItem.id)
は、ドラッグ中に転送するデータを設定します。ここでは、ドラッグする要素のID(第二引数:draggableItem.id
)をテキスト形式(第一引数:text/plain
)で保存しています。これにより、ドラッグされた要素がどれであるかをドロップ先で識別できるようになります。 dragover
イベント-
ドラッグアイテムがドロップゾーン上にある間に発生します。
dropzone.addEventListener('dragover', (e) => { e.preventDefault(); dropzone.style.backgroundColor = 'lightgreen'; });
e.preventDefault()
は、ブラウザのデフォルト動作をキャンセルして、要素をドロップできるようにします。(キャンセルしないとドロップできません。)dropzone.style.backgroundColor = 'lightgreen'
によってドロップゾーンの背景色を変更し、ドロップ可能であることが視覚的にわかるようにしています。 dragleave
イベント-
ドラッグアイテムがドロップゾーンから離れたときに発生します。
dropzone.addEventListener('dragleave', () => { dropzone.style.backgroundColor = 'lightgray'; });
dropzone.style.backgroundColor = 'lightgray'
によって、ドロップゾーンの背景色を元に戻します。 drop
イベント-
ドラッグアイテムがドロップされたときに発生します。
dropzone.addEventListener('drop', (e) => { e.preventDefault(); const id = e.dataTransfer.getData('text'); const draggableElement = document.getElementById(id); dropzone.appendChild(draggableElement); dropzone.style.backgroundColor = 'lightgray'; });
e.preventDefault()
はブラウザのデフォルト動作をキャンセルし、カスタム処理を実行できるようにします。e.dataTransfer.getData('text')
は、ドラッグ開始時に設定されたデータ(要素のID)を取得します。このIDを使って、document.getElementById(id)
でドラッグされた要素を取得します。次に、dropzone.appendChild(draggableElement)
を使って、ドロップされた要素をドロップゾーンに追加します。最後に、dropzone.style.backgroundColor = 'lightgray'
でドロップゾーンの背景色を元に戻します。
<応用例>複数のアイテム&エリア
こちらのブロックをドラッグできます。
ドラッグしたブロックは以下エリアにドロップできます。
HTML / CSS / JavaScript コード
<div id="draggable-box">
<div class="draggable" draggable="true" id="draggable-item-1"></div>
<div class="draggable" draggable="true" id="draggable-item-2"></div>
</div>
<div id="draggable-zones">
<div class="dropzone" id="dropzone1"></div>
<div class="dropzone" id="dropzone2"></div>
</div>
<応用例>アイテムの順序を入れ替える
ドラッグ&ドロップで順序を入れ替える方法については以下記事で解説しています。
より直感的に操作できるUIです。