В библиотеке Muuri параметр dragSort
играет ключевую роль в управлении поведением перетаскиваемых элементов и
их взаимодействием с другими контейнерами. Он определяет, может ли
элемент быть перемещен не только внутри своего контейнера, но и между
несколькими контейнерами. Использование этого параметра позволяет
создавать сложные интерфейсы с drag-and-drop, где
объекты динамически меняют свое расположение и принадлежность к
контейнерам.
dragSortdragSort может принимать несколько вариантов:
true Элемент можно перемещать между
контейнерами, если они связаны друг с другом через
dragSort. Все контейнеры, которые должны участвовать в
обмене элементами, должны быть перечислены при инициализации.
false Перетаскивание ограничено
текущим контейнером. Элемент нельзя переместить в другой контейнер, даже
если существует соответствующая конфигурация.
Массив контейнеров Позволяет указать конкретные контейнеры, между которыми возможен обмен элементов. Это гибкий способ управления, когда требуется ограничить перемещение только между определёнными секциями.
При создании Muuri-контейнера dragSort настраивается
через объект dragSort в параметрах:
const grid = new Muuri('.grid', {
dragEnabled: true,
dragSort: true, // Можно передать массив контейнеров вместо true
dragSortPredicate: {
threshold: 50,
action: 'move'
}
});
dragEnabled – обязательно должно быть
true, чтобы dragSort начал работать.dragSortPredicate – определяет, как
происходит сортировка при перемещении, в том числе чувствительность к
положению курсора (threshold) и действие (move
или swap).Для более точного контроля над перемещением элементов используется массив контейнеров:
const grid1 = new Muuri('.grid1', { dragEnabled: true });
const grid2 = new Muuri('.grid2', { dragEnabled: true });
grid1._dragSort = [grid2];
grid2._dragSort = [grid1];
В этом примере элементы могут перемещаться только между
grid1 и grid2. Другие контейнеры, не
включённые в массив, будут игнорироваться.
dragSortPredicateПараметр dragSort тесно связан с
dragSortPredicate, который управляет правилами
сортировки:
threshold – процентное значение,
определяющее, на сколько элемент должен пересечь границу другого
элемента, чтобы произвести перемещение.
action – действие при
пересечении:
'move' – элемент перемещается на новое место, сдвигая
остальные элементы.'swap' – элементы меняются местами.Пример:
const grid = new Muuri('.grid', {
dragEnabled: true,
dragSort: true,
dragSortPredicate: {
threshold: 40,
action: 'swap'
}
});
В этом случае при пересечении 40% площади соседнего элемента произойдет обмен позициями.
В некоторых случаях необходимо запретить перемещение определённых элементов в другие контейнеры, оставляя их только внутри исходного:
const grid = new Muuri('.grid', {
dragEnabled: true,
dragSort: (item, event) => {
return !item.getElement().classList.contains('fixed');
}
});
Здесь используется функция, возвращающая
true или false в зависимости от условий.
Элементы с классом fixed останутся в исходном
контейнере.
Muuri предоставляет несколько событий, которые позволяют отслеживать процесс перетаскивания:
dragStart – начинается перетаскивание
элемента.dragMove – элемент перемещается по
сетке или между контейнерами.dragReleaseEnd – элемент отпущен и
завершил перемещение.Используя их, можно, например, динамически обновлять состояние интерфейса или синхронизировать позиции с сервером.
grid.on('dragReleaseEnd', function(item) {
console.log('Элемент перемещён:', item.getElement());
});
true, чтобы не проверять все доступные
контейнеры.dragSortPredicate.threshold, чтобы избежать случайных
перемещений.dragSort, чтобы новые элементы корректно
участвовали в перетаскивании.const gridA = new Muuri('.gridA', { dragEnabled: true });
const gridB = new Muuri('.gridB', { dragEnabled: true });
gridA._dragSort = [gridB];
gridB._dragSort = [gridA];
gridA.on('dragReleaseEnd', (item) => {
console.log('Элемент из GridA перемещён в:', item.getGrid()._element);
});
gridB.on('dragReleaseEnd', (item) => {
console.log('Элемент из GridB перемещён в:', item.getGrid()._element);
});
В этом примере элементы могут перемещаться только между двумя контейнерами, при этом каждая операция логируется в консоль.
Параметр dragSort является центральным инструментом для
реализации интерактивных и динамических интерфейсов с перетаскиванием,
обеспечивая гибкость и точный контроль над поведением элементов между
контейнерами.