Appearance
useArrow
useArrow owns arrow registration for a floating context and returns the computed arrow coordinates and styles.
Type
ts
function useArrow(
context: FloatingContext,
position: FloatingPosition,
options?: UseArrowOptions,
): UseArrowReturn;
interface UseArrowOptions {
offset?: string;
padding?: Padding;
}
interface UseArrowReturn {
arrowX: ComputedRef<number>;
arrowY: ComputedRef<number>;
arrowStyles: ComputedRef<Record<string, string>>;
}Details
useArrow connects an arrow element to the floating context and registers the arrow middleware for that context.
context.refs.arrowElis the arrow element used by the middleware.offsetdefaults to"-4px".paddingis passed to the arrow middleware.position.middlewareData.value.arrowexposes the raw middleware output if you need it.- The arrow element still needs its own absolute positioning, since
arrowStylesonly supplies inset offsets.
Example
This example shows the root-first useArrow() form.
vue
<script setup lang="ts">
import { ref } from "vue";
import { useArrow, useFloatingContext, usePosition, useHover } from "v-float";
const anchorEl = ref<HTMLElement | null>(null);
const floatingEl = ref<HTMLElement | null>(null);
const arrowEl = ref<HTMLElement | null>(null);
const context = useFloatingContext({
refs: { anchorEl, floatingEl, arrowEl },
});
const position = usePosition(context, {
placement: "top",
middleware: {
offset: 8,
},
});
const { styles } = position;
useHover(context);
const { arrowStyles } = useArrow(context, position, {
offset: "-4px",
});
</script>
<template>
<button ref="anchorEl">Anchor</button>
<div v-if="context.state.open.value" ref="floatingEl" :style="styles">
Floating content
<div ref="arrowEl" style="position: absolute" :style="arrowStyles">^</div>
</div>
</template>