Компонент Tooltip используется для отображения вспомогательной информации при наведении на элемент, фокусе или клике. В SvelteKit его реализация опирается на реактивность и привязку состояний, что обеспечивает плавное управление показом и скрытием подсказок без прямого манипулирования DOM.
Базовый Tooltip состоит из двух ключевых элементов:
Пример структуры:
<div class="tooltip-container" on:mouseenter={show} on:mouseleave={hide}>
<button>Наведи на меня</button>
{#if visible}
<div class="tooltip-content">
Это подсказка
</div>
{/if}
</div>
visible – реактивная переменная состояния, управляющая
видимостью.show и hide – функции для изменения
состояния visible.Использование реактивных переменных Svelte позволяет
управлять состоянием Tooltip без прямых вызовов
document.querySelector или classList.
<script>
let visible = false;
function show() {
visible = true;
}
function hide() {
visible = false;
}
</script>
Для более сложных сценариев можно добавлять задержку
появления и исчезновения, используя
setTimeout:
function show(delay = 200) {
setTimeout(() => visible = true, delay);
}
function hide(delay = 200) {
setTimeout(() => visible = false, delay);
}
Одной из ключевых задач является правильное позиционирование
подсказки относительно target. В SvelteKit UI библиотеках часто
используют события mousemove или привязку координат
через bind:this:
<script>
let targetEl;
let coords = { top: 0, left: 0 };
function updatePosition(event) {
coords = {
top: event.clientY + 10,
left: event.clientX + 10
};
}
</script>
<div bind:this={targetEl} on:mousemove={updatePosition}>
<button>Наведи на меня</button>
</div>
{#if visible}
<div class="tooltip-content" style="top:{coords.top}px; left:{coords.left}px; position:absolute;">
Подсказка рядом с курсором
</div>
{/if}
Такой подход обеспечивает динамическое следование подсказки за курсором.
Svelte предоставляет встроенные транзишены через
директиву transition, что позволяет создавать плавное
появление и исчезновение Tooltip:
<script>
import { fade, scale } from 'svelte/transition';
</script>
{#if visible}
<div class="tooltip-content" transition:fade={{ duration: 200 }} transition:scale={{ start: 0.8, duration: 200 }}>
Анимированная подсказка
</div>
{/if}
fade – плавное появление/исчезновение.scale – эффект увеличения/уменьшения размера при
появлении.Стили Tooltip часто задаются через CSS-классы с учетом позиционирования и внешнего вида:
.tooltip-container {
display: inline-block;
position: relative;
}
.tooltip-content {
background: rgba(0,0,0,0.8);
color: #fff;
padding: 6px 12px;
border-radius: 4px;
font-size: 0.875rem;
white-space: nowrap;
z-index: 1000;
}
Для удобства управления можно добавить варианты расположения подсказки:
<div class="tooltip-content {position}">
Текст подсказки
</div>
.tooltip-content.top { transform: translateY(-100%); }
.tooltip-content.bottom { transform: translateY(100%); }
.tooltip-content.left { transform: translateX(-100%); }
.tooltip-content.right { transform: translateX(100%); }
click и
focus.<script>
import { writable } from 'svelte/store';
export const activeTooltip = writable(null);
function toggleTooltip(id) {
activeTooltip.update(current => current === id ? null : id);
}
</script>
Для соблюдения стандартов доступности:
aria-describedby или
aria-label.<button aria-describedby="tooltip1">Наведи на меня</button>
<div id="tooltip1" role="tooltip">
Доступная подсказка
</div>
Многие SvelteKit UI библиотеки, такие как Svelte Material UI, Carbon Components Svelte, Shadcn Svelte, предоставляют готовые Tooltip-компоненты с расширенной функциональностью:
Использование этих компонентов сокращает ручное управление состояниями и позиционированием, сохраняя при этом реактивность и производительность SvelteKit.
Этот подход к реализации Tooltip в SvelteKit сочетает реактивность, плавные анимации и удобное управление состояниями, обеспечивая высокую гибкость и соответствие современным стандартам UI.