このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

DataTransfer: setDragImage() メソッド

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨2018年10月⁩.

ドラッグが発生すると、ドラッグ対象(dragstart イベントが発生した要素)から半透明の画像が生成され、ドラッグ中にマウスポインターに沿って移動します。この画像は自動的に作成されるので、自分で作成する必要はありません。ただし、カスタム画像が必要な場合は、DataTransfer.setDragImage() メソッドを使用して、使用するカスタム画像を設定することができます。画像は通常、 <img> 要素になりますが、 <canvas> やその他の可視要素であっても構いません。

メソッドの x 座標と y 座標は、マウスポインターに対する画像の相対的な表示方法を定義します。これらの座標は、マウスカーソルがあるべき画像のオフセットを定義します。例えば、ポインターが中心に来るように画像を表示するには、画像の幅と高さの半分の値を使用します。

このメソッドは dragstart イベントハンドラー内で呼び出す必要があります。

構文

js
setDragImage(imgElement, xOffset, yOffset)

引数

imgElement

ドラッグのフィードバック画像に使用する画像 Element 要素です。

もし Element が img 要素であれば、ドラッグデータストアのビットマップを (その要素に固有のサイズで)その要素の画像に設定します。そうでなければ、ドラッグデータストアのビットマップを、与えられた要素から生成された画像に設定します(そのための正確なメカニズムは現在のところ指定されていません)。

注: もし Element が既存の HTMLElement であれば、ドラッグフィードバック画像として表示するために、ビューポートに表示されている必要があります。あるいは、この目的のために、画面外にあるような新しい DOM 要素を作成することができます。

xOffset

long で、画像内の水平方向のオフセットを示します。

yOffset

long で、画像内の垂直方向のオフセットを示します。

返値

なし (undefined)。

setDragImage() の使用

html
<div>
  <p id="source" draggable="true">
    この要素を選択し、ドロップゾーンにドラッグしてから放すと要素が移動します。
  </p>
</div>
<div id="target">ドロップゾーン</div>
css
div {
  margin: 0em;
  padding: 2em;
}
#source {
  color: blue;
  border: 1px solid black;
}
#target {
  border: 1px solid black;
}
js
const source = document.getElementById("source");
const target = document.getElementById("target");

// 画像を作成してドラッグ画像に使用します。好きな画像の URL を使用してください。
const img = new Image();
img.src = "/shared-assets/images/examples/favicon32.png";

source.addEventListener("dragstart", (ev) => {
  // ドラッグの形式とデータを設定する。データにはイベントターゲットの ID を使用する
  ev.dataTransfer.setData("text/plain", ev.target.id);
  ev.dataTransfer.setDragImage(img, 10, 10);
});

target.addEventListener("dragover", (ev) => {
  ev.preventDefault();
});

target.addEventListener("drop", (ev) => {
  ev.preventDefault();
  // ドロップ対象の ID であるデータを取得
  const data = ev.dataTransfer.getData("text");
  ev.target.appendChild(document.getElementById(data));
});

仕様書

Specification
HTML
# dom-datatransfer-setdragimage-dev

ブラウザーの互換性

関連情報