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,
Promisetambién se crea un nuevo . Dentro de dichoPromise, unasetTimeoutfunción se establece en 2 segundos - Una vez completada la acción (han transcurrido dos segundos),
setTimeoutejecuta su función de devolución de llamada y se establecetransitionen ninguno. Después de hacer eso,setTimeouttambién vuelvetransforma 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,
transitionvuelva a establecer el valor del cuadro en su valor original
Sin embargo, como se puede ver, el transitionvalor no parece ser nonecuando 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 transitionnuevo a su valor original solamente después de la setTimeouttermina 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:
