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,
Promiseviene anche creato un nuovo . Al suo internoPromise, unasetTimeoutfunzione è impostata su 2 secondi - Dopo che l'azione è stata completata (sono trascorsi due secondi),
setTimeoutesegue la sua funzione di richiamata e impostatransitionsu nessuna. Dopo averlo fatto,setTimeoutripristina anche iltransformsuo 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
transitionvalore della casella sul valore originale
Tuttavia, come si può vedere, il transitionvalore non sembra essere in noneesecuzione. 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 transitionl'indietro al suo valore originale solo dopo la setTimeoutcompletato le sue callback, risolvendo così la promessa.
MODIFICARE
Come da richiesta, ecco una gif del codice che mostra il comportamento problematico:
