Passa al contenuto

Tecniche di animazione

Vue mette a disposizione i componenti <Transition> e <TransitionGroup> per gestire le transizioni di ingresso/uscita e di elenchi di elementi. Tuttavia, esistono molti altri modi per utilizzare le animazioni sul Web, anche in un'applicazione Vue. Qui discuteremo alcune tecniche aggiuntive.

Animazioni basate su Classi

Per gli elementi che non devono entrare o uscire dal DOM, possiamo attivare animazioni aggiungendo dinamicamente una classe 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">Cliccami</button>
  <span v-if="disabled">Questa funzionalità è disabilitata!</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);
  }
}

Animazioni guidate dallo stato

Alcuni effetti di transizione possono essere applicati tramite una computazione di valori, ad esempio legando uno stile a un elemento mentre avviene un'interazione. Di seguito un esempio:

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>Muovi il mouse su questo div...</p>
  <p>x: {{ x }}</p>
</div>
css
.movearea {
  transition: 0.3s background-color ease;
}

Muovi il mouse su questo div...

x: 0

Oltre al colore, puoi anche utilizzare le associazioni di stile (binding) per animare la trasformazione, la larghezza o l'altezza di un elemento. Puoi anche animare percorsi SVG utilizzando la conformazione vettoriale (spring physics): dopo tutto, sono tutte associazioni di dati di attributi:

Trascinami

Animazione con i Watchers

Con un po' di creatività, possiamo usare gli osservatori (watchers) per animare qualsiasi cosa in base ad uno stato numerico. Ad esempio, possiamo animare il numero stesso come nell'esempio seguente:

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
Scrivi un numero: <input v-model.number="number" />
<p>{{ tweened.toFixed(0) }}</p>
Type a number:

0

Tecniche di animazione has loaded