Gridstack.js предоставляет гибкую систему для организации и управления сеточными элементами на веб-странице. Одной из ключевых возможностей является перетаскивание виджетов. Однако в реальных проектах часто требуется ограничить область, в которой можно перемещать элементы, чтобы сохранить структурную целостность интерфейса и предотвратить пересечение нежелательных зон.
Gridstack позволяет задавать контейнер, внутри
которого виджеты могут свободно перемещаться. Это достигается с помощью
свойства containment.
var grid = GridStack.init({
float: true,
disableOneColumnMode: true,
// Ограничение области перетаскивания контейнером
dragIn: '.grid-container',
draggable: {
containment: '.grid-container'
}
});
Ключевые моменты:
containment принимает селектор CSS или
DOM-элемент.draggable, поэтому важно
убедиться, что она корректно настроена.Gridstack.js поддерживает также жесткое ограничение по
координатам, задавая минимальные и максимальные значения для
x и y виджета.
grid.addWidget({
x: 0, y: 0, width: 3, height: 2,
minX: 0, maxX: 5,
minY: 0, maxY: 3
});
Особенности:
minX, maxX — горизонтальные границы.minY, maxY — вертикальные границы.Для сложных интерфейсов часто требуется, чтобы виджет не пересекался
с другими виджетами или не выходил за выделенную “зону соседства”.
Gridstack поддерживает это через события и коллбэки,
например drag и change.
grid.on('drag', function(event, el) {
const node = el.gridstackNode;
if(node.x + node.width > 6) {
node.x = 6 - node.width; // Ограничение выхода за правую границу
}
});
Преимущества такого подхода:
Перетаскивание не единственный способ взаимодействия с элементами —
Gridstack позволяет изменять размеры виджетов. Для
ограничения этой области используются свойства minWidth,
maxWidth, minHeight,
maxHeight:
grid.addWidget({
x: 0, y: 0, width: 2, height: 2,
minWidth: 1, maxWidth: 4,
minHeight: 1, maxHeight: 3
});
Особенности:
minWidth и maxWidth ограничивают ширину
при растягивании.minHeight и maxHeight ограничивают
высоту.Gridstack поддерживает индивидуальные ограничения для каждого элемента. Это особенно полезно, когда разные виджеты имеют разные правила поведения:
grid.addWidget({
x: 0, y: 0, width: 3, height: 2,
draggable: {
containment: '#special-zone'
},
resizable: {
handles: 'e, s',
minWidth: 2,
maxWidth: 5
}
});
Преимущества:
На практике чаще всего используется комбинация всех подходов:
Это позволяет создать интерфейс, где элементы можно перетаскивать и изменять размер, не нарушая дизайн-сетку и логику приложения.
containment для простых ограничений —
быстрее и надежнее.drag и change для
сложных ограничений и взаимодействий.Эта система ограничений делает Gridstack.js мощным инструментом для создания интерактивных, адаптивных и контролируемых интерфейсов, позволяя разработчику точно управлять поведением виджетов внутри сетки.