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
Promise
também é criado. Por dentroPromise
, umasetTimeout
função é definida para 2 segundos - Depois que a ação é concluída (dois segundos se passaram),
setTimeout
executa sua função de retorno de chamada e definetransition
como nenhum. Depois de fazer isso,setTimeout
também revertetransform
para 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
transition
valor da caixa de volta ao seu valor original
No entanto, como pode ser visto, o transition
valor não parece estar none
em 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 transition
volta ao seu valor original somente após o término do setTimeout
retorno de chamada, resolvendo a Promessa.
EDITAR
Conforme solicitação, aqui está um gif do código que exibe o comportamento problemático: