2020-9-7 seo達人
無縫輪播一直是面試的熱門題目,而大部分答案都是復制第一張到最后。誠然,這種方法是非常標準,那么有沒有另類一點的方法呢?
第一種方法是需要把所有圖片一張張擺好,然后慢慢移動的,
但是我能不能直接不擺就硬移動呢?
如果你使用過vue的transition
,我們是可以通過給每一張圖片來添加入場動畫和離場動畫來模擬這個移動
這樣看起來的效果就是圖片從右邊一直往左移動,但是這個不一樣的地方是,我們每一個元素都有這個進場動畫和離場動畫,我們根本不用關心它是第幾個元素,你只管輪播就是。
很簡單,我們自己實現一個transtition
的效果就好啦,主要做的是以下兩點
xx-enter-active
動畫
xx-leave-active
, 注意要讓動畫播完才消失
function hide(el){
el.className = el.className.replace(' slide-enter-active','')
el.className += ' slide-leave-active' el.addEventListener('animationend',animationEvent)
} function animationEvent(e){
e.target.className = e.target.className.replace(' slide-leave-active','')
e.target.style.display = 'none' e.target.removeEventListener('animationend',animationEvent)
} function show(el){
el.style.display = 'flex' el.className += ' slide-enter-active' }
這里我們使用了animationend
來監聽動畫結束,注意這里每次從新添加類的時候需要重新添加監聽器,不然會無法監聽。如果不使用這個方法你可以使用定時器的方式來移除leave-active類。
function hide(el){
el.className = el.className.replace(' slide-enter-active','')
el.className += ' slide-leave-active' setTimeout(()=>
{ //動畫結束后清除class el.className = el.className.replace(' slide-leave-active','')
el.style.display = 'none' }, ANIMATION_TIME) //這個ANIMATION_TIME為你在css中動畫執行的時間 }
.slide-enter-active{ position: absolute; animation: slideIn ease .5s forwards;
} .slide-leave-active{ position: absolute; animation: slideOut ease .5s forwards;
} @keyframes slideIn {
0%{ transform: translateX(100%);
}
100%{ transform: translateX(0);
}
} @keyframes slideOut {
0%{ transform: translateX(0);
}
100%{ transform: translateX(-100%);
}
}
需要注意的是這里的 forwards
屬性,這個屬性表示你的元素狀態將保持動畫后的狀態,如果不設置的話,動畫跑完一遍,你的元素本來執行了離開動畫,執行完以后會回來中央位置杵著。這個時候你會問了,上面的代碼不是寫了,動畫執行完就隱藏元素嗎?
如果你使用上面的setTimeout來命令元素執行完動畫后消失,那么可能會有一瞬間的閃爍,因為實際業務中,你的代碼可能比較復雜,setTimeout沒法在那么精準的時間內執行。保險起見,就讓元素保持動畫離開的最后狀態,即translateX(-100%)
。此時元素已經在屏幕外了,不用關心它的表現了
很簡單,我們進一個新元素的時候同時移除舊元素即可,兩者同時執行進場和離場動畫即可。
function autoPlay(){
setTimeout(()=>{
toggleShow(新元素, 舊元素) this.autoPlay()
},DURATION) //DURATION為動畫間隔時間 } function toggleShow(newE,oldE){ //舊ele和新ele同時動畫 hide(oldE)
show(newE)
}