2020-9-7 seo達(dá)人
無(wú)縫輪播一直是面試的熱門(mén)題目,而大部分答案都是復(fù)制第一張到最后。誠(chéng)然,這種方法是非常標(biāo)準(zhǔn),那么有沒(méi)有另類(lèi)一點(diǎn)的方法呢?
第一種方法是需要把所有圖片一張張擺好,然后慢慢移動(dòng)的,
但是我能不能直接不擺就硬移動(dòng)呢?
如果你使用過(guò)vue的transition
,我們是可以通過(guò)給每一張圖片來(lái)添加入場(chǎng)動(dòng)畫(huà)和離場(chǎng)動(dòng)畫(huà)來(lái)模擬這個(gè)移動(dòng)
這樣看起來(lái)的效果就是圖片從右邊一直往左移動(dòng),但是這個(gè)不一樣的地方是,我們每一個(gè)元素都有這個(gè)進(jìn)場(chǎng)動(dòng)畫(huà)和離場(chǎng)動(dòng)畫(huà),我們根本不用關(guān)心它是第幾個(gè)元素,你只管輪播就是。
很簡(jiǎn)單,我們自己實(shí)現(xiàn)一個(gè)transtition
的效果就好啦,主要做的是以下兩點(diǎn)
xx-enter-active
動(dòng)畫(huà)
xx-leave-active
, 注意要讓動(dòng)畫(huà)播完才消失
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
來(lái)監(jiān)聽(tīng)動(dòng)畫(huà)結(jié)束,注意這里每次從新添加類(lèi)的時(shí)候需要重新添加監(jiān)聽(tīng)器,不然會(huì)無(wú)法監(jiān)聽(tīng)。如果不使用這個(gè)方法你可以使用定時(shí)器的方式來(lái)移除leave-active類(lèi)。
function hide(el){
el.className = el.className.replace(' slide-enter-active','')
el.className += ' slide-leave-active' setTimeout(()=>
{ //動(dòng)畫(huà)結(jié)束后清除class el.className = el.className.replace(' slide-leave-active','')
el.style.display = 'none' }, ANIMATION_TIME) //這個(gè)ANIMATION_TIME為你在css中動(dòng)畫(huà)執(zhí)行的時(shí)間 }
.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
屬性,這個(gè)屬性表示你的元素狀態(tài)將保持動(dòng)畫(huà)后的狀態(tài),如果不設(shè)置的話,動(dòng)畫(huà)跑完一遍,你的元素本來(lái)執(zhí)行了離開(kāi)動(dòng)畫(huà),執(zhí)行完以后會(huì)回來(lái)中央位置杵著。這個(gè)時(shí)候你會(huì)問(wèn)了,上面的代碼不是寫(xiě)了,動(dòng)畫(huà)執(zhí)行完就隱藏元素嗎?
如果你使用上面的setTimeout來(lái)命令元素執(zhí)行完動(dòng)畫(huà)后消失,那么可能會(huì)有一瞬間的閃爍,因?yàn)閷?shí)際業(yè)務(wù)中,你的代碼可能比較復(fù)雜,setTimeout沒(méi)法在那么精準(zhǔn)的時(shí)間內(nèi)執(zhí)行。保險(xiǎn)起見(jiàn),就讓元素保持動(dòng)畫(huà)離開(kāi)的最后狀態(tài),即translateX(-100%)
。此時(shí)元素已經(jīng)在屏幕外了,不用關(guān)心它的表現(xiàn)了
很簡(jiǎn)單,我們進(jìn)一個(gè)新元素的時(shí)候同時(shí)移除舊元素即可,兩者同時(shí)執(zhí)行進(jìn)場(chǎng)和離場(chǎng)動(dòng)畫(huà)即可。
function autoPlay(){
setTimeout(()=>{
toggleShow(新元素, 舊元素) this.autoPlay()
},DURATION) //DURATION為動(dòng)畫(huà)間隔時(shí)間 } function toggleShow(newE,oldE){ //舊ele和新ele同時(shí)動(dòng)畫(huà) hide(oldE)
show(newE)
}
藍(lán)藍(lán)設(shè)計(jì)的小編 http://www.teruid.com