Transizioni CSS in Vuejs e Nuxtjs

Pubblicato: 2022-03-10
Riepilogo rapido ↬ Le transizioni sono un ottimo modo per rimuovere, modificare o aggiornare i dati in un'applicazione perché la loro occorrenza aggiunge un effetto piacevole ed è positivo per l'esperienza dell'utente. In questo tutorial, esamineremo i diversi modi per applicare le transizioni nelle applicazioni Vue.js e Nuxt.js.

Le transizioni sono un modulo di CSS che consente di creare transizioni graduali tra i valori di specifiche proprietà CSS. Il comportamento di queste transizioni può essere controllato specificandone la funzione di temporizzazione, la durata e altri attributi. L'uso di queste transizioni nelle applicazioni e nei siti Web crea un'esperienza visiva migliore e talvolta attira e mantiene l'attenzione dell'utente mentre un'informazione viene introdotta o lasciata dallo schermo. Secondo Can I Use, le transizioni sono supportate dalla maggior parte dei browser, sebbene ci siano alcuni problemi minori con Internet Explorer e Safari.

Dati sul supporto per la funzione di transizione CSS nei principali browser di caniuse.com
Fonte: caniuse.com. (Grande anteprima)

Vue.js è un framework JavaScript open source per la creazione di applicazioni Web rivolte ai client e applicazioni a pagina singola (SPA). Una delle caratteristiche di questo framework è la possibilità di aggiungere transizioni a un'app senza problemi, di passare da una pagina all'altra o da un componente all'altro, e vedremo come farlo in questo tutorial.

Nuxt.js è anche un framework JavaScript, basato su Vue.js (e spesso indicato come framework di un framework), per la creazione di applicazioni Web lato server, siti Web generati statici e SPA. Funziona come Vue.js, quindi se conosci Vue.js, non dovresti avere molti problemi a iniziare con Nuxt.js. Nuxt.js viene fornito con due proprietà per l'aggiunta di transizioni a un'app e in questo tutorial tratteremo anche quelle.

Questo tutorial richiede una conoscenza di base di Vue.js o Nuxt.js. Tutti i frammenti di codice in questo tutorial possono essere trovati su GitHub.

Altro dopo il salto! Continua a leggere sotto ↓

Che cos'è una transizione?

Secondo l'Oxford Dictionary, una transizione può essere definita come:

“Un passaggio in uno scritto che collega senza problemi due argomenti o sezioni tra loro.

Il processo o un periodo di passaggio da uno stato o condizione a un altro.

In termini di fisica, una transizione è così definita:

"Un cambiamento di un atomo, nucleo, elettrone, ecc. Da uno stato quantistico all'altro, con emissione o assorbimento di radiazioni."

Da queste definizioni, abbiamo un'idea di cosa sia una transizione. Le definizioni coinvolgono tutte due cose o stati diversi. In termini di codice, una transizione non è così diversa.

Che cos'è una transizione CSS?

Secondo la documentazione web di Mozilla:

“CSS Transitions è un modulo di CSS che consente di creare transizioni graduali tra i valori di specifiche proprietà CSS. Il comportamento di queste transizioni può essere controllato specificandone la funzione di temporizzazione, la durata e altri attributi".

Ciò significa che possiamo definire una transizione CSS come: il cambiamento nella proprietà CSS di uno o più elementi da un valore all'altro.

La proprietà di transition CSS ci consente di aggiungere un effetto di transizione a qualsiasi elemento valido. Consiste in un massimo di altre quattro proprietà (cinque, se contiamo la proprietà di transition stessa) che possono essere utilizzate singolarmente o combinate come abbreviazione. Ogni proprietà ha una funzione diversa.

transition-property

La transition-property accetta il nome della proprietà CSS su cui vogliamo fare attenzione alle modifiche e di cui vogliamo trasferire il processo di modifica. Si presenta così:

 .btn { width: 200px; height: 50px; transition-property: width; background-color: red; color: #fff; border: 0; }

Ma questa proprietà non fa nulla senza la proprietà successiva.

transition-duration

La proprietà della transition-duration specifica il tempo durante il quale la modifica degli elementi nella transition-property deve continuare. Questa proprietà è necessaria per il passaggio al lavoro. Se non è impostato (con un valore maggiore di 0s ), il valore predefinito di 0s significherebbe che non verrà eseguito. Quindi, impostiamo una durata per questa transizione:

 .btn { width: 200px; transition-property: width; transition-duration: 2s; background-color: red; color: #fff; border: 0; }

Qui abbiamo un elemento con un nome di classe btn che ha una larghezza di 200px . Stiamo usando sia la transition-property transition-duration della transizione qui. Ciò significa: "Ehi, CSS, fai attenzione a quando la proprietà width cambia e, quando ciò accade, lascia che l'effetto 2s per cambiare".

Quindi, se abbiamo un pulsante con un nome di classe btn , il file index.html sarebbe simile a questo:

 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>CSS Transitions</title> <link rel="stylesheet" href="./assets/styles.css"> </head> <body> <Section> <h1>Hi CSS Transitions</h1> <button class="btn">Hover on me to see a cool transition</button> </Section> </body> </html>

Qui, abbiamo un file HTML che contiene un pulsante con una classe che ha transition-property transition-duration che controllano le modifiche alla larghezza dell'elemento.

Una cosa da notare è che, affinché la transizione sul nostro pulsante funzioni, dobbiamo effettivamente cambiare la larghezza di quell'elemento, sia regolando manualmente la larghezza con gli strumenti di sviluppo nel browser, sia usando uno degli pseudo CSS -classes o usando JavaScript. Ai fini di questo tutorial, utilizzeremo la pseudo-classe CSS :hover per modificare la larghezza del pulsante:

 // existing styles .btn:hover { width: 300px; }

Ora, se passiamo con il mouse su questo pulsante, dovremmo vedere la larghezza del pulsante aumentare gradualmente nel tempo impostato, che è 2s .

Vedi la proprietà di transizione della penna e la durata della transizione di Timi Omoyeni (@timibadass) su CodePen.

transition-timing-function

La proprietà della transition-timing-function determina la velocità alla quale si verifica l'effetto di transizione. Sono disponibili cinque valori per questa proprietà:

  • ease
    Questo (l'impostazione predefinita) specifica un effetto di transizione che inizia lentamente, poi diventa veloce, quindi termina lentamente.
  • linear
    Specifica un effetto di transizione con la stessa velocità dall'inizio alla fine.
  • ease-in
    Questo specifica un effetto di transizione con un avvio lento.
  • ease-out
    Specifica un effetto di transizione con un'estremità lenta.
  • ease-in-out
    Questo specifica un effetto di transizione con un inizio e una fine lenti.
  • cubic-bezier(n,n,n,n)
    Ciò consente di definire i propri valori in una funzione cubic-bezier.

Quindi, se aggiungiamo ease-in al nostro pulsante, dovremmo notare la velocità con cui la width e l' height cambiano, rispetto alla velocità con cui il pulsante torna al suo stato normale. Ecco il nostro foglio styles.css aggiornato:

 .btn { width: 200px; height: 50px; transition-property: width; transition-duration: 2s; transition-timing-function: ease-in; background-color: red; color: #fff; border: 0; }

Se vogliamo un effetto di velocità più drammatico o la libertà di impostare un effetto di velocità specifico, possiamo usare cubic-bezier(n,n,n,n) :

 btn { width: 200px; height: 50px; transition-property: width; transition-duration: 2s; transition-timing-function: cubic-bezier(0.075, 0.82, 0.165, 1); background-color: red; color: #fff; border: 0; } 

Vedi la funzione di temporizzazione della transizione della penna di Timi Omoyeni (@timibadass) su CodePen.

Una cosa interessante di questo valore è che puoi modificarlo direttamente nel browser utilizzando gli strumenti di sviluppo.

bezier cubico negli strumenti di sviluppo.
Cubic bezier negli strumenti di sviluppo del browser. (Grande anteprima)

Se fai clic sulla parte evidenziata dei tuoi strumenti di sviluppo, otterrai un'interfaccia per modificare le opzioni cubic-bezier :

interfaccia bezier cubica evidenziata in giallo.
Interfaccia bezier cubica evidenziata in giallo. (Grande anteprima)

Mentre sposti i due punti, i valori di (n,n,n,n) cambiano e vedrai una rappresentazione (evidenziata in rosso) di come apparirà l'effetto velocità. Questo può essere molto utile quando hai in mente un effetto di velocità specifico.

transition-delay

La proprietà transition-delay imposta per quanto tempo (in secondi) la transizione deve attendere prima che inizi a verificarsi l'effetto. Questa volta è diversa dalla proprietà della transition-duration , che specifica per quanto tempo avrà luogo l'effetto di transizione.

 .btn { width: 200px; height: 50px; transition-property: width; transition-duration: 2s; transition-timing-function: cubic-bezier(0.075, 0.82, 0.165, 1); transition-delay: 5s; background-color: red; color: #fff; border: 0; }

Se lo provi nel browser, noterai un ritardo prima che la width dell'elemento inizi a cambiare. Ciò è dovuto alla proprietà e al valore transition-delay che abbiamo impostato.

Guarda il ritardo di transizione della penna di Timi Omoyeni (@timibadass) su CodePen.

Proprietà di stenografia

Le singole proprietà di transizione possono essere noiose da usare. Per questo motivo, abbiamo la proprietà abbreviata: transition . Accetta tutte le proprietà in un ordine definito:

 { transition: abcd; }

Qui, le lettere corrispondono come segue:

  • a: transition-property
  • b: transition-duration
  • c: transition-timing-function
  • d: transition-delay

Possiamo rifattorizzare la nostra transizione esistente per lavorare utilizzando questa proprietà abbreviata:

 // from .btn { width: 200px; height: 50px; transition-property: width; transition-duration: 2s; transition-timing-function: cubic-bezier(0.075, 0.82, 0.165, 1); transition-delay: 1s; background-color: red; color: #fff; border: 0; } // to .btn { width: 200px; height: 50px; transition: width 2s cubic-bezier(0.075, 0.82, 0.165, 1) 1s; background-color: red; color: #fff; border: 0; }

Se proviamo questo codice nel browser, otterremo lo stesso effetto di transizione che abbiamo ottenuto quando abbiamo utilizzato le singole proprietà.

Guarda la proprietà Pen using shorthand di Timi Omoyeni (@timibadass) su CodePen.

Transizioni in Vue.js

Vue.js viene fornito con due modi diversi per aggiungere transizioni a un'applicazione. Questo non significa che non possiamo usare le transizioni nel modo CSS. Significa solo che gli sviluppatori di Vue.js si sono basati sui CSS per semplificare l'utilizzo delle transizioni. Diamo un'occhiata a loro uno per uno.

Transizione di singoli elementi e componenti

Un modo in cui possiamo utilizzare le transizioni in Vue.js è avvolgere il componente di transition attorno a un elemento o componente, utilizzando uno dei seguenti:

  • rendering condizionale (usando v-if ),
  • visualizzazione condizionale (usando v-show ),
  • componenti dinamiche,
  • nodi radice dei componenti.

Quando sviluppiamo un'applicazione, ci sono casi in cui desideriamo visualizzare i dati all'utente in base a un valore (come un booleano). Ecco un esempio di come funziona, tratto dal file index.vue :

 <template> <div> <p v-if="show">Now you see me!</p> <p v-else>Now you don't!</p> <button @click="show = !show">click me</button> </div> </template> <script> export default { data() { return { show: true } } } </script> <style> </style>

Abbiamo aggiunto due paragrafi a questa pagina che appaiono a seconda del valore di show . Abbiamo anche un pulsante che cambia il valore di show quando viene cliccato. Aggiungeremo questa pagina al nostro file App.vue importandolo in questo modo:

 <template> <div> <Index /> </div> </template> <script> import Index from "./components/index.vue"; export default { name: 'App', components: { Index } } </script>

Se apriamo il browser, dovremmo vedere il nostro paragrafo e pulsante:

visualizza la pagina di destinazione quando lo spettacolo è vero.
Pagina di destinazione Vue.js nello stato predefinito. (Grande anteprima)

In questo momento, facendo clic sul pulsante cambia solo il valore di show , che fa cambiare il testo visibile:

pagina di destinazione quando lo spettacolo è falso.
Pagina di destinazione quando si fa clic sul pulsante. (Grande anteprima)

L'aggiunta di una transizione a questo paragrafo può essere eseguita avvolgendo entrambi i paragrafi nel componente di transition . Questo componente accetta un name prop, che è molto importante per il funzionamento della transizione.

 <template> <div> <transition name="fade"> <p v-if="show">Now you see me!</p> <p v-else>Now you don't!</p> </transition> <button @click="show = !show">click me</button> </div> </template>

Questo nome indica a Vue.js quale transizione applicare agli elementi o ai componenti all'interno di questo componente di transition . A questo punto, se clicchiamo sul pulsante, non noteremo comunque alcuna transizione perché dobbiamo ancora aggiungere la configurazione per la nostra transizione sotto forma di classi CSS.

Una cosa da notare è che, quando si utilizza una transizione tra due elementi dello stesso tag, è necessario specificare un attributo chiave su ciascun elemento affinché la transizione avvenga.

 <template> <div> <transition name="fade"> <p v-if="show" key="visible">Now you see me!</p> <p v-else key="notVisible">Now you don't!</p> </transition> <button @click="show = !show">click me</button> </div> </template>

Vue.js ha sei classi di transizione che vengono applicate agli elementi o ai componenti all'interno del componente di transition e ciascuna di queste classi rappresenta uno stato nel processo di transizione. Ne esamineremo solo alcuni.

v-enter

La classe v-enter rappresenta lo "stato iniziale per entrare". Questo è il punto in cui una condizione ( v-if o v-else ) è stata soddisfatta e l'elemento sta per essere reso visibile. A questo punto, la classe è stata aggiunta all'elemento e viene rimossa una volta che l'elemento è stato aggiunto. Il name prop (in questo caso, fade ) allegato al componente di transition è preceduto da questo nome di classe, ma senza v . Questa v può essere utilizzata per impostazione predefinita se il name non viene fornito. Pertanto, possiamo aggiungere questa classe al nostro file index.vue :

 <style> p { color: green; } .fade-enter{ color: red; transform: translateY(20px); } </style>

Innanzitutto, aggiungiamo un color green a tutti i paragrafi della pagina. Quindi, aggiungiamo la nostra prima classe di transizione, fade-name . All'interno di questa classe, cambiamo il color in rosso e utilizziamo la proprietà transform e translateY per spostare il paragrafo di 20px lungo l'asse y (in verticale). Se proviamo a fare nuovamente clic sul pulsante, noteremo che durante il passaggio si verifica pochissima o nessuna transizione perché dobbiamo aggiungere questa prossima classe che esamineremo.

v-enter-active

La classe v-enter-active rappresenta lo stato di "intero ingresso" di un elemento di transizione. Significa che questa classe viene aggiunta appena prima che l'elemento venga inserito o diventi visibile e viene rimossa al termine della transizione. Questa classe è importante per il funzionamento di v-enter perché può essere utilizzata per aggiungere la proprietà di transition CSS alla classe, insieme alle sue proprietà ( transition-property , transition-duration , transition-timing-function e transition-delay ), alcuni dei quali sono necessari affinché l'effetto di transizione funzioni. Aggiungiamo questa classe alla nostra app e vediamo cosa succede:

 .fade-enter-active { transition: transform .3s cubic-bezier(1.0, 0.5, 0.8, 1.0), color .5s cubic-bezier(1.0, 0.5, 0.8, 1.0); } 

Guarda la transizione Pen vue enter state di Timi Omoyeni (@timibadass) su CodePen.

Ora, se clicchiamo sul pulsante, noteremo la transizione del colore e la posizione di ciascuno dei testi man mano che vengono visualizzati. Ma la transizione dal visible al hidden non è abbastanza agevole perché non sta avvenendo alcuna transizione.

v-leave-active

La classe v-leave-active rappresenta l'intero stato in cui un elemento cambia da visible a hidden . Ciò significa che questa classe viene applicata dal momento in cui un elemento inizia a lasciare la pagina e viene rimossa al termine della transizione. Questa classe è importante per applicare una transizione leave perché contiene la proprietà di transition CSS, che contiene anche altre proprietà di transizione. Aggiungiamo questo alla nostra app e vediamo cosa succede:

 .fade-leave-active { transition: transform 1s cubic-bezier(1.0, 0.5, 0.8, 1.0), color 1s cubic-bezier(1.0, 0.5, 0.8, 1.0); } 

Guarda la transizione Pen vue lasciare lo stato attivo di Timi Omoyeni (@timibadass) su CodePen.

Quando clicchiamo ora sul pulsante, noteremo che l'elemento che dovrebbe uscire attende circa 2 secondi prima di scomparire. Questo perché Vue.js si aspetta che venga aggiunta la classe successiva con questa transizione affinché abbia effetto.

v-leave-to

La transizione v-leave-to rappresenta lo stato di "partenza", ovvero il punto in cui un elemento inizia a partire e viene attivata la sua transizione. Viene aggiunto un fotogramma dopo l'attivazione di una transizione in uscita e rimosso al termine della transizione o dell'animazione. Aggiungiamo questa classe alla nostra app e vediamo cosa succede:

 .fade-leave-to { transform: translateX(100px); color: cyan; }

Cliccando sul pulsante, noteremo che ogni elemento che sta uscendo scorre verso destra al variare del colore.

Vedi la transizione Pen vue leave to state di Timi Omoyeni (@timibadass) su CodePen.

Ora che capiamo come funzionano le transizioni in Vue.js, ecco un'immagine che riunisce tutto:

classificazione delle classi di transizione vue
Classificazione delle classi di transizione Vue.js. (Grande anteprima)

Infine, si noti la transizione non così fluida che si verifica durante gli stati di entrata e uscita degli elementi che stanno transitando. Questo perché le transizioni di Vue.js si verificano simultaneamente. Vue.js ha una mode prop che ci aiuta a ottenere un processo di transizione molto fluido. Questo prop accetta uno dei seguenti valori:

  • in-out
    Il nuovo elemento passa per primo, quindi, quando è completo, l'elemento corrente passa all'esterno.
  • out-in
    L'elemento corrente passa prima all'esterno, quindi, una volta completato, il nuovo elemento passa all'interno.

Se aggiungiamo questa mode al nostro file index.vue e riproviamo, dovremmo vedere una transizione migliore:

 <template> <div> <transition name="fade" appear mode="out-in"> <p v-if="show" key="visible">Now you see me!</p> <p v-else key="notVisible">Now you don't!</p> </transition> <button @click="transitionMe">click me</button> </div> </template>

Ora, se clicchiamo sul pulsante, noteremo che un elemento esce prima che un altro entri. Questo è il risultato della mode che abbiamo selezionato per questa transizione. Se proviamo l'altra modalità, otterremo un comportamento diverso.

Guarda la transizione Pen vue con modalità di Timi Omoyeni (@timibadass) su CodePen.

Elenca le transizioni

Se provi ad aggiungere transizioni a più di un elemento alla volta utilizzando il componente di transition , sulla console verrà visualizzato un errore:

Errore di transizione Vue stampato nella console.
Errore Vue.js stampato nella console. (Grande anteprima)

Questo perché il componente di transition non ha lo scopo di eseguire il rendering di più di un elemento alla volta. Se vogliamo eseguire la transizione di due o più elementi alla volta o eseguire il rendering di un elenco (usando v-for ), utilizziamo il componente transition-group . Questo componente accetta anche un name prop, ma presenta alcune differenze rispetto al componente di transition , tra cui le seguenti:

  • È richiesto un attributo chiave per ogni elemento all'interno di questo componente.
  • Non è necessario il mode prop perché più di un elemento verrebbe renderizzato alla volta.
  • Un elemento span viene visualizzato per impostazione predefinita, ma può essere modificato specificando un tag prop quando si definisce il componente transition-group . Diamo un'occhiata a un esempio (nel nostro file listTransition.vue ):
 <template> <div> <h1>List/Group Transition</h1> <ul> <li v-for="user in users" :key="user.id"> {{user.name}} <button>Remove</button> </li> </ul> </div> </template> <script> export default { data() { return { users: [ { name: "Vuejs", id: 1 }, { name: "Vuex", id: 2 }, { name: "Router", id: 3 } ] }; } }; </script> <style> </style>

Qui abbiamo una serie di users , che eseguiamo in loop utilizzando v-for , visualizzando il nome nella nostra sezione del modello. Per poter visualizzare questo elenco, dobbiamo importare questo componente nella pagina App.vue :

 <template> <div> <Index /> <listTransition /> </div> </template> <script> import Index from "./components/index.vue"; import listTransition from "./components/listTransition.vue"; export default { name: "App", components: { Index, listTransition } }; </script>

Nota che quando utilizziamo il componente transition-group , invece di racchiudere la nostra lista con un tag ul (o qualsiasi tag che abbiamo in mente), lo avvolgiamo attorno al componente transition-group e aggiungiamo il tag al tag prop, in questo modo:

 <template> <div> <h1>List/Group Transition</h1> <transition-group name="slide-fade" tag='ul'> <li v-for="user in users" :key="user.id"> {{user.name}} <button>Remove</button> </li> </transition-group> </div> </template> <script> export default { data() { return { users: [ { name: "Vuejs", id: 1 }, { name: "Vuex", id: 2 }, { name: "Router", id: 3 } ] }; } }; </script> <style> .slide-fade-enter-active { transition: transform 0.3s cubic-bezier(1, 0.5, 0.8, 1), color 0.5s cubic-bezier(1, 0.5, 0.8, 1); } .slide-fade-leave-active { transition: transform 1s cubic-bezier(1, 0.5, 0.8, 1), color 1s cubic-bezier(1, 0.5, 0.8, 1); } .slide-fade-enter { color: mediumblue; transform: translateY(20px); } .slide-fade-leave-to { transform: translateX(100px); color: cyan; } </style>

Qui, abbiamo sostituito il tag ul con il componente transition-group e abbiamo aggiunto ul come valore del tag prop. Se esaminiamo la pagina aggiornata negli strumenti di sviluppo, vedremo che l'elenco è stato racchiuso nell'elemento che abbiamo specificato nel tag prop (ovvero ul ).

tag ul evidenziato negli strumenti di sviluppo.
Il tag ul evidenziato negli strumenti per sviluppatori. (Grande anteprima)

Abbiamo anche aggiunto un supporto per il name di transizione con un valore di slide-fade a questo componente, con regole di stile di seguito nella sezione di style che seguono questa convenzione di denominazione. Affinché funzioni, dobbiamo aggiungere le seguenti righe di codice al nostro file:

 <template> <div> <h1>List/Group Transition</h1> <transition-group name="slide-fade" tag="ul"> <li v-for="user in users" :key="user.id"> {{user.name}} <button @click="removeUser(user.id)">Remove</button> </li> </transition-group> </div> </template> <script> export default { // ... methods: { removeUser(id) { let users = this.users.filter(user => user.id !== id); this.users = users; } } }; </script>

Nella sezione del modello, aggiungiamo un evento click a ogni pulsante nel ciclo e passiamo user.id al metodo removeUser allegato a questo evento click. Creiamo quindi questa funzione nella sezione script del nostro file. Questa funzione accetta un id come argomento. Quindi, esaminiamo i nostri utenti esistenti e filtriamo l'utente con l' id passato a questa funzione. Al termine, salviamo il nostro nuovo array di utenti nei dati della nostra pagina.

A questo punto, se fai clic su uno qualsiasi dei pulsanti per gli utenti, verrà applicato un effetto di transizione mentre l'utente viene rimosso dall'elenco.

Vedi la transizione dell'elenco Pen Vue di Timi Omoyeni (@timibadass) su CodePen.

Transizioni in Nuxt.js:

L'aggiunta di transizioni a un'applicazione Nuxt.js è molto diversa da come potresti essere abituato in Vue.js. In Nuxt.js, il componente di transition viene aggiunto automaticamente all'applicazione per te. Tutto quello che devi fare è una delle seguenti.

Aggiungilo al singolo componente della pagina

Nuxt.js ci consente di aggiungere transizioni a un singolo componente di pagina senza problemi. Questa transizione viene applicata mentre l'utente sta navigando su questa pagina. Tutto quello che dobbiamo fare è aggiungere una proprietà di transition alla sezione script del componente. Questa proprietà può essere una stringa, una funzione o un oggetto. Alcune delle proprietà che accetta sono:

  • name ,
  • mode ,
  • css .

Come Vue.js, Nuxt.js ha un name predefinito che viene assegnato a una classe di transizione se non viene fornito alcun name e si chiama page . Vediamo come funziona quando lo aggiungiamo alla nostra applicazione in transition.vue :

 <template> <div> <p> Lorem ipsum dolor sit amet consectetur adipisicing elit. Labore libero odio, asperiores debitis harum ipsa neque cum nulla incidunt explicabo ut eaque placeat qui, quis voluptas. Aut necessitatibus aliquam veritatis. </p> <nuxt-link to="/">home</nuxt-link> </div> </template> <script> export default { transition: { name: "fade", mode: "out-in" }, data() { return { show: true }; } }; </script> <style> p { color: green; } .fade-enter-active { transition: transform 0.3s cubic-bezier(1, 0.5, 0.8, 1), color 0.5s cubic-bezier(1, 0.5, 0.8, 1); } .fade-leave-active { transition: transform 1s cubic-bezier(1, 0.5, 0.8, 1), color 1s cubic-bezier(1, 0.5, 0.8, 1); } .fade-enter { color: mediumblue; transform: translateY(20px); } .fade-leave-to { transform: translateX(100px); color: cyan; } </style>

In questa pagina, abbiamo visualizzato "lorem ipsum" nella sezione del modello. Abbiamo anche aggiunto la proprietà di transition , a cui abbiamo passato un oggetto il cui name è impostato su fade e la cui mode è impostata su out-in . Infine, nella sezione style , abbiamo aggiunto alcuni stili che controllano la transizione mentre l'utente naviga tra questa pagina e l'altra.

Affinché questa transizione funzioni, dobbiamo passare a /transition , ma non noteremo alcuna transizione se inseriamo manualmente questo percorso nel nostro browser. Quindi, aggiungiamo un collegamento a questa pagina nella pagina index.vue .

 <template> <div class="container"> <div> // .. <nuxt-link to="/transition">next page</nuxt-link> </div> </div> </template>

Ora, se facciamo clic sul collegamento in una delle due pagine, noteremo una transizione scorrevole mentre il browser si sposta da e verso il percorso /transition .

pageTransition

L'aggiunta di transizioni a singole pagine può essere difficile se vogliamo aggiungerle a tutte le pagine dell'applicazione. È qui che entra in pageTransition . Questa proprietà ci consente di aggiungere una configurazione generale per tutte le nostre pagine nel file nuxt.config.js . Questa proprietà accetta sia una stringa che un oggetto come opzione. Vediamo come funziona in nuxt.config.js :

 export default { // ... /* ** Global CSS */ css: [ '~/assets/transition.css' ], pageTransition: { name: "fade", mode: "out-in" }, }

Qui abbiamo aggiunto il collegamento a un file CSS, che creeremo a breve. Abbiamo anche aggiunto la proprietà pageTransition al file, insieme alla sua configurazione. Ora creiamo il nostro file CSS, transition.css e aggiungiamo i seguenti stili:

 .fade-enter-active { transition: transform 0.3s cubic-bezier(1, 0.5, 0.8, 1), color 0.5s cubic-bezier(1, 0.5, 0.8, 1); } .fade-leave-active { transition: transform 1s cubic-bezier(1, 1, 1, 1), color 1s cubic-bezier(1, 0.5, 0.8, 1); } .fade-enter { color: mediumblue; transform: translateY(20px); } .fade-leave-to { transform: translate3d(-500px, -300px 400px); color: cyan; }

Abbiamo aggiunto le classi e gli stili che verranno applicati alla transizione tra un percorso e l'altro. Se eliminiamo la configurazione della transition.vue dalla pagina transition.vue e proviamo a navigare tra le due pagine, otterremo un effetto di transizione.

layoutTransition

La proprietà layoutTransition ci consente di applicare le transizioni in base al layout in cui si trova la pagina. Funziona allo stesso modo di pageTranslation , tranne per il fatto che funziona in base al layout . Il nome di transizione predefinito è layout . Ecco un esempio di come funziona, in nuxt.config.js :

 export default { // ... /* ** Global CSS */ css: [ '~/assets/transition.css' ], layoutTransition: { name: "fade", mode: "out-in" }, }

Nota che la fade deve essere il nome del layout affinché la transizione funzioni con il suo layout. Creiamo questo nuovo layout in newLayout.vue per vedere cosa intendo:

 <template> <!-- Your template --> <div> <h1>new layout</h1> </div> </template> <script> export default { layout: "blog" // page component definitions }; </script>

Conclusione

Abbiamo imparato le transizioni CSS e come crearle usando le proprietà di transizione individualmente ( transition-property , transition-duration , transition-timing-function e transition-delay ) e usando la proprietà di transition abbreviata. Abbiamo anche spiegato come applicare queste transizioni sia in Vue.js che in Nuxt.js. Ma non è tutto. Vue.js ha più modi per applicare le transizioni in un'applicazione:

  • "Animazioni CSS", Vue.js
  • "Transizione tra componenti", Vue.js
  • "Transizioni di stato", Vue.js

Risorse correlate

  • "Transizioni CSS", MDN Web Docs
  • “transizione” (definizione), Lessico
  • “CSS Transitions”, W3Schools
  • "Entra/abbandona ed elenca le transizioni", Vue.js
  • Entra/Esci dalla grafica, Vue.js
  • "API: la proprietà di transition della pagina", Nuxt.js
  • "API: proprietà di transizione", Nuxt.js
  • "Transizioni di pagina e layout in Nuxt.js", Debbie O'Brien, DEV