Intente ejecutar el siguiente fragmento y luego haga clic en el cuadro.
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>
Lo que espero que suceda:
- Click pasa
- Box comienza a traducir horizontalmente en 100 px (esta acción lleva dos segundos)
- Al hacer clic,
Promise
también se crea un nuevo . Dentro de dichoPromise
, unasetTimeout
función se establece en 2 segundos - Una vez completada la acción (han transcurrido dos segundos),
setTimeout
ejecuta su función de devolución de llamada y se establecetransition
en ninguno. Después de hacer eso,setTimeout
también vuelvetransform
a su valor original, haciendo que el cuadro aparezca en la ubicación original. - El cuadro aparece en la ubicación original sin ningún problema de efecto de transición aquí
- Después de que todos terminen,
transition
vuelva a establecer el valor del cuadro en su valor original
Sin embargo, como se puede ver, el transition
valor no parece ser none
cuando se ejecuta. Sé que hay otros métodos para lograr lo anterior, por ejemplo, utilizando fotogramas clave y transitionend
, pero ¿por qué sucede esto? Me puse explícitamente el transition
nuevo a su valor original solamente después de la setTimeout
termina su devolución de llamada, resolviendo así la promesa.
EDITAR
Según la solicitud, aquí hay un gif del código que muestra el comportamiento problemático: