Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Drag & Drop APIのDataTransferを使ってみる
Search
mame_daifuku
February 20, 2025
18
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Drag & Drop APIのDataTransferを使ってみる
サンプルアプリ:
https://dnd-sample-two.vercel.app/
リポジトリ:
https://github.com/hiroshi-kato/dnd-sample
mame_daifuku
February 20, 2025
Featured
See All Featured
How to make the Groovebox
asonas
2
2.5k
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
31k
Technical Leadership for Architectural Decision Making
baasie
3
600
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
520
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
2
950
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1k
Designing Experiences People Love
moore
143
24k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
710
The #1 spot is gone: here's how to win anyway
tamaranovitovic
4
1.2k
So, you think you're a good person
axbom
PRO
2
2.2k
Transcript
Drag & Drop APIのDataTransferを使ってみる 発表者: Saul
1. 動機 react-dndって何してるんだろう const [{ opacity }, dragRef] = useDrag(
() => ({ type: ItemTypes.CARD, item: { text }, collect: (monitor) => ({ opacity: monitor.isDragging() ? 0.5 : 1 }) }),[]) const [, drop] = useDrop( () => ({ accept: ItemTypes.KNIGHT, drop: () => moveKnight(x, y) }),[x, y])
2. Drag & Drop APIおさらい
D&Dの歴史 古代: JavaScriptで独自実装されていた 現代(2014年): HTML5のAPIとして標準化 仕様書はこちら
属性 draggable <p id="p1" draggable="true">この要素はドラッグできます。</p>
イベント
インターフェース
3. dataTransfer に触れてみる ケース1:ドロップできるアイテムを制限する ケース2:ドラッグ中のアイテムを変更する サンプルアプリ
ケース1:ドロップできるアイテムを制限する // ドラッグ開始時に Todo の情報を dataTransfer にセットする const handleDragStart =
(e: DragEvent<HTMLLIElement>, todo: Todo) => { e.dataTransfer.setData('application/json', JSON.stringify(todo)); e.dataTransfer.effectAllowed = 'move'; }; // ドロップ時に、対象リストと Todo の list プロパティが一致するかチェック const handleDrop = (e: DragEvent<HTMLDivElement>, targetList: 'A' | 'B') => { e.preventDefault(); const data = e.dataTransfer.getData('application/json'); if (data) { const todo: Todo = JSON.parse(data); if (todo.list === targetList) { if (targetList === 'A') { setDroppedA(prev => [...prev, todo]); } else { setDroppedB(prev => [...prev, todo]); } } else { alert(`この Todo アイテムは ${todo.list} 用です。こちらのリストにはドロップできません。`); } } };
ケース2:ドラッグ中のアイテムを変更する const handleDragStart = (e: DragEvent<HTMLLIElement>, todo: Todo) => {
e.dataTransfer.setData('application/json', JSON.stringify(todo)); e.dataTransfer.effectAllowed = 'move'; // カスタムのドラッグイメージを作成 const dragImage = document.createElement('div'); dragImage.className = 'p-2 bg-black text-white rounded text-sm w-32 text-center'; dragImage.innerText = `Dragging: ${todo.text}`; // 一時的にドキュメントに追加してドラッグイメージに設定 document.body.appendChild(dragImage); e.dataTransfer.setDragImage(dragImage, dragImage.offsetWidth / 2, dragImage.offsetHeight / 2); // ドラッグ開始直後に削除 setTimeout(() => document.body.removeChild(dragImage), 0); };
まとめ react-dndって何してるんだろう わかる気がする!!! const [{ opacity }, dragRef] = useDrag(
() => ({ type: ItemTypes.CARD, item: { text }, collect: (monitor) => ({ opacity: monitor.isDragging() ? 0.5 : 1 }) }),[]) const [, drop] = useDrop( () => ({ accept: ItemTypes.KNIGHT, drop: () => moveKnight(x, y) }),[x, y])
おしまい
参考文献 MDN Web Docs: Drag and Drop API W3C: HTML5
仕様書 react-dnd