В библиотеке Floating UI управление положением элементов
осуществляется через расчёт доступного пространства вокруг целевого
элемента. Ключевыми параметрами в этом процессе являются
availableWidth и availableHeight. Эти свойства
определяют максимальное пространство по горизонтали и
вертикали, которое может быть использовано для отображения
всплывающего элемента (floating element) без выхода за границы окна или
контейнера.
availableWidth и availableHeightavailableWidth — ширина области, в
пределах которой может быть размещён всплывающий элемент, начиная от
позиции target элемента до ближайшего края видимой области.availableHeight — высота этой области,
рассчитываемая аналогично.Эти параметры используются для динамического позиционирования и адаптивной подгонки размеров всплывающего окна.
Пример вычисления:
import { computePosition, autoPlacement } from '@floating-ui/dom';
const reference = document.querySelector('#button');
const floating = document.querySelector('#tooltip');
computePosition(reference, floating, {
middleware: [autoPlacement()],
}).then(({ x, y, availableWidth, availableHeight }) => {
Object.assign(floating.style, {
left: `${x}px`,
top: `${y}px`,
maxWidth: `${availableWidth}px`,
maxHeight: `${availableHeight}px`,
});
});
В данном примере availableWidth и
availableHeight используются для ограничения размеров
всплывающего элемента, предотвращая его выход за пределы видимой
области.
Влияние flip и shift
middleware Middleware flip меняет сторону
отображения элемента, если недостаточно места. shift
корректирует позицию, чтобы элемент не вылезал за границы.
availableWidth и availableHeight при этом
пересчитываются с учётом новых координат.
Учёт отступов (padding) Метод
computePosition позволяет задавать внутренние отступы через
опцию padding, чтобы всплывающий элемент не прилипал к
краям окна:
computePosition(reference, floating, {
middleware: [
autoPlacement({ padding: 8 })
],
});
Это уменьшает доступное пространство на указанные отступы, что влияет
на availableWidth и availableHeight.
Контейнеры с overflow Если всплывающий элемент
находится внутри контейнера с ограниченной областью
(overflow: hidden или overflow: auto),
доступное пространство рассчитывается относительно этого контейнера, а
не всего окна. Это важно для корректной адаптации размеров:
const container = document.querySelector('.scrollable');
computePosition(reference, floating, {
strategy: 'absolute',
platform: {
getBoundingClientRect: () => container.getBoundingClientRect(),
},
});Использование availableWidth и
availableHeight позволяет реализовать адаптивное
отображение:
Подгонка ширины под содержимое с учётом ограничений:
floating.style.width = Math.min(floating.scrollWidth, availableWidth) + 'px';Подгонка высоты при длинном контенте:
floating.style.maxHeight = availableHeight + 'px';
floating.style.overflowY = 'auto';Таким образом всплывающий элемент остаётся полностью видимым даже при ограниченном пространстве.
availableWidth и availableHeight часто
применяются совместно с middleware:
size — позволяет автоматически подгонять размеры элемента:
import { size } from '@floating-ui/dom';
computePosition(reference, floating, {
middleware: [
size({
apply({ availableWidth, availableHeight, elements }) {
Object.assign(elements.floating.style, {
maxWidth: `${availableWidth}px`,
maxHeight: `${availableHeight}px`,
});
},
}),
],
});flip и shift — обеспечивают
корректное расположение, после чего размеры корректируются с помощью
availableWidth/availableHeight.
autoPlacement — автоматически выбирает оптимальную сторону, а затем предоставляет актуальные размеры.
При работе с сложными контейнерами лучше
проверять, откуда библиотека берёт границы, чтобы
availableWidth и availableHeight
соответствовали реальному пространству.
Использовать ограничения через CSS
(max-width, max-height) вместе с вычисленными
значениями для плавной адаптации.
Обрабатывать изменение окна с помощью слушателя
resize для повторного вычисления позиции и размеров:
window.addEventListener('resize', () => computePosition(reference, floating, { middleware: [autoPlacement()] }));Не полагаться только на fixed размеры:
динамическая подгонка через availableWidth и
availableHeight делает интерфейс более отзывчивым.
availableWidth и availableHeight — это
динамические ограничения размеров, которые необходимо
учитывать для корректного отображения всплывающих элементов.size,
flip, shift и autoPlacement
обеспечивает адаптивность, видимость и удобство
взаимодействия.Эти параметры являются фундаментальными для построения умных, динамических интерфейсов, где позиция и размеры всплывающих элементов автоматически подстраиваются под пространство вокруг целевого элемента.