Techniques d'animation
Vue fournit les composants <Transition>
et <TransitionGroup>
pour gérer les transitions d'entrée / sortie et de liste. Cependant, il existe de nombreuses autres manières d'utiliser des animations sur le web, même dans une application Vue. Ici, nous allons discuter de quelques techniques supplémentaires.
Animations basées sur des classes
Pour les éléments qui n'entrent pas / ne quittent pas le DOM, nous pouvons déclencher des animations en ajoutant dynamiquement une classe CSS :
js
const disabled = ref(false)
function warnDisabled() {
disabled.value = true
setTimeout(() => {
disabled.value = false
}, 1500)
}
template
<div :class="{ shake: disabled }">
<button @click="warnDisabled">Click me</button>
<span v-if="disabled">This feature is disabled!</span>
</div>
css
.shake {
animation: shake 0.82s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
transform: translate3d(0, 0, 0);
}
@keyframes shake {
10%,
90% {
transform: translate3d(-1px, 0, 0);
}
20%,
80% {
transform: translate3d(2px, 0, 0);
}
30%,
50%,
70% {
transform: translate3d(-4px, 0, 0);
}
40%,
60% {
transform: translate3d(4px, 0, 0);
}
}
Animations pilotées par l'état
Certaines transitions peuvent être appliquées en interpolant des valeurs, par exemple en liant un style à un élément pendant qu'une interaction se produit. Prenons cet exemple :
js
const x = ref(0)
function onMousemove(e) {
x.value = e.clientX
}
template
<div
@mousemove="onMousemove"
:style="{ backgroundColor: `hsl(${x}, 80%, 50%)` }"
class="movearea"
>
<p>Move your mouse across this div...</p>
<p>x: {{ x }}</p>
</div>
css
.movearea {
transition: 0.3s background-color ease;
}
Move your mouse across this div...
x: 0
En plus de la couleur, vous pouvez également utiliser des liaisons de style pour animer la transformation, la largeur ou la hauteur. Vous pouvez même animer des chemins SVG en utilisant la physique de ressort - après tout, ce sont toutes des liaisons de données d'attributs :
Drag Me
Animer avec des observateurs
Avec un peu de créativité, nous pouvons utiliser des observateurs pour animer n'importe quoi en fonction d'un état numérique. Par exemple, nous pouvons animer le nombre lui-même :
js
import { ref, reactive, watch } from 'vue'
import gsap from 'gsap'
const number = ref(0)
const tweened = reactive({
number: 0
})
watch(number, (n) => {
gsap.to(tweened, { duration: 0.5, number: Number(n) || 0 })
})
template
Type a number: <input v-model.number="number" />
<p>{{ tweened.number.toFixed(0) }}</p>
Type a number:
0