這下有趣囉。
簡述
簡單來說要實作出跟 jQuery animate
的 callback 一樣的效果。
所以上網查了一下,發現邏輯不複雜,只需要透過 setTimeout
來讓 callback 等到動畫結束時才執行。
在動畫結束後刪除元素
舉一個簡單的範例,要做出這樣的效果:
1 2 3 4
| <div class="wrapper"> <div class="block"></div> </div> <button>Animation trigger</button>
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| let duration = 1
document.querySelector('button') .addEventListener('click', handlerAnimation)
function handlerAnimation () { const element = document.querySelector('.block') element.style.transform = 'translateX(400px)' element.style.transition = `transform ${duration}s` setTimeout(() => { element.remove() }, duration * 1000) }
|
就這麼簡單,不用懷疑!
捏一個陽春版的 animate
其實就是用 function 包裝起來,然後添加一些可調整的參數:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
function animate(selector, cssRule, duration, callback) { const element = document.querySelector(selector) for (let key in cssRule) { element.style[key] = cssRule[key] element.style['transition'] = `${key} ${duration}s` } setTimeout(() => { callback(element) }, duration * 1000) }
document .querySelector('button') .addEventListener('click', () => { animate( '.block', {'transform': 'translateX(400px)'}, 1, (element) => element.remove() ) })
|
如果要支援多個 css 規則要修改一下 transition 的部分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
function animate(selector, cssRule, duration, callback) { const element = document.querySelector(selector) let transitionValue = [] for (let key in cssRule) { element.style[key] = cssRule[key] transitionValue.push(key) }
element.style['transition'] = transitionValue.join(` ${duration}s, `) + ` ${duration}s` setTimeout(() => { callback(element) }, duration * 1000) }
document .querySelector('button') .addEventListener('click', () => { animate( '.block', { 'transform': 'translateX(400px)', 'background-color': 'red', 'width': '0px' }, 1, (element) => element.remove() ) })
|
因為 transition
的部分沒辦法用 +=
來新增值,所以要拆開來寫,不能寫在迴圈裡面。