Gridstack.js позволяет создавать динамические сетки с перетаскиваемыми и изменяемыми по размеру элементами. Помимо базового функционала, библиотека поддерживает возможность создания собственных тем, что позволяет полностью контролировать визуальное оформление сетки и её элементов.
Темы в Gridstack.js реализуются через сочетание CSS-классов и настроек опций при инициализации сетки. Базовая структура темы включает стили для:
Gridstack.js использует классы .grid-stack для
контейнера и .grid-stack-item для виджетов. Для создания
темы необходимо определить собственные стили для этих классов, а также
для вложенных элементов .grid-stack-item-content:
/* Контейнер сетки */
.my-theme .grid-stack {
background-color: #f0f0f0;
border: 2px solid #ccc;
border-radius: 8px;
padding: 10px;
}
/* Виджеты */
.my-theme .grid-stack-item {
border: 1px solid #999;
border-radius: 6px;
overflow: hidden;
background-color: #ffffff;
box-shadow: 0 2px 6px rgba(0,0,0,0.1);
}
/* Контент виджета */
.my-theme .grid-stack-item-content {
padding: 10px;
font-family: 'Arial', sans-serif;
font-size: 14px;
color: #333;
}
/* Хэндлы изменения размера */
.my-theme .grid-stack-item .ui-resizable-handle {
background: #007bff;
border-radius: 50%;
width: 10px;
height: 10px;
border: 1px solid #0056b3;
}
Ключевые моменты:
.my-theme) позволяет избежать конфликтов с другими
стилями..ui-resizable-handle обеспечивают единый
визуальный стиль хэндлов.transition) и эффекты при наведении
(hover).При создании сетки необходимо указать класс темы в контейнере и при необходимости добавить дополнительные опции:
const grid = GridStack.init({
cellHeight: 100,
margin: 10,
draggable: {
handle: '.grid-stack-item-content'
}
}, '.grid-stack.my-theme');
Пояснения:
cellHeight задаёт высоту ячейки в
пикселях.margin управляет отступами между
виджетами.draggable.handle определяет область, за которую можно
перетаскивать виджет.Использование кастомного класса .my-theme в селекторе
позволяет автоматически применять все стили темы.
Gridstack.js позволяет динамически изменять стили виджетов и их поведения через API:
grid.on('added', function(event, items) {
items.forEach(item => {
const el = item.el;
el.querySelector('.grid-stack-item-content').style.backgroundColor = '#e6f7ff';
el.querySelector('.grid-stack-item-content').style.border = '1px solid #1890ff';
});
});
grid.on('change', function(event, items) {
items.forEach(item => {
if(item.width > 2) {
item.el.querySelector('.grid-stack-item-content').style.fontWeight = 'bold';
}
});
});
Особенности:
added срабатывает при добавлении новых
виджетов.change срабатывает при изменении размеров или
позиции.Для более удобного управления цветами и размерами в собственной теме рекомендуется использовать CSS-переменные:
:root {
--grid-bg-color: #f9f9f9;
--widget-bg-color: #ffffff;
--widget-border-color: #ccc;
--handle-color: #007bff;
}
.my-theme .grid-stack {
background-color: var(--grid-bg-color);
}
.my-theme .grid-stack-item {
background-color: var(--widget-bg-color);
border: 1px solid var(--widget-border-color);
}
.my-theme .grid-stack-item .ui-resizable-handle {
background: var(--handle-color);
}
Преимущества:
Gridstack.js поддерживает адаптивные сетки, поэтому темы можно делать отдельными для мобильных и десктопных устройств через медиазапросы:
@media (max-width: 768px) {
.my-theme .grid-stack {
padding: 5px;
}
.my-theme .grid-stack-item-content {
font-size: 12px;
}
.my-theme .grid-stack-item .ui-resizable-handle {
width: 8px;
height: 8px;
}
}
Это позволяет поддерживать читаемость и удобство взаимодействия на любых экранах.
Создание тем в Gridstack.js позволяет не просто изменить внешний вид, но и внедрять интерактивные визуальные эффекты, которые зависят от состояния виджетов, их размеров и расположения, что делает интерфейс гибким и динамичным.