html5の機能で私が最も驚いたものの一つが、ドラッグ&ドロップです!
それではさっそく、html5を使ったドラッグ&ドロップのサンプルをご紹介しましょう。
まず、html5のドラッグ&ドロップはdraggable (ドラッグエイブル?)属性を指定する必要があります。
draggable属性の値には、true、false、値なし、の3種類があります。
ドラッグ&ドロップができるのは、src属性で指定したimg要素と、href属性が指定された要素になりますのでご注意を!
htmlの記述は下記の通り、
<ul id="cats_name" ondragstart="onDragStart(event)" ondragenter="onDragEnter(event)" ondrop="onDrop(event)" >
<li id="ameshort" draggable="true">アメリカンショートヘアー♀ シルバークラシックタビー</li>
<li id="scottish" draggable="true">スコティッシュフォールド♀ レッドクラシックタビーアンドホワイト</li>
<li id="mainecoon" draggable="true">メインクーン♂ ブラウンマッカレルタビー</li>
<li id="ragdoll" draggable="true">ラグドール♂ ブルーバイカラー</li>
<li id="somali" draggable="true">ソマリ♂ レッド</li>
</ul>
<h2 style="font-size:12px;">毛の長さ</h2>
<ul id="store2" ondragstart="onDragStart(event)"
ondragenter="onDragEnter(event)"
ondragover="onDragOver(event)"
ondrop="onDrop(event)">
<p>長毛種</p>
<li id="nollway" draggable="true">ノルウェージャンフォレストキャット</li>
</ul>
<ul id="store2" ondragstart="onDragStart(event)"
ondragenter="onDragEnter(event)"
ondragover="onDragOver(event)"
ondrop="onDrop(event)">
<p>短毛種</p>
<li id="bengal" draggable="true">ベンガル</li>
</ul>
<ul id="store2" ondragstart="onDragStart(event)"
ondragenter="onDragEnter(event)"
ondragover="onDragOver(event)"
ondrop="onDrop(event)">
<p>オス</p>
</ul>
<ul id="store2" ondragstart="onDragStart(event)"
ondragenter="onDragEnter(event)"
ondragover="onDragOver(event)"
ondrop="onDrop(event)">
<p>メス</p>
</ul>
つまり、
■受け渡し側(ドラックする側)
<ul id="cats_name" ondragstart="onDragStart(event)" ondragenter="onDragEnter(event)" ondrop="onDrop(event)" >
<li id="適当なID" draggable="true">ドラックしたい言葉1</li>
</ul>
■受け取り側(ドロップされる側)
<ul id="store2" ondragstart="onDragStart(event)" ondragenter="onDragEnter(event)" ondragover="onDragOver(event)" ondrop="onDrop(event)">
<li id="適当なID" draggable="true">ドラックしたい言葉2</li>
</ul>
として<head>~</head>に下記のスクリプトを書けばOK!
<script>
//ドラッグ開始処理
function onDragStart(event) {
//要素の対象指定
if (event.target.tagName.toLowerCase() == "li") {
//DataTransferにデータを格納
event.dataTransfer.setData("listItemID", event.target.id);
} else {
event.preventDefault();
}
return true;
}
//Dropイベント
function onDrop(event) {
//ドラッグされたデータ取得
var id = event.dataTransfer.getData("listItemID");
var li = document.getElementById(id);
//もう一方のul要素からli要素を削除、ドロップ先に追加
if (li && li.parentNode != event.currentTaget) {
li.parentNode.removeChild(li);
event.currentTarget.appendChild(li);
}
//イベントストップ
event.stopPropagation();
}
//dragover処理
function onDragOver(event) {
//ドラッグを受け付けのためのキャンセル処理
event.preventDefault();
}
//dragenter処理
function onDragEnter(event) {
//DragTransferの格納データが"listItemID"を含む場合受け付け
var types = event.dataTransfer.types;
for (var i = 0; i < types.length; i++) {
if (types[i] == "listItemID") {
return true;
}
}
}
</script>
ちなみに今回の記述は一度ドラックする側からドロップされる側に言葉を移したら、ドラックする側に言葉を戻すことはできないようになっています。
ただ、ドロップされる側の<li>もドラックできるようにdraggable=”true”にしてあるので、同じようにドラック&ドロップで順番を入れ替えることは可能です。