다음 스 니펫을 실행 한 다음 상자를 클릭하십시오.
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>
내가 일어날 것으로 예상되는 것 :
- 클릭이 발생합니다
- 상자가 가로로 100px 번역을 시작합니다 (2 초 소요)
- 클릭하면 새로운
Promise
것도 생성됩니다. 내부Promise
에서setTimeout
기능이 2 초로 설정되었습니다. - 조치가 완료된 후 (2 초가 경과 한 후)
setTimeout
콜백 기능을 실행하고transition
none으로 설정하십시오 . 그런 다음 원래 값으로setTimeout
되돌려transform
서 상자를 원래 위치에 표시합니다. - 상자는 전환 효과 문제 없이 원래 위치에 나타납니다.
- 모든 작업이 끝나면
transition
상자 값을 원래 값으로 다시 설정하십시오.
그러나 알 수 있듯이 transition
값을 실행할 none
때 보이지 않는 것 같습니다 . 위와 같은 다른 방법, 예를 들어 keyframe 및를 사용하는 방법 transitionend
이 있지만 왜 이런 일이 발생합니까? 콜백 이 완료된 후에transition
만 명시 적으로 원래 값으로 되돌려 서 약속을 해결합니다.setTimeout
편집하다