Gridstack.js предоставляет мощные возможности для работы с сеткой и
элементами, расположенными в ней, включая детальное управление
перетаскиванием (drag) и изменением размеров
(resize). События перетаскивания позволяют отслеживать
действия пользователя, реагировать на них и управлять поведением
элементов сетки.
Gridstack.js реализует события на уровне элементов и на уровне сетки. Основные события, связанные с перетаскиванием:
dragstart – срабатывает в момент
начала перемещения элемента.drag – срабатывает при каждом
изменении позиции элемента во время перетаскивания.dragstop – срабатывает, когда элемент
отпущен и перемещение завершено.Эти события обеспечивают гибкость: можно отслеживать текущее положение элемента, предотвращать перемещение в определённые зоны, запускать дополнительные действия или сохранять состояние сетки.
Для привязки обработчиков используется стандартный синтаксис jQuery-подобных событий или методы Gridstack:
// Инициализация сетки
var grid = GridStack.init({ /* настройки */ });
// Подписка на события конкретного элемента
grid.on('dragstart', function(event, el) {
console.log('Начало перетаскивания элемента:', el);
});
grid.on('drag', function(event, el) {
console.log('Элемент перемещается:', el);
});
grid.on('dragstop', function(event, el) {
console.log('Элемент перемещен:', el);
});
event – объект события.el – HTML-элемент сетки, который был перемещён.События могут быть также подключены через DOM-элементы:
var item = document.querySelector('.grid-stack-item');
item.addEventListener('dragstart', function(e) {
console.log('Старт перетаскивания через DOM:', e.target);
});
Во время drag или dragstop можно получить
текущие координаты элемента:
grid.on('drag', function(event, el) {
var node = el.gridstackNode; // объект GridstackNode
console.log('Текущие координаты:', node.x, node.y);
});
GridstackNode содержит свойства:
x – горизонтальная позиция в
сеткеy – вертикальная позицияw – ширина в ячейкахh – высота в ячейкахid – идентификатор элементаЭти данные позволяют динамически обновлять информацию о сетке и сохранять её состояние.
Gridstack.js позволяет разрешать или запрещать
перетаскивание элементов с помощью атрибута noMove
или параметра draggable:
grid.addWidget({
x: 0, y: 0, w: 2, h: 2,
content: '<div>Блок</div>',
noMove: true // запрещает перемещение
});
Также можно динамически включать и отключать перетаскивание:
grid.enableMove($('.grid-stack-item'), false); // запретить
grid.enableMove($('.grid-stack-item'), true); // разрешить
Перетаскивание может быть ограничено размерами сетки или конкретными зонами:
acceptWidgets – разрешает принимать
элементы только определённого типа.minWidth / maxWidth /
minHeight / maxHeight – ограничивают
размеры элемента, что влияет на его перетаскивание и изменение
размеров.draggable – объект jQuery UI с
дополнительными настройками (containment,
grid, handle):grid.makeWidget($('.grid-stack-item'), {
draggable: {
containment: '.grid-stack', // перемещение только внутри сетки
grid: [10, 10] // шаг сетки для перемещения
}
});
Можно реализовать логику, при которой элемент при достижении определённой позиции меняет цвет:
grid.on('drag', function(event, el) {
var node = el.gridstackNode;
if (node.x > 5) {
el.style.backgroundColor = 'red';
} else {
el.style.backgroundColor = 'green';
}
});
Такой подход позволяет создавать интерактивные дашборды, где состояние элементов визуально отражает текущие данные.
drag с сохранением состоянияДля сохранения позиции элементов после перетаскивания удобно
использовать dragstop:
grid.on('dragstop', function(event, el) {
var node = el.gridstackNode;
var layout = grid.save(); // сохраняет всю сетку
console.log('Сохранённое состояние сетки:', layout);
});
Метод save() возвращает массив объектов с полной
информацией о всех элементах, что облегчает последующее восстановление
сетки:
grid.load(layout); // восстановление
При создании новых элементов на лету важно привязывать события перетаскивания сразу после добавления:
var newItem = grid.addWidget({x:0, y:0, w:2, h:2, content:'Новый блок'});
grid.on('dragstop', function(event, el) {
if(el === newItem) {
console.log('Новый элемент завершил перетаскивание');
}
});
drag
с помощью requestAnimationFrame или
debounce.dragstop, а не
на каждом шаге перемещения.Эти возможности событий перетаскивания в Gridstack.js создают основу для построения интерактивных, динамичных интерфейсов с гибким управлением элементами сетки, позволяя реализовать сложные сценарии дашбордов, редакторов интерфейсов и других визуальных приложений.