Атрибут draggable и событие dragstart
Делайте элементы перетаскиваемыми и реагируйте на dragstart
«Атрибут draggable и событие dragstart» — бесплатный урок HTML Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения HTML Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс HTML Academy содержит 4 уроков всего.
Атрибут перетаскивания
Любой элемент становится источником перетаскивания, если задать ему draggable="true". Ссылки и изображения можно перетаскивать по умолчанию; для остальных элементов, например контейнеров, элементов списков и строчных элементов, требуется явно указать этот атрибут. Атрибут draggable="false" отключает встроенное перетаскивание элемента.
<div draggable="true" id="card">Drag me</div>Событие начала перетаскивания
Когда пользователь начинает перетаскивание, исходный элемент инициирует событие dragstart. Здесь инициализируйте перетаскивание: запишите, какой элемент перемещается, при необходимости измените его оформление и запишите данные в объект dataTransfer, который прочитает цель сброса.
card.addEventListener("dragstart", (e) => {
e.dataTransfer.setData("text/plain", card.id);
});Без начала перетаскивания ничего не произойдёт
Если пометить элемент как доступный для перетаскивания, но не обрабатывать начало перетаскивания, браузер всё равно будет перемещать изображение ghost, однако данные не будут заданы, поэтому большинство целей сброса отклонит операцию. Всегда сочетайте атрибут перетаскивания с обработчиком начала перетаскивания, который сохраняет хотя бы идентификатор.
Настройка effectAllowed
e.dataTransfer.effectAllowed = "move" в начале перетаскивания ограничивает операцию: «копирование», «перемещение», «ссылка», «copyMove», «все операции» или «ничего». Это определяет вид курсора, который показывает браузер, и значение dropEffect, которое цель может установить позднее.
Добавление визуальной подсказки
Добавьте класс CSS к исходному элементу, чтобы во время перетаскивания он выглядел приглушённым: card.classList.add("dragging"). Удалите класс в событии dragend, чтобы оформление сбрасывалось независимо от того, завершился ли сброс успешно или был отменён клавишей выхода.
Пользовательское изображение перетаскивания
По умолчанию браузер перетаскивает полупрозрачный снимок исходного элемента. Переопределите его с помощью e.dataTransfer.setDragImage(node, offsetX, offsetY) — передайте скрытый элемент DOM или изображение, чтобы показывать пользовательский предпросмотр у курсора.
const ghost = document.getElementById("drag-preview");
card.addEventListener("dragstart", (e) => {
e.dataTransfer.setDragImage(ghost, 20, 20);
});Событие завершения перетаскивания
dragend возникает у исходного элемента после завершения перетаскивания независимо от того, был ли сброс выполнен успешно, произошёл на недопустимой цели или был отменён. Используйте его для очистки: удаляйте класс перетаскивания, скрывайте ghost-предпросмотры и восстанавливайте непрозрачность.
Определение отмены
Внутри события завершения перетаскивания проверьте e.dataTransfer.dropEffect. Если значение — «ничего», сброс не произошёл: цель его отклонила, пользователь нажал клавишу выхода или сбросил объект за пределами страницы. В противном случае значение соответствует операции, выбранной целью сброса: «перемещение», «копирование» или «ссылка».
Перетаскивание на сенсорных устройствах
Встроенное перетаскивание в первую очередь рассчитано на настольные устройства. На сенсорных устройствах этот API почти не работает без полифилла или замены на основе событий указателя. Для удобных на мобильных устройствах интерфейсов изменения порядка используйте библиотеки вроде SortableJS или dnd-kit, которые скрывают различия между двумя моделями событий.
Проблемы доступности
Встроенное перетаскивание не поддерживает управление с клавиатуры — пользователи, работающие только с клавиатурой, не могут менять порядок элементов. Всегда предоставляйте альтернативу: обработчики клавиш со стрелками, кнопки перемещения вверх и вниз или диалог изменения порядка, управляемый атрибутом aria. Перетаскивание должно дополнять другие способы, а не заменять их.
Отключение стандартного поведения браузера
Выделение текста внутри перетаскиваемых элементов может мешать перетаскиванию. Примените CSS user-select: none и -webkit-user-drag: element к исходному элементу, чтобы браузер перетаскивал сам элемент, а не выделял текст внутри него.
Проверка знаний
Почему обычно необходимо добавлять обработчик начала перетаскивания, если одного атрибута draggable="true" уже достаточно, чтобы сделать элемент перетаскиваемым?
Итоги
Помечайте источники как доступные для перетаскивания и используйте начало перетаскивания, чтобы заполнить dataTransfer, установить effectAllowed и при необходимости задать пользовательское изображение перетаскивания. Сочетайте это с завершением перетаскивания для очистки оформления. Предоставляйте альтернативы с клавиатуры для доступности и учитывайте полифиллы для сенсорных устройств.
Часто задаваемые вопросы
Урок «Атрибут draggable и событие dragstart» бесплатный?
Да — полный текст урока «Атрибут draggable и событие dragstart» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс HTML Academy, подпишись на CoddyKit PRO. Курс HTML Academy содержит 4 уроков всего.
Чему я научусь в уроке «Атрибут draggable и событие dragstart»?
Делайте элементы перетаскиваемыми и реагируйте на dragstart Ты практикуешь HTML Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать HTML Academy?
Предыдущий опыт не требуется. HTML Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Атрибут draggable и событие dragstart»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке HTML Academy?
Да. Каждый урок HTML Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Атрибут draggable и событие dragstart
- События dragover и drop
- Объект dataTransfer
- Практическая сортировка списка перетаскиванием