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