Внутренний механизм библиотеки Floating UI опирается на точные
вычисления видимой области, в пределах которой должен отображаться
плавающий элемент (tooltip, dropdown, popover). Ключевую роль в этом
процессе играет функция getClippingRect, отвечающая за
определение прямоугольника отсечения (clipping
rectangle).
Этот прямоугольник описывает область, внутри которой элемент
считается видимым. Всё, что выходит за его границы, потенциально может
быть скрыто из-за CSS-свойств вроде overflow, а также из-за
ограничений окна просмотра (viewport).
Clipping rectangle — это итоговая область, полученная в результате пересечения нескольких ограничивающих контейнеров:
overflow: hidden | auto | scrollИменно эта область определяет, где плавающий элемент может находиться без обрезания.
getClippingRectФункция выполняет несколько важных действий:
Базовое ограничение — это текущая область окна браузера:
Это предки элемента, которые могут обрезать содержимое:
overflow ≠ visibleМожет быть:
viewportdocumentФункция определяет все родительские элементы, которые могут ограничивать видимость:
getClippingAncestors(element)
В список включаются:
Для каждого предка вычисляется его bounding rectangle:
getBoundingClientRect(element)
Также учитываются:
Все прямоугольники пересекаются между собой:
intersectionRect = intersectRects(rect1, rect2)
Итеративно:
(((viewport ∩ ancestor1) ∩ ancestor2) ∩ ancestor3) ...
Результат имеет структуру:
{
x: number,
y: number,
width: number,
height: number
}
Этот rect используется другими частями системы позиционирования.
getClippingRect активно используется в middleware:
detectOverflowshiftflipconst clippingRect = getClippingRect({
element,
boundary,
rootBoundary,
strategy
});
Где:
element — целевой элементboundary — список границ (например,
"clippingAncestors")rootBoundary — "viewport" или
"document"strategy — "absolute" или
"fixed"absolutefixedВсе координаты нормализуются с учетом прокрутки:
Если элемент находится внутри iframe:
Элементы с transform:
getClippingRect оптимизирована для:
Причина:
overflow: hidden;
на родительском элементе
Связано с:
absolute vs
fixed)Решение:
boundary: 'viewport'getClippingRect является фундаментом для:
Без точного определения clipping области невозможно реализовать:
getBoundingClientRectgetClippingAncestorsdetectOverflowcomputePositionКаждая из них использует результат getClippingRect как
основу для дальнейших вычислений.
getClippingRect формирует геометрическое
пространство допустимого отображения, в котором работают все
остальные алгоритмы позиционирования Floating UI. Это не просто
вспомогательная функция, а центральный элемент, обеспечивающий
корректность и предсказуемость поведения плавающих интерфейсных
компонентов.