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
Promiseest également créé. A l'intérieurPromise, unesetTimeoutfonction est réglée sur 2 secondes - Une fois l'action terminée (deux secondes se sont écoulées),
setTimeoutexécute sa fonction de rappel et définit la valeurtransitionnone. Après cela,setTimeoutrevient é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
transitionvaleur de la boîte à sa valeur d'origine
Cependant, comme on peut le voir, la transitionvaleur ne semble pas être nonelors 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 transitiondos à sa valeur d'origine seulement après la setTimeoutfin de son rappel, résolvant ainsi la promesse.
ÉDITER
Selon la demande, voici un gif du code affichant le comportement problématique:
