Platform
Floating UI works on any platform that can run JavaScript, as long as it has adequate measurement APIs for elements. Possible platforms other than the DOM include React Native, Canvas/WebGL, etc.
The library works largely with a Rect
:
interface Rect {
width: number;
height: number;
x: number;
y: number;
}
This data can come from anywhere, and the library will perform
the right computations. x
and y
represent the coordinates of the element relative to another one.
import {computePosition} from '@floating-ui/core';
computePosition(referenceElement, floatingElement, {
platform: {
// ...
},
});
Methods
A platform
is a plain object consisting of 3
required and 6 optional methods. These methods allow the platform
to interface with Floating UI's logic.
Each of these methods can be either async or sync. This enables support of platforms whose measurement APIs are async, like React Native.
Required methods
getElementRects
Takes in the elements and the positioning strategy
and returns the element Rect
objects.
function getElementRects({reference, floating, strategy}) {
return {
reference: {width: 0, height: 0, x: 0, y: 0},
floating: {width: 0, height: 0, x: 0, y: 0},
};
}
reference
The x
and y
values of a reference
Rect
should be its coordinates relative to the
floating element's offsetParent
element if required rather than
the viewport.
floating
Both x
and y
are not relevant
initially, so you can set these both of these to 0
.
getDimensions
Returns the dimensions of an element.
function getDimensions(element) {
return {width: 0, height: 0};
}
getClippingRect
Returns the Rect
(relative to the viewport) whose
outside bounds will clip the given element. For instance, the
viewport itself.
function getClippingRect({element, boundary, rootBoundary}) {
return {
width: 0,
height: 0,
x: 0,
y: 0,
};
}
Optional methods
Depending on the platform you're working with, these may or may not be necessary.
convertOffsetParentRelativeRectToViewportRelativeRect
This function will take a Rect
that is relative to a
given offsetParent
element and convert its
x
and y
values such that it is
instead relative to the viewport.
function convertOffsetParentRelativeRectToViewportRelativeRect({
rect,
offsetParent,
strategy,
}) {
return rect;
}
getOffsetParent
Returns the offsetParent
of a given element. The following four
properties are what is accessed on an offsetParent
.
function getOffsetParent(element) {
return {
clientWidth: 0,
clientHeight: 0,
clientLeft: 0,
clientTop: 0,
};
}
getDocumentElement
Returns the document element.
function getDocumentElement(element) {
return {};
}
getClientRects
Returns an array of ClientRect
s.
function getClientRects(element) {
return [];
}
isElement
Determines if the current value is an element.
function isElement(value) {
return true;
}
isRTL
Determines if an element is in RTL layout.
function isRTL(element) {
return false;
}
Usage
All these methods are passed to platform
:
import {computePosition} from '@floating-ui/core';
computePosition(referenceEl, floatingEl, {
platform: {
// Required
getElementRects,
getDimensions,
getClippingRect,
// Optional
convertOffsetParentRelativeRectToViewportRelativeRect,
getOffsetParent,
getDocumentElement,
getClientRects,
isElement,
isRTL,
},
});