Интерактивный компонент Drag-and-Drop на Vue

Создание интерактивных интерфейсов с функцией перетаскивания (Drag-and-Drop) может быть сложной задачей, требующей обработки множества событий и управления состоянием. Однако с Vue.js эта задача значительно упрощается. Реактивная природа Vue позволяет легко отслеживать изменения, управлять классами и состоянием элементов в реальном времени, делая процесс создания таких компонентов, как динамические Drop-зоны, более структурированным и предсказуемым.

Ниже представлен рабочий пример компонента. Просто перетаскивайте картинку в «свободные зоны»

Внимание! Представленный код — это готовый компонент, но для его работы на странице должен быть установлен и подключен фреймворк Vue. Если вы начинающий разработчик, просто добавьте строку
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
в раздел <head> вашего HTML, и всё заработает.

Разбор кода интерактивного компонента Drag-and-Drop

Компонент состоит из разметки (HTML), стилей (CSS) и логики (JavaScript) на Vue 3 Composition API.

HTML-структура (Template)

  1. Основа — контейнер #app, внутри которого с помощью директивы v-for создаётся несколько зон (dropzone).
  2. Каждая зона слушает события драг-н-дроп: @dragover.prevent, @dragenter, @dragleave, @drop.
  3. Динамические классы (:class) меняют оформление зоны при наведении (dragover) и элемента при перетаскивании (dragging).
  4. Перетаскиваемый элемент (#draggable) рендерится только в активной зоне (привязан к draggedZoneIndex) и имеет атрибут draggable="true".

Стили (CSS)

  1. Используются современные CSS-свойства (inline-size, block-size).
  2. Переменная CSS (--s) задаёт единый размер для зон.
  3. Визуальные эффекты: изменение фона и границы зоны при наведении (dropzone.dragover), полупрозрачность перетаскиваемого элемента (dragging).
  4. Фоновое изображение для draggable-элемента задаётся через background-image.

Логика на Vue (Script)

Состояние: Реактивные переменные (ref) управляют состоянием перетаскивания (isDragging), индексом текущей зоны (draggedZoneIndex) и массивом самих зон (dropzones).

Обработчики событий:

  1. onDragStart / onDragEnd: Помечают начало и конец перетаскивания, добавляя/удаляя CSS-класс.
  2. onDragEnter / onDragLeave: Управляют флагом isDragover для каждой зоны, что меняет её внешний вид. Используется общий метод handleDragOver.
  3. onDrop: Обрабатывает событие сброса элемента. Меняет draggedZoneIndex, что приводит к перемещению draggable-элемента в новую зону благодаря реактивности Vue.

Принцип работы: Vue автоматически реагирует на изменения в draggedZoneIndex и dropzones, перерисовывая только необходимые части DOM. Это избавляет разработчика от ручного манипулирования элементами.

Нужен уникальный и функциональный интерфейс для вашего проекта?

Наша веб-студия специализируется на создании креативных, производительных и пользовательских веб-решений. Мы готовы воплотить в жизнь любую идею — от сложных drag-and-drop интерфейсов и анимированных виджетов до полноценных веб-приложений. Обращайтесь, и мы разработаем компонент или целый проект, который точно будет соответствовать вашим задачам и удивит ваших пользователей!