Спробуйте запустити наступний фрагмент, а потім натисніть на поле.
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>
Що я очікую, що трапиться:
- Клацання відбувається
- Поле починає перекладати горизонтально на 100 пікселів (ця дія займає дві секунди)
- При натисканні
Promise
також створюється новий . Усередині сказавPromise
, AsetTimeout
функція встановлена на 2 секунди - Після завершення дії (минуло дві секунди),
setTimeout
запускає функцію зворотного дзвінка і встановлюєtransition
значення "ні". Після цьогоsetTimeout
також повертаєтьсяtransform
до свого початкового значення, таким чином, поле відображається у вихідному місці. - Поле з’являється в оригінальному місці, тут немає проблем з ефектом переходу
- Після закінчення цих
transition
повернень поверніть значення початкового значення
Однак, як видно, transition
значення, здається, не none
працює під час запуску. Я знаю, що існують інші методи досягнення вищезазначеного, наприклад, використання ключових кадрів і transitionend
, але чому це відбувається? Я явно встановлюю transition
назад його початкове значення лише після того, як setTimeout
закінчується зворотний дзвінок, таким чином вирішуючи Обіцяння.
EDIT
Відповідно до запиту, ось графічний код, що відображає проблематичну поведінку: