HTML Drag and Drop
Ранее Geolocation запрашивал координаты после разрешения. Этот урок уходит от координат и знакомит с HTML Drag and Drop: отметить что можно тащить, нести малую нагрузку через dataTransfer и решить, что делать при drop. Практика — draggable, preventDefault, перенос или метка — не sortable-библиотека и не upload-приложение.
Зачем drag and drop в курсе HTML
Новички часто хотят перетащить карточку в коробку. Нативный DnD — первая обычная API. После Geolocation разделение иное: HTML отмечает источники; JS владеет событиями и смыслом drop.
Прямой ответ
1) draggable="true". 2) setData в dragstart. 3) preventDefault на dragover. 4) В drop — getData и смена DOM/UI. 5) Нет особого тега dropzone. 6) Если важно — путь кнопкой/клавиатурой.
📊 dragstart vs dragover vs drop
| Topic | dragstart | dragover | drop |
|---|---|---|---|
| Typical role | Start drag; set dataTransfer | Allow drop (preventDefault) | Apply the result |
| Runs on | Draggable source | Potential target (often) | Drop target |
| Must preventDefault? | Usually no | Yes — so drop can fire | Yes — avoid default navigation quirks |
| Beginner payload | setData("text/plain", id) | — | getData + move/label |
| This course depth | Required | Required | Required (simple move/label) |
Крошечное демо переноса в зону
Синяя коробка draggable; при drop попадает в зону. Без preventDefault на dragover drop часто не срабатывает.
<div id="item" draggable="true" style="padding:8px;background:#cdf;width:120px;">Drag me</div>
<div id="zone" style="margin-top:12px;padding:24px;border:2px dashed #666;">Drop here</div>
<script>
const item = document.getElementById("item");
const zone = document.getElementById("zone");
item.addEventListener("dragstart", function (e) {
e.dataTransfer.setData("text/plain", "item");
});
zone.addEventListener("dragover", function (e) {
e.preventDefault();
});
zone.addEventListener("drop", function (e) {
e.preventDefault();
zone.appendChild(item);
});
</script>
Читаем вызовы переноса
- draggable запускает жест
- dragstart задаёт dataTransfer
- dragover + preventDefault разрешает drop
- drop меняет DOM
- В отличие от Geolocation: нет координат устройства
- Держите демо маленьким
Демо полезной нагрузки dataTransfer
Иногда не переносите тот же узел — несёте текст и показываете при drop, когда несколько источников делят одну цель.
<p id="a" draggable="true" style="display:inline-block;padding:6px;background:#fec;margin-right:8px;">Alpha</p>
<p id="b" draggable="true" style="display:inline-block;padding:6px;background:#cfe;margin-right:8px;">Beta</p>
<div id="tray" style="margin-top:12px;padding:16px;border:2px dashed #444;">Drop a label here</div>
<pre id="note"></pre>
<script>
const tray = document.getElementById("tray");
const note = document.getElementById("note");
function arm(id, label) {
document.getElementById(id).addEventListener("dragstart", function (e) {
e.dataTransfer.setData("text/plain", label);
});
}
arm("a", "Alpha");
arm("b", "Beta");
tray.addEventListener("dragover", function (e) {
e.preventDefault();
});
tray.addEventListener("drop", function (e) {
e.preventDefault();
note.textContent = "Dropped: " + e.dataTransfer.getData("text/plain");
});
</script>
Читаем идею dataTransfer
- setData/getData переносят короткую строку
- text/plain удобен новичкам
- Несколько источников, одна цель
- Не продукт загрузки файлов
- Не Geolocation
- Дальше: web workers
Когда использовать DnD
- Карточка в ясную зону: хороший intro
- Критичное действие без альтернативы: плохо
- Тема: Web Storage
- GPS: был Geolocation
- Полный kanban: за пределами интро
Практика — тащите, бросайте, помечайте
- Проверьте демо переноса.
- Уберите preventDefault и увидьте сбой drop.
- Проверьте демо dataTransfer.
- Опционально: кнопка без перетаскивания.
- Предложение: Geolocation читает координаты; DnD переносит или помечает.
- Предпочитайте реальное окно браузера.
- Впереди: web workers.
Лёгкие ошибки
- Забыть preventDefault на dragover
- UI только DnD без альтернативы
- Ждать тег dropzone
- Путать с Geolocation
- Злоупотреблять DnD вместо кнопки
- Считать интро полным курсом sortable
Итог
- DnD: draggable, dataTransfer и три события
- preventDefault на dragover часто нужен
- HTML отмечает источники; скрипт задаёт drop
- Дайте путь без перетаскивания при необходимости
- Geolocation были координаты; этот урок — перенос/метка указателем
- Далее: web workers
🧠 Проверьте Свои Знания
Проверьте Свои Знания
Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху