要素をドラッグ&ドロップできるようにする - JavaScript

HTMLの要素をドラッグ&ドロップできるようにするJavaScriptのコードを紹介します。

概要

HTML5のドラッグ&ドロップ機能を利用すると、HTMLページの要素をドラッグ&ドロップできるようになります。

プログラム1 : シンプルなドラッグ&ドロップ例

コード

下記のコードを記述します。
SimpleDragDrop.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
  <link rel="stylesheet" href="SimpleDragDrop.css" />
  <script>
    function load() {
      var box = document.querySelector('.box');
      box.addEventListener('dragstart', onDragStart, false);

      var zone = document.querySelector('.dropzone');
      zone.addEventListener('dragover', onDragOver, false);
      zone.addEventListener('drop', onDrop, false);
   }

    function onDragStart(e) {
      e.dataTransfer.setData('text', this.id);
    }

    function onDragOver(e) {
      e.preventDefault();
      this.textContent = 'onDragOver';
    }

    function onDrop(e) {
      e.preventDefault();
      this.textContent = 'onDrop';
    }

  </script>
</head>
<body onload="load();">
  <div class="box" draggable="true"></div>
  <div id="dropzone" class="dropzone"></div>
</body>
</html>
SimpleDragDrop.css
.box {
  width:32px;
  height:32px;
  border:solid 1px #002f9f;
}

.dropzone {
  margin-top:16px;
  margin-bottom:16px;
  width: 280px;
  height: 64px;
  border: solid 1px #808080;
}

解説

  <div class="box" draggable="true"></div>
  <div id="dropzone" class="dropzone"></div>
ページには上記のDIV枠を2つ表示します。class="box"のほうがドラッグできるオブジェクト、id="dropzone"のほうがドロップ受け入れ領域のdiv枠になります。ドラッグできるオブジェクトには、draggable="true" を指定してドラッグ可能オブジェクトに設定します。

    function load() {
      var box = document.querySelector('.box');
      box.addEventListener('dragstart', onDragStart, false);

      var zone = document.querySelector('.dropzone');
      zone.addEventListener('dragover', onDragOver, false);
      zone.addEventListener('drop', onDrop, false);
   }

    function onDragStart(e) {
      e.dataTransfer.setData('text', this.id);
    }

    function onDragOver(e) {
      e.preventDefault();
      this.textContent = 'onDragOver';
    }

    function onDrop(e) {
      e.preventDefault();
      this.textContent = 'onDrop';
    }
上記のコードにより、各要素にドラッグ&ドロップのイベントを割り当てています。
ドラッグされる要素には、"dragstart" イベントを設定しています。ドラッグが開始されると onDragStart 関数が実行されます。
ドロップ対象の要素には、"dragover" "drop"イベントを設定しています。ドラッグされた要素がドロップエリアに入ると、onDragOver関数が実行され、要素がドロップされると onDrop関数が実行されます。
dragstartのイベントでは、dataTransferオブジェクトに値を設定するコードを記述しています。今回はdataTransferに挿入した値は利用していませんが、このコードがないとドロップが開始されないブラウザがあるため、データの利用が無い場合でも記述します。

実行結果

上記のHTMLファイルをWebブラウザで表示します。下図の画面が表示されます。


上部の正方形の枠をドラッグします。下の枠にドラッグすると、枠内に"onDragOver"の文字が表示されます。


枠の中でドロップすると、枠内に"onDrop"の文字が表示されます。

プログラム2 : イベントを追加したドラッグ&ドロップ例

コード

下記のコードを記述します。
SimpleDragDrop2.html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
  <link rel="stylesheet" href="SimpleDragDrop2.css" />
  <script>
    function load() {
      var box = document.querySelector('.box');
      box.addEventListener('dragstart', onDragStart, false);
      box.addEventListener('dragend', onDragEnd, false);

      var box = document.querySelector('.dropzone');
      box.addEventListener('dragenter', onDragEnter, false);
      box.addEventListener('dragover', onDragOver, false);
      box.addEventListener('dragleave', onDragLeave, false);
      box.addEventListener('drop', onDrop, false);
    }

    function onDragStart(e) {
      e.dataTransfer.setData('Text', this.id);
      this.textContent = 'onDragStart';
    }

    function onDragEnd(e) {
      this.textContent = 'onDragEnd';
    }

    function onDragEnter(e) {
      this.textContent = 'onDragEnter';
    }
    
    function onDragOver(e) {
      e.preventDefault();
      this.textContent = 'onDragOver';
    }

    function onDragLeave(e) {
      this.textContent = 'onDragLeave';
    }

    function onDrop(e) {
      e.preventDefault();
      this.textContent = 'onDrop';
    }
  </script>
</head>
<body onload="load();">
  <div id="box" class="box" draggable="true"></div>
  <div id="dropzone" class="dropzone"></div>

</body>
</html>
SimpleDragDrop.css
.box {
  width:32px;
  height:32px;
  border:solid 1px #d01313;
}

.dropzone {
  margin-top:16px;
  margin-bottom:16px;
  width: 280px;
  height: 64px;
  border: solid 1px #808080;
}

解説

  <div class="box" draggable="true"></div>
  <div id="dropzone" class="dropzone"></div>
ページには先の例と同様にDIV枠を2つ表示します。ドラッグできるオブジェクトには、draggable="true" を指定してドラッグ可能オブジェクトに設定します。

    function load() {
      var box = document.querySelector('.box');
      box.addEventListener('dragstart', onDragStart, false);
      box.addEventListener('dragend', onDragEnd, false);

      var box = document.querySelector('.dropzone');
      box.addEventListener('dragenter', onDragEnter, false);
      box.addEventListener('dragover', onDragOver, false);
      box.addEventListener('dragleave', onDragLeave, false);
      box.addEventListener('drop', onDrop, false);
    }

    function onDragStart(e) {
      e.dataTransfer.setData('Text', this.id);
      this.textContent = 'onDragStart';
    }

    function onDragEnd(e) {
      this.textContent = 'onDragEnd';
    }

    function onDragEnter(e) {
      this.textContent = 'onDragEnter';
    }
    
    function onDragOver(e) {
      e.preventDefault();
      this.textContent = 'onDragOver';
    }

    function onDragLeave(e) {
      this.textContent = 'onDragLeave';
    }

    function onDrop(e) {
      e.preventDefault();
      this.textContent = 'onDrop';
    }
上記のコードにより、各要素にドラッグ&ドロップのイベントを割り当てています。
ドラッグされる側の要素には、"dragstart", "dragend" イベントを割り当てています。ドラッグを開始すると、onDragStart関数、ドラッグが終了すると、onDragEnd関数が呼び出されます。
ドロップされる側の要素には、"dragenter", "dragover", "dragleave", "drop"イベントを割り当てています。ドラッグされた要素がドロップ領域に入ると、onDragEnter関数が実行され、ドロップ領域内をドラッグされている状態ではonDragOver関数が実行され、ドラッグされた要素がドロップ領域から出ると onDragLeave関数が実行されます。ドラッグされた要素がドロップされると、onDrop関数が実行されます。

実行結果

上記のHTMLファイルをWebブラウザで表示します。下図の画面が表示されます。


赤枠の正方形の領域をドラッグします。領域内に"onDragStart"の文字が表示されます。


ドロップ領域以外でドラッグを終了すると、赤枠の領域に"onDragEnd"の文字が表示されます。


再び赤枠の領域をドラッグします。ドロップ領域に重なると、ドロップ領域に"onDragOver"の文字が表示されます。


ドロップ領域内にドラッグした赤枠の領域をドロップすると、ドロップ領域に"onDrop"の文字が表示されます。


再度赤枠をドラッグしてドロップ領域に重ねます。"onDragOver"の文字が表示されます。


そのままドラッグして、ドロップ領域の外にドラッグします。ドロップ領域の文字の表示が"onDragLeave"に変わります。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-06
作成日: 2016-09-28
iPentec all rights reserverd.