Bases de Svelte
Introduction
Liaisons
Classes et styles
Svelte avancé
Réutiliser du contenu
Mouvements
Liaisons avancées
Transitions avancées
API de contexte
Éléments spéciaux
<script module>
Next steps
Bases de SvelteKit
Introduction
Routing
Chargement de données
En-têtes et cookies
Modules partagés
Formulaires
$app/state
Erreurs et redirections
SvelteKit avancé
Options de page
Options de lien
Routing avancé
Chargement avancé
Variables d’environnement
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ébuteduration
— durée de la transition en millisecondeseasing
— une fonction de lissagep => 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 :
<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
<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>