Claude Codeでドラッグ&ドロップを実装する方法
Claude Codeを活用してドラッグ&ドロップ機能の設計・実装を効率化する方法を、並べ替えやファイルアップロードのコード例付きで解説します。
ドラッグ&ドロップの実装パターン
ドラッグ&ドロップは直感的なUIを実現する重要な機能です。リスト並べ替え、カンバンボード、ファイルアップロードなど多くの場面で使われます。Claude Codeを使えば、アクセシブルで堅牢なドラッグ&ドロップを効率よく実装できます。
カスタムフックによる基本実装
> HTML Drag and Drop APIを使ったReactのカスタムフックを作って。
> リストの並べ替えに対応して。
import { useState, useCallback, DragEvent } from 'react';
function useSortable<T extends { id: string }>(initialItems: T[]) {
const [items, setItems] = useState(initialItems);
const [draggedId, setDraggedId] = useState<string | null>(null);
const handleDragStart = useCallback((e: DragEvent, id: string) => {
setDraggedId(id);
e.dataTransfer.effectAllowed = 'move';
e.dataTransfer.setData('text/plain', id);
}, []);
const handleDragOver = useCallback((e: DragEvent, targetId: string) => {
e.preventDefault();
e.dataTransfer.dropEffect = 'move';
if (draggedId === null || draggedId === targetId) return;
setItems((prev) => {
const dragIndex = prev.findIndex((item) => item.id === draggedId);
const targetIndex = prev.findIndex((item) => item.id === targetId);
const newItems = [...prev];
const [removed] = newItems.splice(dragIndex, 1);
newItems.splice(targetIndex, 0, removed);
return newItems;
});
}, [draggedId]);
const handleDragEnd = useCallback(() => {
setDraggedId(null);
}, []);
return { items, draggedId, handleDragStart, handleDragOver, handleDragEnd, setItems };
}
ソート可能なリストコンポーネント
function SortableList({ initialTasks }: { initialTasks: Task[] }) {
const { items, draggedId, handleDragStart, handleDragOver, handleDragEnd } =
useSortable(initialTasks);
return (
<ul role="listbox" aria-label="タスク一覧(並べ替え可能)">
{items.map((task) => (
<li
key={task.id}
draggable
role="option"
aria-grabbed={draggedId === task.id}
onDragStart={(e) => handleDragStart(e, task.id)}
onDragOver={(e) => handleDragOver(e, task.id)}
onDragEnd={handleDragEnd}
className={`p-3 mb-2 rounded border cursor-grab ${
draggedId === task.id ? 'opacity-50 border-blue-400' : 'border-gray-200'
}`}
>
<span>{task.title}</span>
</li>
))}
</ul>
);
}
ファイルドロップゾーン
> ファイルをドラッグ&ドロップでアップロードできるコンポーネントを作って。
> プレビュー表示とバリデーションも。
function FileDropZone({ onFiles, accept, maxSize = 5 * 1024 * 1024 }: DropZoneProps) {
const [isDragging, setIsDragging] = useState(false);
const [errors, setErrors] = useState<string[]>([]);
const validateFiles = (files: File[]): File[] => {
const errs: string[] = [];
const valid = files.filter((file) => {
if (accept && !accept.includes(file.type)) {
errs.push(`${file.name}: 対応していないファイル形式です`);
return false;
}
if (file.size > maxSize) {
errs.push(`${file.name}: ファイルサイズが上限を超えています`);
return false;
}
return true;
});
setErrors(errs);
return valid;
};
const handleDrop = (e: DragEvent<HTMLDivElement>) => {
e.preventDefault();
setIsDragging(false);
const files = Array.from(e.dataTransfer.files);
const valid = validateFiles(files);
if (valid.length > 0) onFiles(valid);
};
return (
<div
onDragOver={(e) => { e.preventDefault(); setIsDragging(true); }}
onDragLeave={() => setIsDragging(false)}
onDrop={handleDrop}
className={`border-2 border-dashed rounded-lg p-8 text-center transition-colors ${
isDragging ? 'border-blue-500 bg-blue-50' : 'border-gray-300'
}`}
>
<p>ファイルをここにドロップ、またはクリックして選択</p>
{errors.map((err, i) => (
<p key={i} className="text-red-500 text-sm mt-1">{err}</p>
))}
</div>
);
}
キーボード操作のサポート
アクセシビリティのためにキーボードでも操作できるようにします。
const handleKeyDown = (e: React.KeyboardEvent, index: number) => {
if (e.key === ' ' || e.key === 'Enter') {
e.preventDefault();
toggleGrabbed(index);
}
if (e.key === 'ArrowUp' && isGrabbed) {
e.preventDefault();
moveItem(index, index - 1);
}
if (e.key === 'ArrowDown' && isGrabbed) {
e.preventDefault();
moveItem(index, index + 1);
}
};
まとめ
Claude Codeを使えば、リスト並べ替えからファイルアップロードまで、多様なドラッグ&ドロップ実装を効率的に構築できます。ファイルアップロードの詳細はファイルアップロード実装を、アクセシビリティ対応はアクセシビリティガイドを参照してください。
HTML Drag and Drop APIの仕様はMDN Web Docsをご覧ください。
無料PDF: Claude Code はじめてのチートシート
まずは無料PDFで基本コマンドと最初の使い方をまとめて確認してください。登録後はそのままテンプレート集や導入相談にも進めます。
スパムは送りません。登録情報は厳重に管理します。
Claude Codeを仕事で使える形にしませんか?
無料PDFで基礎を固めたあと、すぐ使えるテンプレート集で試し、必要なら業務自動化や導入相談まで進められます。
この記事を書いた人
Masa
現役DX室長|Claude Code でゼロから多言語AI技術メディア運営中。実務直結の自動化、AI開発相談・研修受付中。
関連書籍・参考図書
この記事のテーマに関連する書籍を楽天ブックスで探せます。
※ 当サイトは楽天市場のアフィリエイトプログラムに参加しています。上記リンクから商品をご購入いただくと、運営者に紹介料が支払われる場合があります。
関連記事
Claude Codeで使うCLAUDE.mdテンプレート7選 | 実案件にそのまま貼れる例
個人開発、コンテンツサイト、API、チーム開発、レガシー改修向けに、そのまま使えるCLAUDE.mdテンプレート7本をまとめました。
Claude Code の Approval / Sandbox 設定ガイド | 安全に毎日使うための実践ルール
Claude Code を allow・ask・deny・sandbox でどう分けるかを、動く設定例、Hooks、失敗例付きで実践的に解説します。
Claude Code 完全入門ガイド2026|ゼロから実務で使えるまでの7ステップ
Claude Codeを初めて触る方向けの完全入門ガイド。インストールから実際の開発ワークフローへの組み込みまで、Masa自身が最初につまずいたポイントを踏まえて丁寧に解説。