Skip to main content
Bases de Svelte
Introduction
Réactivité
Props
Logique
Évènements
Liaisons
Classes et styles
Actions
Transitions
Svelte avancé
Réactivité avancée
Réutiliser du contenu
Mouvements
Liaisons avancées
Advanced transitions
Context API
Special elements
<script module>
Next steps
Basic SvelteKit
Introduction
Routing
Loading data
Headers and cookies
Shared modules
Forms
API routes
$app/state
Errors and redirects
Advanced SvelteKit
Hooks
Page options
Link options
Advanced routing
Advanced loading
Environment variables
Conclusion

Le module svelte/transition possède un certain nombre de transitions prédéfinies, mais il est très facile de créer les vôtres. À titre d’exemple, voici le code source de la transition fade :

function fade(node, { delay = 0, duration = 400 }) {
	const o = +getComputedStyle(node).opacity;

	return {
		delay,
		duration,
		css: (t) => `opacity: ${t * o}`
	};
}

La fonction prend deux arguments — le noeud auquel la transition est appliquée, et tout paramètre qui a fourni — et renvoie un objet de transition qui peut avoir les propriétés suivantes :

  • delay — délai en millisecondes avant que la transition ne débute
  • duration — durée de la transition en millisecondes
  • easing — une fonction de lissage p => t (voir le chapitre sur le tweening)
  • css — une fonction (t, u) => css, où u === 1 - t
  • tick — une fonction (t, u) => {...} qui a de l’effet sur le noeud

La valeur de t est 0 au début de l’entrée ou à la fin de la sortie, et 1 à la fin de l’entrée ou le début de la sortie.

La plupart du temps vous devriez renvoyer la propriété css et non la propriété tick, puisque les animations CSS sont exécutées sur un autre thread que le tread principal, pour éviter de surcharger ce dernier. Svelte “simule” la transition et construit une animation CSS, puis la laisse se jouer.

Par exemple, la transition fade génère une animation CSS qui ressemble à ça :

0% { opacity: 0 }
10% { opacity: 0.1 }
20% { opacity: 0.2 }
/* ... */
100% { opacity: 1 }

Nous pouvons toutefois être bien plus créatifs. Créons quelque chose de totalement non nécessaire :

App
<script>
	import { fade } from 'svelte/transition';
	import { elasticOut } from 'svelte/easing';

	let visible = $state(true);

	function spin(node, { duration }) {
		return {
			duration,
			css: (t, u) => {
				const eased = elasticOut(t);

				return `
					transform: scale(${eased}) rotate(${eased * 1080}deg);
					color: hsl(
						${Math.trunc(t * 360)},
						${Math.min(100, 1000 * u)}%,
						${Math.min(50, 500 * u)}%
					);`
			}
		};
	}
</script>
<script lang="ts">
	import { fade } from 'svelte/transition';
	import { elasticOut } from 'svelte/easing';

	let visible = $state(true);

	function spin(node, { duration }) {
		return {
			duration,
			css: (t, u) => {
				const eased = elasticOut(t);

				return `
					transform: scale(${eased}) rotate(${eased * 1080}deg);
					color: hsl(
						${Math.trunc(t * 360)},
						${Math.min(100, 1000 * u)}%,
						${Math.min(50, 500 * u)}%
					);`
			}
		};
	}
</script>

Souvenez-vous : un grand pouvoir amène de grandes responsabilités.

Modifier cette page sur Github

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<script>
	import { fade } from 'svelte/transition';
 
	let visible = $state(true);
 
	function spin(node, { duration }) {
		return {
			duration,
			css: (t, u) => ``
		};
	}
</script>
 
<label>
	<input type="checkbox" bind:checked={visible} />
	visible
</label>
 
{#if visible}
	<div
		class="centered"
		in:spin={{ duration: 8000 }}
		out:fade
	>
		<span>transitionne !</span>
	</div>
{/if}
 
<style>
	.centered {
		position: absolute;
		left: 50%;
		top: 50%;
		transform: translate(-50%, -50%);
	}
 
	span {
		position: absolute;
		transform: translate(-50%, -50%);
		font-size: 4em;
	}
</style>