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
Promise
tworzony jest również nowy . Wewnątrz powiedziałPromise
,setTimeout
funkcja jest ustawiona na 2 sekundy - Po zakończeniu akcji (po upływie dwóch sekund)
setTimeout
uruchamia funkcję zwrotną i ustawia jątransition
na none. Po wykonaniu tej czynnościsetTimeout
również przywraca siętransform
do 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
transition
wartość pola z powrotem na pierwotną
Jednak, jak można zauważyć, transition
wydaje się , że wartość nie jest none
uruchomiona. 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ć transition
z 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: