Gridstack.js предоставляет гибкий набор инструментов для управления поведением сетки и её элементов. Одним из ключевых аспектов является возможность блокировать или разблокировать виджеты, чтобы ограничить их перемещение, изменение размера или полностью зафиксировать положение.
Каждый элемент сетки (widget) в Gridstack.js может быть
заблокирован с помощью метода disable()
или через опции locked и static.
Пример через метод:
const grid = GridStack.init();
const widget = grid.addWidget('<div class="grid-stack-item"><div class="grid-stack-item-content">Элемент</div></div>');
// Блокировка виджета: запрет на перемещение и изменение размера
grid.disable(widget);
После вызова disable() виджет не может быть
перемещён или изменён по размеру пользователем. Этот метод
часто используется, когда нужно временно запретить действия над
конкретным элементом сетки.
lockedСвойство locked задаётся при создании виджета или
динамически через метод update():
grid.addWidget(
'<div class="grid-stack-item"><div class="grid-stack-item-content">Блокированный элемент</div></div>',
{ x: 0, y: 0, width: 2, height: 2, locked: true }
);
// Динамическая блокировка
const widgetNode = grid.getCellFromPixel({x: 0, y: 0});
grid.update(widgetNode, { locked: true });
Особенности:
locked: true блокирует и перемещение, и
изменение размера виджета.disable(), locked можно
использовать при инициализации, что удобно для
статичных панелей.staticИногда требуется полностью зафиксировать элемент, чтобы он не реагировал на любые события сетки:
grid.addWidget(
'<div class="grid-stack-item"><div class="grid-stack-item-content">Статический элемент</div></div>',
{ static: true }
);
Разница между locked и
static:
locked позволяет сетке продолжать пересчёт ячеек вокруг
элемента.static делает элемент неподвижным, и
сетка больше не учитывает его при перестройке соседних элементов.Для снятия блокировки используется метод enable() или
обновление свойства locked:
// Разблокировка через метод
grid.enable(widget);
// Динамическая разблокировка через update
grid.update(widgetNode, { locked: false });
После вызова этих методов виджет снова можно перемещать и менять размер, сетка реагирует на изменения положения и пересчёт ячеек.
Gridstack.js позволяет массово заблокировать или разблокировать все элементы:
// Блокировка всей сетки
grid.disable();
// Разблокировка всей сетки
grid.enable();
Эти методы полезны для создания режимов «редактирования» и «просмотра», когда необходимо временно запретить манипуляции со всеми виджетами.
Gridstack.js поддерживает точечное ограничение
действий через свойства movable и
resizable:
grid.addWidget(
'<div class="grid-stack-item"><div class="grid-stack-item-content">Частично заблокированный</div></div>',
{ x: 0, y: 0, width: 2, height: 2, movable: false, resizable: true }
);
movable: false — виджет нельзя перемещать, но можно
менять размер.resizable: false — виджет нельзя менять по размеру, но
можно перемещать.Динамически можно обновлять эти параметры через метод
update():
grid.update(widgetNode, { movable: true, resizable: false });
Блокировка виджета влияет на все события Gridstack.js, связанные с
перемещением (drag) и изменением размера
(resize). Даже если обработчики событий
подключены, заблокированный элемент не будет реагировать на
попытки пользователя.
Для проверки состояния виджета можно использовать метод:
const isLocked = grid.isAreaEmpty(widgetNode); // неявно проверяет состояние сетки
| Метод/Свойство | Действие | Подвижность | Изменение размера | Учет сетки |
|---|---|---|---|---|
disable() |
Блокировка через API | Нет | Нет | Да |
enable() |
Разблокировка | Да | Да | Да |
locked: true |
Инициализация или update | Нет | Нет | Да |
static: true |
Полная фиксация | Нет | Нет | Нет |
movable/resizable |
Частичная блокировка | Ограничено | Ограничено | Да |
Эти механизмы позволяют гибко управлять виджетами, создавая динамические панели, где часть элементов можно редактировать, а другие оставлять фиксированными.