Bases de Svelte
Introduction
Liaisons
Classes et styles
Svelte avancé
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
API routes
$app/state
Errors and redirects
Advanced SvelteKit
Page options
Link options
Advanced routing
Advanced loading
Environment variables
Conclusion
La classe Spring
, permettant de simuler le comportement d’un ressort, est une alternative à
Tween
qui fonctionne souvent mieux pour des valeurs qui changent souvent.
Dans cet exemple, nous avons un cercle suivant la souris, ainsi que deux valeurs — les coordonnées du cercle et sa taille. Convertissons-les en ressorts :
<script>
import { Spring } from 'svelte/motion';
let coords = new Spring({ x: 50, y: 50 });
let size = new Spring(10);
</script>
<script lang="ts">
import { Spring } from 'svelte/motion';
let coords = new Spring({ x: 50, y: 50 });
let size = new Spring(10);
</script>
Comme avec Tween
, les ressorts ont une propriété d’écriture target
et une propriété current
en
lecture seule. Mettez à jour les gestionnaires d’évènements...
<svg
onmousemove={(e) => {
coords.target = { x: e.clientX, y: e.clientY };
}}
onmousedown={() => (size.target = 30)}
onmouseup={() => (size.target = 10)}
role="presentation"
>
... et les attributs du <circle>
:
<circle
cx={coords.current.x}
cy={coords.current.y}
r={size.current}
></circle>
Les deux ressorts ont des valeurs de raideur (stiffness
) et d’amortissement (damping
), qui
contrôlent... la ressort-itude. Nous pouvons spécifier nos propres valeurs initiales :
let coords = new Spring({ x: 50, y: 50 }, {
stiffness: 0.1,
damping: 0.25
});
Faites bouger votre souris, et essayer de jouer avec les sliders pour ressentir comment les changements sur la raideur et l’amortissement affectent le comportement du ressort. Notez que vous pouvez changer les valeurs pendant que le ressort est encore en mouvement.
Modifier cette page sur Github
<script>
let coords = $state({ x: 50, y: 50 });
let size = $state(10);
</script>
<svg
onmousemove={(e) => {
coords = { x: e.clientX, y: e.clientY };
}}
onmousedown={() => (size = 30)}
onmouseup={() => (size = 10)}
role="presentation"
>
<circle
cx={coords.x}
cy={coords.y}
r={size}
></circle>
</svg>
<div class="controls">
<label>
<h3>stiffness ({coords.stiffness})</h3>
<input
bind:value={coords.stiffness}
type="range"
min="0.01"
max="1"
step="0.01"
/>
</label>
<label>
<h3>damping ({coords.damping})</h3>
<input
bind:value={coords.damping}
type="range"
min="0.01"
max="1"
step="0.01"
/>
</label>
</div>
<style>
svg {
position: absolute;
width: 100%;
height: 100%;
left: 0;
top: 0;
}
circle {
fill: #ff3e00;
}
.controls {
position: absolute;
top: 1em;
right: 1em;
width: 200px;
user-select: none;
}
.controls input {
width: 100%;
}
</style>