Встроенные переходы Svelte

Встроенные переходы в Svelte позволяют добавлять анимации при изменении состояния компонентов, что значительно улучшает пользовательский опыт. Переходы могут быть использованы для визуального представления появления, исчезновения или перемещения элементов. В Svelte переходы имеют высокую производительность и легко настраиваются, что делает их мощным инструментом для динамических интерфейсов.

Svelte предоставляет несколько встроенных переходов, которые можно использовать с элементами компонентов. Эти переходы включают анимации появления, исчезновения, а также перемещения элементов на экране. Все они активно используют CSS-параметры для стилизации анимаций, что позволяет гибко настроить визуальные эффекты. Переходы могут быть применены к элементам при их монтировании и размонтировании, а также при изменении их состояния.

Простой пример использования встроенного перехода выглядит следующим образом:

<script>
  let show = true;
</script>

{#if show}
  <div transition:fade>
    Это элемент с переходом.
  </div>
{/if}

<button on:click={() => show = !show}>Переключить</button>

В данном примере используется встроенный переход fade, который применяет плавное исчезновение и появление элемента. Важно, что переходы применяются с помощью директивы transition:<имя>, которая указывает на тип анимации.

Встроенные переходы Svelte

Svelte предоставляет несколько стандартных переходов, которые могут быть использованы для анимации элементов:

  • fade – плавное исчезновение и появление элементов.
  • slide – анимация сдвига элементов (можно настроить направление).
  • scale – анимация изменения масштаба.
  • draw – анимация рисования элементов, например, для использования на SVG.
  • blur – размытие элементов во время анимации.

Каждый переход имеет различные параметры, которые можно настраивать, чтобы контролировать скорость, задержку и другие параметры анимации. Рассмотрим каждый из них.

Переход fade

Переход fade используется для плавного появления и исчезновения элемента. Он принимает два обязательных параметра: duration (продолжительность анимации) и delay (задержка перед началом анимации). Например:

<div transition:fade={{ duration: 500, delay: 200 }}>
  Появляющийся элемент
</div>

Здесь элемент будет плавно появляться в течение 500 миллисекунд с задержкой в 200 миллисекунд.

Переход slide

Переход slide позволяет анимировать сдвиг элемента. Можно задать направление сдвига: сверху, снизу, слева или справа. Также можно настроить скорость анимации и отступы.

<div transition:slide={{ x: 200, duration: 300 }}>
  Элемент будет сдвигаться на 200px вправо.
</div>

В данном примере элемент будет сдвигаться на 200 пикселей вправо за 300 миллисекунд.

Переход scale

Переход scale анимирует изменение масштаба элемента. Можно указать начальный и конечный размер элемента в процентах, а также продолжительность анимации.

<div transition:scale={{ start: 0.5, end: 1.5, duration: 400 }}>
  Элемент будет увеличиваться в размере.
</div>

Этот код создаст анимацию увеличения элемента от половины до 1.5 размера его исходного размера за 400 миллисекунд.

Переход draw

Переход draw используется для анимации рисования элементов, чаще всего для работы с SVG-элементами. Этот переход позволяет «рисовать» линии или другие формы, заполняя их постепенно.

<svg width="100" height="100">
  <circle cx="50" cy="50" r="40" fill="none" stroke="black" stroke-width="5" transition:draw />
</svg>

Анимация будет рисовать круг, начиная с линии, и постепенно заполняя его.

Переход blur

Переход blur анимирует размытие элементов, что может быть полезно для создания эффекта фокуса. Например, можно использовать этот переход для изменения уровня размытия изображения.

<img src="image.jpg" transition:blur={{ intensity: 5, duration: 500 }} />

В данном примере изображение будет размытно появляться, с интенсивностью размытия 5 и продолжительностью 500 миллисекунд.

Пользовательские переходы

Помимо стандартных переходов, Svelte позволяет создавать собственные пользовательские переходы с помощью функции transition и CSS-анимированных эффектов. В таких переходах можно использовать любые CSS-свойства, такие как transform, opacity, position и другие.

Пример создания пользовательского перехода:

<script>
  import { cubicOut } from 'svelte/easing';

  function customTransition(node, { delay = 0, duration = 400 }) {
    const style = getComputedStyle(node);
    const width = parseFloat(style.width);

    return {
      delay,
      duration,
      easing: cubicOut,
      css: t => `
        transform: translateX(${(1 - t) * width}px);
        opacity: ${t};
      `
    };
  }
</script>

<div transition:customTransition={{ duration: 500 }}>
  Этот элемент будет анимироваться с помощью пользовательского перехода.
</div>

Здесь создается анимация сдвига элемента по оси X и изменения его прозрачности. В качестве кривой сглаживания используется функция cubicOut для плавного завершения анимации.

Применение переходов к спискам и коллекциям

Svelte поддерживает анимацию элементов в коллекциях, таких как списки или массивы. Переходы могут быть применены ко всем элементам коллекции, что позволяет анимировать их появление и исчезновение по мере изменения состояния массива.

Пример анимации элементов списка:

<script>
  let items = ['Item 1', 'Item 2', 'Item 3'];
</script>

{#each items as item (item)}
  <div transition:fade>
    {item}
  </div>
{/each}

<button on:click={() => items = [...items, `Item ${items.length + 1}`]}>
  Добавить элемент
</button>

В этом примере каждый элемент списка анимируется при добавлении, применяя плавное появление с переходом fade. Когда элемент добавляется в список, Svelte автоматически применяет переходы ко всем новым элементам.

Завершение анимации

Переходы в Svelte завершены автоматически, как только анимация достигает своего конца. Однако можно также вручную управлять завершением анимации с помощью событий in и out. Эти события срабатывают при начале и завершении анимации соответственно, и могут быть использованы для дополнительной логики.

<div 
  transition:fade 
  on:instart={() => console.log('Начало анимации')} 
  on:inend={() => console.log('Конец анимации')}>
  Этот элемент будет анимироваться с отслеживанием событий.
</div>

В данном примере события instart и inend позволяют отслеживать начало и окончание анимации.

Заключение

Переходы в Svelte — это мощный инструмент для создания динамических и анимированных пользовательских интерфейсов. Они интегрируются с системой реактивности Svelte, что позволяет легко и эффективно добавлять визуальные эффекты. Возможность кастомизации, а также использование стандартных и пользовательских переходов позволяет гибко управлять анимациями, создавая высококачественные, плавно анимированные интерфейсы.