Dragula — это легковесная JavaScript-библиотека для реализации перетаскивания элементов между контейнерами и внутри одного контейнера. Библиотека обеспечивает простое API, минимальные зависимости и поддержку современных браузеров. В отличие от более тяжеловесных решений, Dragula фокусируется на базовой функциональности drag-and-drop, что позволяет достигать высокой производительности даже при большом количестве элементов.
Ключевые особенности:
drag, drop,
over, out, cancel.moves и accepts.Для начала работы с Dragula необходимо подключить библиотеку через npm или CDN. После подключения создаётся объект Dragula и передаются контейнеры, в которых будут доступны элементы для перетаскивания:
const drake = dragula([container1, container2], {
moves: (el, source, handle, sibling) => !el.classList.contains('non-draggable'),
accepts: (el, target, source, sibling) => !target.classList.contains('no-drop')
});
Пояснение ключевых опций:
moves — функция, определяющая, можно ли перетаскивать
конкретный элемент. Позволяет исключать элементы по классу или другим
атрибутам.accepts — функция, задающая правила, куда элемент можно
бросать.copy — если установлено в true, элементы
не перемещаются, а копируются.Dragula генерирует события, позволяющие контролировать процесс перетаскивания:
drag — срабатывает при начале перетаскивания.drop — срабатывает после завершения перемещения
элемента.over — при наведении на контейнер.out — при выходе из контейнера.cancel — отмена перемещения.Пример использования:
drake.on('drop', (el, target, source, sibling) => {
console.log(`Элемент ${el.textContent} перемещён из ${source.id} в ${target.id}`);
});
События позволяют интегрировать Dragula с бизнес-логикой приложения и динамически изменять интерфейс в зависимости от действий пользователя.
Dragula разработана с акцентом на высокую производительность. Основные факторы, влияющие на скорость работы:
Количество элементов. Dragula эффективно работает с сотнями элементов. Однако при работе с тысячами DOM-узлов важно использовать виртуализацию или разбиение элементов на группы.
Избежание лишних перерисовок DOM. Перетаскиваемый элемент клонируется и перемещается без перестроения остальной структуры документа. Это снижает нагрузку на браузер и ускоряет отклик интерфейса.
Ограничение обработчиков событий. Dragula использует делегирование событий на контейнеры, что уменьшает количество навешиваемых слушателей и повышает отзывчивость.
Использование классов для стилей перемещения.
Визуальные эффекты перемещения реализуются через CSS-классы
(gu-mirror, gu-transit), что позволяет
браузеру оптимизировать рендеринг без сложных JS-вычислений.
При работе с массивами более 1000 элементов важно учитывать:
appendChild и
removeChild. Dragula оптимизирует перемещение, но
частые манипуляции с большим количеством элементов снижают
производительность.moves и accepts зависят от сложных вычислений,
их лучше предварительно подготовить или использовать мемоизацию.virtual-scroller), чтобы в DOM одновременно было
ограниченное число элементов.drag и
over.Dragula часто применяется для:
В каждом случае ключевой момент — эффективное управление DOM и контроль количества одновременно активных элементов, что позволяет Dragula оставаться производительной даже в сложных интерфейсах.