Skip to content

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)
}
js
export default {
  data() {
    return {
      disabled: false
    }
  },
  methods: {
    warnDisabled() {
      this.disabled = true
      setTimeout(() => {
        this.disabled = 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
}
js
export default {
  data() {
    return {
      x: 0
    }
  },
  methods: {
    onMousemove(e) {
      this.x = 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:

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>
js
import gsap from 'gsap'

export default {
  data() {
    return {
      number: 0,
      tweened: 0
    }
  },
  watch: {
    number(n) {
      gsap.to(this, { duration: 0.5, tweened: Number(n) || 0 })
    }
  }
}
template
Type a number: <input v-model.number="number" />
<p>{{ tweened.toFixed(0) }}</p>
Type a number:

0

Técnicas de Animação has loaded