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
Promiseerstellt. Im InnerenPromiseist einesetTimeoutFunktion auf 2 Sekunden eingestellt - Nach Abschluss der Aktion (zwei Sekunden sind verstrichen) wird
setTimeoutdie Rückruffunktion ausgeführt undtransitionauf "Keine" gesetzt. Danach wirdsetTimeoutauchtransformder 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
transitionWert der Box wieder auf den ursprünglichen Wert zurück
Wie jedoch zu sehen ist, transitionscheint der Wert nonebeim 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 transitionZurück explizit auf seinen ursprünglichen Wert gesetzt, nachdem der setTimeoutRückruf beendet wurde, wodurch das Versprechen aufgelöst wurde.
BEARBEITEN
Auf Anfrage ist hier ein GIF des Codes, der das problematische Verhalten anzeigt:
