Veuillez essayer d'exécuter l'extrait de code suivant, puis cliquez sur la case.
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>
Ce que j'attends:
- Le clic se produit
- La boîte commence à traduire horizontalement par 100 pixels (cette action prend deux secondes)
- Au clic, un nouveau
Promise
est également créé. A l'intérieurPromise
, unesetTimeout
fonction est réglée sur 2 secondes - Une fois l'action terminée (deux secondes se sont écoulées),
setTimeout
exécute sa fonction de rappel et définit la valeurtransition
none. Après cela,setTimeout
revient égalementtransform
à sa valeur d'origine, rendant ainsi la boîte à apparaître à l'emplacement d'origine. - La boîte apparaît à l'emplacement d'origine sans problème d' effet de transition ici
- Une fois toutes ces opérations terminées, redéfinissez la
transition
valeur de la boîte à sa valeur d'origine
Cependant, comme on peut le voir, la transition
valeur ne semble pas être none
lors de l'exécution. Je sais qu'il existe d'autres méthodes pour atteindre ce qui précède, par exemple en utilisant des images clés et transitionend
, mais pourquoi cela se produit-il? J'ai explicitement mis le transition
dos à sa valeur d'origine seulement après la setTimeout
fin de son rappel, résolvant ainsi la promesse.
ÉDITER
Selon la demande, voici un gif du code affichant le comportement problématique: