Dragula — это легкая и удобная библиотека для реализации
перетаскивания элементов в веб-интерфейсах. Одним из ключевых механизмов
управления поведением перетаскиваемых элементов является опция
revertOnSpill, которая определяет, что
должно происходить с элементом, если его перетаскивание не завершилось
успешной операцией «броска» в контейнер.
Опция revertOnSpill отвечает за автоматический возврат
элемента на его исходное место в случае, если он был «брошен» за
пределами допустимой зоны. В Dragula под «spill» понимается ситуация,
когда элемент отпущен вне контейнера, поддерживающего перетаскивание.
Без этой опции элемент останется на месте отпускания, что не всегда
соответствует логике интерфейса.
Тип значения: boolean
true — элемент возвращается на исходное место при
неудачном перетаскивании.false — элемент остается там, где был отпущен
пользователем.dragula([container1, container2], {
revertOnSpill: true
});
В этом примере элементы автоматически возвращаются в исходный
контейнер, если их отпустили вне container1 и
container2.
revertOnSpill тесно связана с системой событий Dragula.
Основные события, влияющие на поведение возврата:
drag — срабатывает при начале
перетаскивания. Позволяет получить доступ к исходному контейнеру и
элементу.drop — срабатывает, когда элемент
успешно помещен в контейнер. Возврат не происходит.cancel — срабатывает при отмене
перетаскивания, например, при отпускании элемента вне контейнеров.
Именно это событие и триггерит поведение
revertOnSpill.При включенной опции revertOnSpill Dragula автоматически
«откатывает» DOM-структуру до состояния до начала перетаскивания,
избегая необходимости писать дополнительный код для возврата.
Опцию можно комбинировать с выборочными контейнерами. Например, если есть несколько контейнеров, можно позволить элементам перемещаться между некоторыми из них, но при попытке бросить их в недопустимые зоны — возвращать на исходное место.
dragula([container1, container2, container3], {
revertOnSpill: true,
accepts: function (el, target, source, sibling) {
return target !== container3; // запрещаем перемещение в container3
}
});
В данном случае элементы могут свободно перемещаться между
container1 и container2. Попытка бросить их в
container3 приведет к срабатыванию механизма возврата.
Возврат элемента не происходит мгновенно. Dragula добавляет классы для плавной анимации:
gu-transit — применяется к элементу в
момент перетаскивания.gu-mirror — копия элемента, которая
следует за курсором.gu-hide — скрывает оригинальный
элемент на время перетаскивания.Когда revertOnSpill активна, Dragula автоматически
возвращает элемент с помощью анимации, используя CSS-переходы, если они
заданы. Для управления скоростью можно использовать:
.gu-mirror, .gu-transit {
transition: transform 0.3s ease;
}
Это делает возврат плавным и визуально приятным.
revertOnSpill хорошо сочетается с такими опциями,
как:
copy — при копировании элементов
оригинал также возвращается, если элемент был «брошен» вне
контейнера.removeOnSpill — если включена
одновременно с revertOnSpill, поведение при броске вне
контейнера нужно контролировать: removeOnSpill удаляет
элемент, revertOnSpill возвращает его. Dragula учитывает
приоритет: возврат имеет преимущество, если обе опции активны.dragula([container1, container2], {
copy: true,
revertOnSpill: true
});
В этой конфигурации оригинальный элемент возвращается в исходное место, а копия может остаться в контейнере назначения.
revertOnSpill в интерфейсах, где важно
сохранить порядок элементов или предотвратить потерю данных.accepts, чтобы задать точные правила допустимых
перемещений.Эта опция обеспечивает надежный контроль за поведением элементов при перетаскивании и позволяет создавать интерфейсы с предсказуемым и безопасным взаимодействием.