Spróbuj uruchomić następujący fragment kodu, a następnie kliknij pole.
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>
Czego się spodziewam:
- Kliknięcie się dzieje
- Box zaczyna tłumaczyć w poziomie o 100 pikseli (ta czynność zajmuje dwie sekundy)
- Po kliknięciu
Promisetworzony jest również nowy . Wewnątrz powiedziałPromise,setTimeoutfunkcja jest ustawiona na 2 sekundy - Po zakończeniu akcji (po upływie dwóch sekund)
setTimeouturuchamia funkcję zwrotną i ustawia jątransitionna none. Po wykonaniu tej czynnościsetTimeoutrównież przywraca siętransformdo pierwotnej wartości, co powoduje, że pole pojawi się w oryginalnej lokalizacji. - Pole pojawi się w oryginalnej lokalizacji bez problemu z efektem przejścia
- Po zakończeniu wszystkich tych czynności ustaw
transitionwartość pola z powrotem na pierwotną
Jednak, jak można zauważyć, transitionwydaje się , że wartość nie jest noneuruchomiona. Wiem, że istnieją inne metody osiągnięcia powyższego, np. Użycie klatki kluczowej i transitionend, ale dlaczego tak się dzieje? I jawnie ustawić transitionz powrotem do jego pierwotnej wartości tylko posetTimeout zakończy zwrotnego, a więc rozwiązania obietnicy.
EDYTOWAĆ
Jak na żądanie, oto gif kodu wyświetlającego problematyczne zachowanie:
