SvelteKit предоставляет мощные инструменты для работы с анимацией и переходами компонентов через встроенную систему transitions. Они позволяют управлять появлением, исчезновением и изменением состояния элементов без сложной работы с CSS или внешними библиотеками.
В SvelteKit переходы реализуются через директиву
transition:. Синтаксис выглядит следующим образом:
<div transition:fade>
Контент с плавным появлением
</div>
duration или delay.<div transition:fade={{ duration: 500, delay: 200 }}>
Появление через полсекунды с задержкой
</div>
SvelteKit поставляется с набором стандартных переходов, которые покрывают большинство базовых сценариев:
Пример использования fly:
<script>
import { fly } from 'svelte/transition';
</script>
<div transition:fly={{ x: 200, y: 0, duration: 400 }}>
Летающий элемент
</div>
Параметры перехода fly:
x и y — смещение по горизонтали и
вертикали.duration — длительность в миллисекундах.delay — задержка перед началом анимации.easing — функция easing (например,
cubicInOut из svelte/easing).Создание собственного перехода осуществляется через функцию, которая возвращает объект с параметрами CSS-анимации. Стандартная сигнатура:
function myTransition(node, params) {
return {
duration: 400,
css: t => `transform: scale(${t}); opacity: ${t}`
};
}
Использование:
<div transition:myTransition>
Кастомный переход
</div>
Можно комбинировать несколько эффектов, создавая сложные анимации с изменением прозрачности, масштаба, позиции и других свойств.
Transitions идеально работают с условными конструкциями
if и each:
{#if visible}
<p transition:slide>{{message}}</p>
{/if}
in: и out::<p in:fade={{ duration: 300 }} out:fly={{ x: 100, duration: 500 }}>
Комбинированный переход
</p>
SvelteKit поддерживает функцию easing из модуля
svelte/easing:
<script>
import { cubicOut } from 'svelte/easing';
</script>
<div transition:scale={{ duration: 500, easing: cubicOut }}>
Плавное масштабирование
</div>
linear,
cubicIn, backOut) или создавать собственные
кривые.Для синхронизации нескольких элементов можно использовать
grouped transitions с delay и
stagger:
{#each items as item, index}
<div transition:fade={{ delay: index * 100 }}>
{item}
</div>
{/each}
SvelteKit позволяет комбинировать transitions с motion (motion stores) для более сложных взаимодействий. Пример:
<script>
import { tweened } from 'svelte/motion';
import { cubicInOut } from 'svelte/easing';
let x = tweened(0, { duration: 400, easing: cubicInOut });
</script>
<div style="transform: translateX({$x}px)" transition:fade>
Двигающийся элемент с переходом
</div>
transform, opacity) вместо
width, height.Этот подход обеспечивает чистый, декларативный код, упрощает поддержку анимаций и полностью использует возможности SvelteKit UI для создания современных интерфейсов.