Técnicas de Animação
A Vue fornece os componentes <Transition>
e <TransitionGroup>
para manipular a transição de entrada / saída e lista de transições. No entanto, existem muitas outras maneiras de usar animações na Web, até mesmo em uma aplicação de Vue. Abaixo discutiremos algumas técnicas adicionais.
Animações Baseadas em Classe
Para os elementos que não estão a entrar / sair do DOM, podemos acionar animações ao dinamicamente adicionar uma classe de 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);
}
}
Animações Orientadas a Estado
Alguns efeitos de transição podem ser aplicados com a interpolação de valores, por exemplo ao vincular um estilo à um elemento enquanto uma interação ocorre. Considere o seguinte exemplo:
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
Além da cor, também podes usar as vinculações de estilo para animar a transformação com transform
, a largura com width
ou altura com height
. Tu até podes animar os caminhos de SVG usando a física de salto - afinal de contas, são todos atributos de vinculações de dados:
Drag Me
Animar com os Observadores
Com alguma criatividade, podemos usar os observadores para animar qualquer coisa baseada em algum estado numérico. Por exemplo, podemos animar o próprio 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
Type a number: <input v-model.number="number" />
<p>{{ tweened.number.toFixed(0) }}</p>
Type a number:
0