HTML5 ドラッグ&ドロップの具体的な使用方法について
はじめに
Drag/Dropは、オブジェクトを掴んで好きな場所に配置する、非常に一般的でよく使われる操作です。H5では、ドラッグ&ドロップは標準的な操作で、どんな要素でもドラッグすることができます。しかし! ドラッグ&ドロップを実装するには、ドラッグ&ドロップ属性を追加する必要があります。
H5でのドラッグ&ドロップ属性:dragable: auto | true | false
注意:デフォルトでドラッグ可能なリンクと画像は、dragable プロパティを必要としません。
- Drag (ターゲットがドラッグされたときにイベントを発生させる)
- dragstart - 要素がドラッグを開始したときに発生するイベントです。
- drag - 要素がドラッグされたときに発生します。
- dragend - 要素のドラッグが終了したときに発生します。
- ドロップ(ターゲット領域が解放されたときに発生するイベント)
- dragenter - ドラッグされた要素がターゲット領域内に入ったときに発生します。
- dragover - ドラッグされた要素がターゲット領域内にドラッグされたときに発生します。
- dragleave - ドラッグされた要素がターゲット領域から離れると発生します。
- drop - ドラッグされた要素がターゲット領域にドロップされたときに発生します。
ドラッグの手順
要素属性draggableをtrueに設定する
<main class="main">
<div class="left" id="left">
<div class="txt-show">left area</div>
<div class="dargable txt" id="txt1" draggable="true">movable text one</div>
<div class="dargable txt" id="txt2" draggable="true">movable text two</div>
<div class="dargable txt" id="txt3" draggable="true">Movable text III</div>
<div class="dargable txt" id="txt4" draggable="true">movable text four</div>
<div class="dargable txt" id="txt5" draggable="true">Movable text V</div>
</div>
<div class="right" id="right">
<div class="txt-show">right area</div>
</div>
</main>
ドラッグ
dragstartイベントです。ドラッグ&ドロップすると、dataTransferを通じてデータの保存と取り出しが行われます。1つまたは複数のデータ、1つまたは複数のデータ型を保持することができます。
let left = document.getElementById('left')
let target = document.getElementById('right')
left.addEventListener('dragstart', (event) => {
const target = event.target;
// The dataTransfer can be set (setData) at the start event (ondragstart) of the item dragging.
// Drag and drop, dataTransfer property, equivalent to transporter
// Later get it with dataTransfer.getData
// You can get the value in the dataTransfer object at the end of the project drag.
event.dataTransfer.setData('Text', target.id)
// js events have a bubbling mechanism
console.log('drag started dragging 1');
})
dragイベント:ドラッグ&ドロップ時に常に実行されます。
left.addEventListener('drag', (event) => {
console.log('drag is dragging 2');
})
dragend イベント: 終了
left.addEventListener('dragend', (event) => {
console.log('dragend dragging is over 7');
})
配置
dragenter、dragleaveイベント:ターゲットエリアへの進入、ターゲットエリアからの退出
target.addEventListener('dragenter', (event) => {
console.log('dragenter has entered the zone 3')
})
target.addEventListener('dragleave', (event) => {
console.log('dragleave left the drag area now 5')
})
ドラッグオーバーイベント。デフォルトでは、データ/要素を他の要素に配置することはできません。配置を許可するように設定する必要がある場合、要素のデフォルトの動作をブロックする必要があります。
target.addEventListener('dragover', (event) => {
// Block the default behavior
event.preventDefault();
console.log('dragover is dragging in the region 4')
})
ドロップイベント:ドロップ
target.addEventListener('drop', (event) => {
console.log('drop released the mouse 6')
let drag_id = event.dataTransfer.getData('text')
target.appendChild(document.getElementById(drag_id))
})
フルコード
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.main {
display: flex;
justify-content:space-around;
}
.left {
width: 300px;
height: 500px;
border: 1px solid lightseagreen;
margin-right: 10px;
/* background-color: green; */
}
.right {
width: 300px;
height: 500px;
border: 1px solid lightseagreen;
text-align: center;
padding: 1px;
/* background: red; */
}
.txt {
border: 1px solid gray;
margin: 1px;
padding: 5px;
cursor: move;
}
</style>
</head>
<body>
<main class="main">
<div class="left" id="left">
<div class="txt-show">left area</div>
<div class="dargable txt" id="txt1" draggable="true">movable text one</div>
<div class="dargable txt" id="txt2" draggable="true">Movable text two</div>
<div class="dargable txt" id="txt3" draggable="true">movable text three</div>
<div class="dargable txt" id="txt4" draggable="true">movable text four</div>
<div class="dargable txt" id="txt5" draggable="true">Movable text V</div>
</div>
<div class="right" id="right">
<div class="txt-show">right area</div>
</div>
</main>
<script>
let left = document.getElementById('left')
let target = document.getElementById('right')
left.addEventListener('dragstart', (event) => {
event.dataTransfer.setData('Text', target.id)
console.log('drag started dragging 1');
})
target.addEventListener('dragstart', (event) => {
const target = event.target;
event.dataTransfer.setData('Text', target.id)
})
left.addEventListener('drag', (event) => {
console.log('drag is dragging 2');
})
left.addEventListener('dragend', (event) => {
console.log('dragend dragging is over 7');
})
target.addEventListener('dragenter', (event) => {
console.log('dragenter entered the area 3')
})
target.addEventListener('dragover', (event) => {
event.preventDefault();
console.log('dragover is dragging in the region 4')
})
left.addEventListener('dragover', (event) => {
event.preventDefault();
})
target.addEventListener('dragleave', (event) => {
console.log('dragleave has left the dragging area 5')
})
target.addEventListener('drop', (event) => {
let drag_id = event.dataTransfer.getData('text')
target.appendChild(document.getElementById(drag_id))
})
left.addEventListener('drop', (event) => {
let drag_id = event.dataTransfer.getData('text')
left.appendChild(document.getElementById(drag_id))
})
</script>
</body>
</html>
ヴィネット
ドラッグスタートイベントはデータの保存と取得にdataTransferを使用し、各イベントオブジェクトはドラッグされるデータを保存するためのDataTransferオブジェクトを持っています。ドラッグスタートイベントの開始時にdataTransferを設定(setData)し、event.dataTransfer.setData()で値を設定、ドラッグ終了時にevent.dataTransfer.getData()でdataTransferオブジェクトの値を取得することが可能です。
ブラウザはデフォルトでデータ/要素を他の要素に配置することができないため、配置を許可する設定が必要な場合は、要素のデフォルトの動作を阻止する必要があります。event.preventDefault()で防止してください。
ドラッグ効果の変更は、cssのスタイルを追加することで行うことができます。例:dragSrc.classList.add('ds'). 要素内のCSSクラスを追加、削除、トグルするには、classListを使用します。classListプロパティは読み取り専用ですが、add()メソッドやremove()メソッドを使って変更することが可能です。
appendChild()メソッドを使用して、ある要素を他の要素に削除します。
HTML DOM addEventListener() メソッド
HTML5のドラッグ&ドロップについては、この記事がすべてです。HTML5のドラッグ&ドロップについては、過去の記事を検索していただくか、引き続き以下の記事をご覧ください。
関連
-
Canvasでイベントを追加する方法を説明する
-
AmazeUI モバイルページ トップナビゲーションバー ヘッダーとサイドナビゲーションバー offCanvas サンプルコード
-
キャンバスの内容を消去する(点消去+線消去)
-
rtmpストリーミングライブのHTML5再生
-
HTML5+CSSでfloatを設定しても、真ん中や間違った行の代わりに移動しない問題
-
顔決済機能の実装をベースにしたHTML5+tracking.js
-
HTML表示 pdf, word, xls, ppt方式例
-
キャンバスラバーバンド線引き塗布方法
-
HTML5で実現する写真・カメラ機能
-
キャンバスに丸みを帯びたアバターを描く方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Html5による大画面データビジュアライゼーション開発の実装
-
キャンバスのdrawImageの使用方法
-
HTML5のSEO最適化のためのいくつかの提案
-
AmazeUIのJSフォーム検証フレームワークの動作を公開
-
AmazeUIがモーダルボックスにフォームを埋め込んでモーダルインプットボックスを形成する
-
html5 on outbound embedded page 通信問題 (postMessage でクロスドメイン通信を解決)
-
HTML5開発によるダイナミックオーディオマップの実装
-
videoタグによるストリーミング読み込みのhtml5実装
-
クロスドメイン・モディフィケーション iframeページのコンテンツ詳細
-
html5でhotcss.jsを使い、携帯電話の自己適合を実現する方法