Prova a eseguire il seguente frammento, quindi fai clic sulla casella.
const box = document.querySelector('.box')
box.addEventListener('click', e => {
if (!box.style.transform) {
box.style.transform = 'translateX(100px)'
new Promise(resolve => {
setTimeout(() => {
box.style.transition = 'none'
box.style.transform = ''
resolve('Transition complete')
}, 2000)
}).then(() => {
box.style.transition = ''
})
}
})
.box {
width: 100px;
height: 100px;
border-radius: 5px;
background-color: #121212;
transition: all 2s ease;
}
<div class = "box"></div>
Cosa mi aspetto che accada:
- Il clic accade
- La casella inizia a tradurre in orizzontale di 100 px (questa azione richiede due secondi)
- Al clic,
Promise
viene anche creato un nuovo . Al suo internoPromise
, unasetTimeout
funzione è impostata su 2 secondi - Dopo che l'azione è stata completata (sono trascorsi due secondi),
setTimeout
esegue la sua funzione di richiamata e impostatransition
su nessuna. Dopo averlo fatto,setTimeout
ripristina anche iltransform
suo valore originale, rendendo così la casella per apparire nella posizione originale. - La casella viene visualizzata nella posizione originale senza problemi di effetto di transizione qui
- Al termine di tutte queste operazioni, reimpostare il
transition
valore della casella sul valore originale
Tuttavia, come si può vedere, il transition
valore non sembra essere in none
esecuzione. So che esistono altri metodi per ottenere quanto sopra, ad es. L'utilizzo di fotogrammi chiave e transitionend
, ma perché succede? Ho impostato in modo esplicito transition
l'indietro al suo valore originale solo dopo la setTimeout
completato le sue callback, risolvendo così la promessa.
MODIFICARE
Come da richiesta, ecco una gif del codice che mostra il comportamento problematico: