Interact.js предоставляет гибкие возможности для работы с drag-and-drop и изменением размеров элементов на странице. Одной из ключевых функций является управление минимальными и максимальными размерами элементов, что позволяет поддерживать интерфейс в корректных пропорциях и предотвращать визуальные или функциональные ошибки.
Для установки ограничений используется метод
restrictSize, который применяется в сочетании с
обработчиком изменения размера (resizable). Ограничения
задаются через объект с ключами min и max, где
можно указывать ширину и высоту отдельно:
interact('.resizable')
.resizable({
edges: { left: true, right: true, bottom: true, top: true },
listeners: {
move(event) {
let { x, y } = event.target.dataset;
x = (parseFloat(x) || 0);
y = (parseFloat(y) || 0);
Object.assign(event.target.style, {
width: `${event.rect.width}px`,
height: `${event.rect.height}px`,
transform: `translate(${x}px, ${y}px)`
});
}
},
modifiers: [
interact.modifiers.restrictSize({
min: { width: 100, height: 50 },
max: { width: 500, height: 300 }
})
],
inertia: true
});
Ключевые моменты:
min — минимальные размеры элемента. Если пользователь
пытается уменьшить элемент ниже этих значений, Interact.js автоматически
ограничивает размеры.max — максимальные размеры элемента. Попытки увеличения
выше этих значений также блокируются.Interact.js позволяет задавать ограничения не только по общим ширине и высоте, но и для каждой стороны элемента. Это особенно полезно для элементов с асимметричными требованиями:
modifiers: [
interact.modifiers.restrictSize({
min: { width: 150, height: 100 },
max: { width: 400, height: 250 },
// Применение к конкретным сторонам
endOnly: true
})
]
endOnly: true — ограничение применяется только
после завершения действия изменения размера, что делает
движение более плавным.snap для выравнивания по сетке.Interact.js поддерживает использование относительных величин, что позволяет адаптировать элементы под динамический размер контейнера:
interact('.resizable')
.resizable({
modifiers: [
interact.modifiers.restrictSize({
min: { width: '20%', height: '10%' },
max: { width: '80%', height: '50%' }
})
]
});
Можно изменять ограничения в процессе работы,
используя свойства объекта modifiers. Например, менять
максимальную ширину элемента в зависимости от контекста:
const resizable = interact('.resizable').resizable({
edges: { left: true, right: true, bottom: true, top: true },
modifiers: [
interact.modifiers.restrictSize({
min: { width: 50, height: 50 },
max: { width: 300, height: 200 }
})
]
});
function updateMaxWidth(newWidth) {
resizable.modifiers[0].options.max.width = newWidth;
}
Interact.js позволяет комбинировать drag и resize. Ограничения размеров могут использоваться вместе с ограничением перемещения:
interact('.box')
.draggable({
modifiers: [
interact.modifiers.restrictRect({
restriction: 'parent'
})
]
})
.resizable({
modifiers: [
interact.modifiers.restrictSize({
min: { width: 100, height: 50 },
max: { width: 500, height: 300 }
})
]
});
restrictRect ограничивает область перемещения
элементом.restrictSize обеспечивает полный
контроль над поведением элемента.endOnly делает взаимодействие более
естественным при быстром изменении размера.snap или restrictRect
позволяет создавать сложные интерфейсы с динамическими и
ограниченными элементами.Эти возможности делают Interact.js мощным инструментом для создания интерактивных интерфейсов с контролируемыми размерами элементов, обеспечивая как гибкость, так и предсказуемость поведения на разных устройствах.