@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;
}
placement
bottom
strategy
middleware
name
, 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
, strategy
auto
placement 는 middleware
에서 처리modifiers
-> middleware