Appearance
Tooltip Directive
v-tooltip
A custom Vue directive that shows a tooltip with specified content on hover, dynamically positioning it relative to the element based on available viewport space.
Props (Binding Value)
| Type | Required | Example | Description |
|---|---|---|---|
Object | Yes | { content: 'Tooltip text', raw: false, preferredPosition: 'top' } | Configuration object specifying tooltip content and options |
The binding value is an object with the following optional properties:
content(string, required): The text or HTML content to display inside the tooltip.raw(boolean, default: false): Whether to render content as raw HTML.preferredPosition(string, default: 'top'): Preferred tooltip position ('top' | 'bottom' | 'left' | 'right').
Modifiers
N/A
Arguments
N/A
Slots
N/A (used as a directive, not a component)
Emits
N/A (directives do not emit events)
Functions
hasSpace(position, elRect, tooltipRect)
- Checks if there is enough space in the viewport to display the tooltip at the given position relative to the element.
- Parameters:
position— Position to check ('top' | 'bottom' | 'left' | 'right').elRect— Bounding rectangle of the target element.tooltipRect— Bounding rectangle of the tooltip element.
showTooltip()
- Creates and mounts the tooltip component.
- Calculates the best position for the tooltip, falling back to alternatives if the preferred position lacks space.
- Positions the tooltip absolutely on the page.
- Shows tooltip after a short delay to avoid flicker.
hideTooltip()
- Unmounts and removes the tooltip from the DOM.
- Clears any pending tooltip show timeouts.
delayedShowTooltip()
- Starts a short timeout (200ms) before showing the tooltip, to prevent flickering on quick mouse movements.
Usage Example
vue
//Default Load Example
<template>
<button v-tooltip="{ content: 'Save changes', preferredPosition: 'right' }">
Save
</button>
</template>
//HMTL Element Load Example
<template>
<button
v-tooltip="{
content: tooltipHtml,
raw: true,
preferredPosition: 'right',
}"
class="btn"
>
Hover Me
</button>
</template>
<script lang="ts" setup>
const tooltipHtml = `
<div>
<strong>Tooltip Title</strong><br/>
<em>Some italic text</em><br/>
<ul>
<li>Item One</li>
<li>Item Two</li>
<li>Item Three</li>
</ul>
</div>
`;
</script>Behavior Summary
- Tooltip shows on
mouseenterwith a 200ms delay. - Tooltip hides immediately on
mouseleave. - Tooltip content can be raw HTML or plain text.
- Tooltip automatically positions itself based on available viewport space.
- Cleans up event listeners and tooltip elements on unmount.
Notes
- Tooltip content is mounted as a separate Vue app instance attached to a dynamically created
<div>. - Supports dynamic positioning fallback if preferred position is not feasible.
- Uses high
z-indexto stay visible above other elements. - Tooltip DOM nodes are cleaned up to prevent memory leaks.
Screenshot
