Técnicas de Animación
Vue proporciona los componentes <Transition>
y <TransitionGroup>
para manejar transiciones de entrada / salida y de lista. Sin embargo, hay muchas otras formas de utilizar las animaciones en la web, incluso en una aplicación Vue. Aquí discutiremos algunas técnicas adicionales.
Animaciones Basadas en Clases
Para los elementos que no entran / salen del DOM, podemos activar animaciones añadiendo dinámicamente una clase CSS:
js
const disabled = ref(false)
function warnDisabled() {
disabled.value = true
setTimeout(() => {
disabled.value = false
}, 1500)
}
template
<div :class="{ shake: disabled }">
<button @click="warnDisabled">Hazme clic</button>
<span v-if="disabled">¡Esta función está desactivada!</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);
}
}
Animaciones Controladas por el Estado
Algunos efectos de transición pueden aplicarse interpolando valores, por ejemplo, vinculando un estilo a un elemento mientras se produce una interacción. Tomemos este ejemplo concreto:
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>Mueve el mouse sobre este div...</p>
<p>x: {{ x }}</p>
</div>
css
.movearea {
transition: 0.3s background-color ease;
}
Mueve tu mouse sobre este div...
x: 0
Además del color, también puedes utilizar vínculos de estilo para animar la transformación, el ancho o la altura. Incluso puedes animar los trazados de SVG utilizando la fuerza física del resorte; después de todo, todos son vínculos a datos de atributos:
Arrástrame
Animación con Watchers
Con algo de creatividad, podemos usar watchers para animar cualquier cosa basada en algún estado numérico. Por ejemplo, podemos animar el propio número:
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
Escribe un número: <input v-model.number="number" />
<p>{{ tweened.number.toFixed(0) }}</p>
Escribe un número:
0