HTML

The HTML "dropzone" attribute was proposed to specify how dropped files (copy, move, or link) are handled as part of drag-and-drop functionality, but it is effectively deprecated because it is hardly supported by modern browsers.

dropzone 属性

dropzone属性とは

属性の概要

dropzone属性は、HTML5のドラフト仕様の段階で提案された、ドラッグアンドドロップ(Drag and Drop)操作をより簡単に扱うための属性です。例えば、<div><section>などの要素に対してdropzoneを指定することで、ユーザーがファイルなどをドラッグ&ドロップしやすくするというのが主な目的でした。

しかし、2023年現在、dropzone属性は実装状況が十分ではなく、公式なHTML Living Standardからは削除されています。ブラウザによっては無視されるか、実験的な機能として対応している可能性があるものの、実質的には利用が推奨されない属性になっています。

ドラッグアンドドロップAPIとの関係

HTML5で導入されたドラッグアンドドロップ機能には、JavaScriptのイベント(dragstart, dragover, dropなど)を使う「Drag and Drop API」が存在します。このAPIを利用すれば、要素をドラッグ可能にしたり、ドロップされたファイルを読み取ったりといった操作が可能です。

dropzone属性はこのAPIの簡易的なものとして位置づけられていましたが、仕様としては完成しておらず、多くのブラウザが正式サポートを見送った経緯があります。

基本的な仕組みと使用例

属性値の種類

本来の仕様上では、dropzone属性には以下のような値を指定することができるとされていました:

copy
ドロップしたファイルやデータを“コピー”扱いにする
move
ドロップしたファイルやデータを“移動”扱いにする
link
ドロップしたファイルやデータを“リンク”扱いにする

複数指定する場合には、スペース区切りで書くことが想定されていました (例: dropzone="copy move")。

しかし、前述の通り実際のブラウザがどこまで正確に対応しているかは定かではありません。

一般的なHTMLでの記述例

もしもdropzoneがブラウザに対応している場合のサンプルは次のようになります:

HTML

<div id="drop-area" dropzone="copy move">
	ここにファイルをドロップしてください
</div>

このコードは、<div>要素に対してcopymoveを指定している例です。ユーザーがファイルをドラッグしてきてこの領域にドロップした時、適切に処理されることを意図します。

ただし、多くのブラウザでは上記のコードだけでは何も起こらず、JavaScriptによるイベントのハンドリングが必要になります。

対応ブラウザと実装状況

主要ブラウザの対応

Chrome
公式に廃止された仕様のため、dropzone属性は無視されると考えられます。
Firefox
同上。無視されると考えられます。
Safari
一部で実験的にサポートしていた報告もありますが、動作が不安定または廃止されている可能性が高いです。
Edge
旧Edge(Edge Legacy)はIEエンジンをベースにしていましたが、dropzoneは有効活用されていません。現在のChromium版Edgeでも基本的にはChromeと同様です。
Internet Explorer
そもそもHTML5の多くのドラフト仕様を部分実装で終えており、dropzoneはサポートしていません。

結論として、dropzone属性はほぼサポートされていないか、常に無視されるという認識でよいでしょう。

サポートされていたとしても、ブラウザ差異が大きく、実践的に使うのは困難です。

実用的な利用方法

上記の通り、dropzone属性自体はブラウザ間でほぼ機能しないため、実践的にドラッグアンドドロップ機能を実装したい場合はJavaScriptのDrag and Drop APIを直接利用するのが一般的です。

Drag and Drop APIの基本的な流れ

ドラッグを開始させる
ドロップ先で受け取る
ファイル読み取り等を行う
ファイルのドラッグアンドドロップ

ファイルをドロップさせるだけなら、フォーム要素の<input type="file">を使う方法のほうが手軽に思えますが、WebアプリケーションのUI/UX向上や、アップロードする前にプレビューを見せる・アップロード枚数を制限するなどの高度な操作をしたい場合は、Drag and Drop APIFile APIを組み合わせることがよくあります。

実践的なサンプルコード

以下は、dropzone属性を実際に書いてはいるものの、あくまで機能を実現しているのはJavaScriptのDrag and Drop APIだという例を示します。dropzone属性が実質機能しなくても、JavaScriptがあればドラッグアンドドロップは動作します。

HTML

<div id="drop-area" dropzone="copy move">
	ここにファイルをドロップしてください
</div>

<script>
	const dropArea = document.getElementById('drop-area');
	
	// ドラッグ要素が領域内に入ってきたとき
	dropArea.addEventListener('dragenter', (event) => {
		event.preventDefault();
		dropArea.classList.add('hover');
	});
	
	// ドラッグ要素が領域内を移動しているとき
	dropArea.addEventListener('dragover', (event) => {
		event.preventDefault();
	});
	
	// ドラッグ要素が領域外に出たとき
	dropArea.addEventListener('dragleave', () => {
		dropArea.classList.remove('hover');
	});
	
	// ファイルがドロップされたとき
	dropArea.addEventListener('drop', (event) => {
		event.preventDefault();
		dropArea.classList.remove('hover');
	
		// ドロップされたファイルを取得
		const files = event.dataTransfer.files;
		if (files.length > 0) {
			alert(`${files.length} 個のファイルがドロップされました。`);
			// ファイルの処理を行う(アップロードやプレビュー表示など)
		}
	});
</script>
ここにファイルをドロップしてください

このサンプルのポイントは以下の通りです:

dropzone属性の代替手段・応用方法

代替手段

Drag and Drop API (JavaScript)
先ほども説明した通り、実際にドラッグアンドドロップを実現する場合はdropzone属性ではなく、JavaScriptのイベントハンドラを用いるのが主流です。
ライブラリの活用

応用方法

ファイルプレビュー
ドロップされた画像やPDFのプレビューを即座に表示する
複数ファイルの同時アップロード
ドラッグしたファイルを一括アップロード
動的なUI変更
ドロップ時に別の要素にファイルの情報を表示するインタラクティブな仕組み
ドラッグ後のカスタム処理
他の要素と組み合わせて、ドラッグ&ドロップで並び替えを行ったり、移動をトリガーにアニメーションをするなど

注意点・よくある誤解

dropzoneは指定するだけでドラッグ&ドロップが完結するわけではない
どのブラウザでも、ほぼ間違いなくJavaScriptによる補完が必要です。
ブラウザ間の挙動が統一されていない
一部のブラウザは独自実装をしていたり、まったく機能しなかったりと差異が大きいです。
HTML標準仕様からも外されている
現行のHTML Living Standardには含まれないため、新規プロジェクトで採用しても長期的にサポートされる可能性が低いです。
セキュリティ面での配慮が必要
ドラッグ&ドロップしたファイルをそのまま実行してしまうような処理は危険です。必ず受け取ったファイル形式・サイズ・内容の検証を行う必要があります。
ユーザー体験を向上させる工夫
ドラッグ中にガイドを表示したり、ドロップ可能領域をハイライトするなど、ユーザーが分かりやすいUIを心がけます。

まとめ