@floating-ui/dom web with vanilla JS@floating-ui/react, @floating-ui/react-native, @floating-ui/vue,@floating-ui/core JS를 실행할 수 있는 다른 플랫폼 (e.g. Canvas, WebGL)function update() {
computePosition(button, tooltip, {
// ... options ...
}).then(({x, y, placement, middlewareData}) => {
// ... positioning logic ...
});
}computePosition() 호출전 다음 스타일을 가져야 DOM 트리의 어느 곳에나 플로팅 요소를 배치하고, 조상 컨테이너의 CSS 스타일에 관계없이 올바르게 배치할 수 있음#floating {
position: absolute;
width: max-content; // (or a fixed value)
top: 0;
left: 0;
}computePosition() 함수autoUpdate를 사용하여 처리interface ComputePositionReturn {
x: number;
y: number;
placement: Placement;
strategy: Strategy;
middlewareData: MiddlewareData;
}placementbottomstrategymiddlewarename, fn 과 선택적 속성 options 를 가지는 객체들computePosition() 호출과 렌더링을 위한 데이터의 최종 반환 사이에서 동작fn 는 data라는 선택적 속성 반환 가능, middlewareData 속성으로 접근 가능interface MiddlewareState {
x: number;
y: number;
initialPlacement: Placement;
placement: Placement;
strategy: Strategy;
middlewareData: MiddlewareData;
elements: Elements;
rects: ElementRects;
platform: Platform;
}const middleware = [
offset(),
// ...
arrow({element: arrowElement}),
hide(),
];offset()inline()shift()flip()autoPlacement()size()size({
apply({rects, elements}) {
Object.assign(elements.floating.style, {
minWidth: `${rects.reference.width}px`,
});
},
});maxHeight 스타일을 그대로 두면 플로팅 요소가 확장되는 경우 문제가 발생할 수 있음, apply 함수에서 scrollHeight가 availableHeight보다 작은 경우 maxHeight 값을 제거해 이슈 방지arrow()middlewareData로 통해 데이터만 제공, 스타일 추가 처리 필요hide()size() visibility optimizers 에서 설명autoUpdate()는 필요할 때 computePosition()을 호출하는 업데이트 함수를 자동으로 호출하는 리스너를 추가ancestorScroll trueancestorResize trueelementResize truelayoutShift true animationFrame falsetransforms 으로 애니메이션이 동작되고 있거나, 조상 플로팅 요소의 스크롤 컨텍스트를 벗어날 때 중첩된 플로팅 요소가 고정되어있을 때에는 사용 주의getBoundingClementRect 메서드를 가진 일반 객체fixed strategy 활용max-width 스타일 지정을 통해 너비 제한 size 미들웨어 활용offset 미들웨어를 통해 단위 변경computePosition(reference, floating, {
// 1rem => 16px
middleware: [offset(remToPx(1))],
});createPopper()를 호출하면 자동으로 Popper 요소가 배치되었으나, Floating-UI는 middleware를 자동으로 추가하지 않고 원하는대로 사용할 수 있는 순수한 데이터만 반환, 스타일 추가도 직접해야 함createPopper() -> computePosition()를 사용하여 위치 계산placement, strategyauto placement 는 middleware 에서 처리modifiers -> middleware