Bitte versuchen Sie, das folgende Snippet auszuführen, und klicken Sie dann auf das Feld.
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>
Was ich erwarte:
- Klicken passiert
- Box beginnt mit der horizontalen Übersetzung um 100px (diese Aktion dauert zwei Sekunden).
- Beim Klicken wird auch eine neue
Promise
erstellt. Im InnerenPromise
ist einesetTimeout
Funktion auf 2 Sekunden eingestellt - Nach Abschluss der Aktion (zwei Sekunden sind verstrichen) wird
setTimeout
die Rückruffunktion ausgeführt undtransition
auf "Keine" gesetzt. Danach wirdsetTimeout
auchtransform
der ursprüngliche Wert wiederhergestellt, sodass das Feld an der ursprünglichen Position angezeigt wird. - Die Box erscheint an der ursprünglichen Stelle ohne Übergangseffekt Problem hier
- Setzen Sie nach all diesen Vorgängen den
transition
Wert der Box wieder auf den ursprünglichen Wert zurück
Wie jedoch zu sehen ist, transition
scheint der Wert none
beim Ausführen nicht zu sein . Ich weiß, dass es andere Methoden gibt, um das oben genannte zu erreichen, z. B. die Verwendung von Keyframe und transitionend
, aber warum passiert das? Ich habe das transition
Zurück explizit auf seinen ursprünglichen Wert gesetzt, nachdem der setTimeout
Rückruf beendet wurde, wodurch das Versprechen aufgelöst wurde.
BEARBEITEN
Auf Anfrage ist hier ein GIF des Codes, der das problematische Verhalten anzeigt: