Tente executar o seguinte snippet e clique na caixa.
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>
O que eu espero que aconteça:
- Clique acontece
- A caixa começa a traduzir horizontalmente em 100px (esta ação leva dois segundos)
- Ao clicar, um novo
Promisetambém é criado. Por dentroPromise, umasetTimeoutfunção é definida para 2 segundos - Depois que a ação é concluída (dois segundos se passaram),
setTimeoutexecuta sua função de retorno de chamada e definetransitioncomo nenhum. Depois de fazer isso,setTimeouttambém revertetransformpara o valor original, fazendo com que a caixa apareça no local original. - A caixa aparece no local original sem nenhum problema de efeito de transição aqui
- Depois de concluir tudo isso, defina o
transitionvalor da caixa de volta ao seu valor original
No entanto, como pode ser visto, o transitionvalor não parece estar noneem execução. Eu sei que existem outros métodos para alcançar o que foi dito acima, por exemplo, usando o quadro-chave e transitionend, mas por que isso acontece? Eu explicitamente defini o valor de transitionvolta ao seu valor original somente após o término do setTimeoutretorno de chamada, resolvendo a Promessa.
EDITAR
Conforme solicitação, aqui está um gif do código que exibe o comportamento problemático:
