每次項目使用輪播的時候都是直接用swiper,實話實說,功能強大,簡單。可是想一想本身每次都使用最基本的,因而就本身搗鼓了一個。npm
先說一下無縫滾動原理吧:動畫
本來是在想有沒有什麼好辦法能夠不復制節點,後來寫了一些動畫發現沒辦法作到,因而也是採用了複製先後節點的方法。如上圖,在第一個複製一個最後一個的節點,最後一個加上第一個的節點。當滾動到最後一個的時候,繼續往下滾動到複製的節點,而後在下一次滾動以前判斷,若是是最後一個立馬無動畫滾動到初始化位置。向右的時候也是同樣的原理。ui
這邊也說一下動畫問題,原本使用定時器去移動,後來有個網友推薦使用的是transition,確實很美麗,樣式只要有改變都會是緩慢的,而後移動使用的是絕對定位position,而後使用transform的translate3d,移動的是一整個塊,而不是單個的元素。this
移動的距離原本使用的是元素style.left,後面發現屢次點擊會有很大偏差,因而採用index去計算元素的寬度而後移動。附上動畫方法:3d
moveAnimate(el){code
let startX = -this.currentIndex * el.offsetWidth;orm
let endX = startX - el.offsetWidth;cdn
el.style.transform = translate3d(${endX}px, 0px, 0px)
;blog
el.style.transition = ${this.wSwiperOptions.speed}s
;ip
},
須要注意一下,爲了無縫滾動,在無感知恢復原來位置的時候,須要設置transition的時間爲0:
judgeCurrent(el){
if(this.currentIndex == el.children.length - 2){
this.currentIndex = 0;
el.style.transform = translate3d(-${el.offsetWidth}px, 0px, 0px)
;
el.style.transition = '0s';
}else if(this.currentIndex == -1){
this.currentIndex = el.children.length - 3;
el.style.transform = translate3d(-${el.offsetWidth * (this.currentIndex + 1)}px, 0px, 0px)
;
el.style.transition = '0s';
};
}
若是是元素最後一個(已經複製了節點),就初始化到總體向左移動一格的位置,無感知無動畫。若是是第一個,初始化到倒數第二個,這邊會有-1的場景是左右點擊按鈕,右邊按鈕點一下index是減1的。
自動輪播方法:
autoPlay(el){
if(!this.wSwiperOptions.autoPlay){
return
}
this.intervalId = setInterval(() => {
this.judgeCurrent(el);
this.currentIndex++;
this.moveAnimate(el);
this.pagingParallelism(el);
}, this.wSwiperOptions.time);
}
預留一個參數是否要自動輪播,每次輪播後index須要加1,而後執行動畫,而且分頁圓點要跟隨。
不少方法操做會先清除定時器,而後再從新輪播,不然會有衝突,由於定時器還未執行的時候清除就不會執行。
分頁圓點也須要一些判斷:
pagingParallelism(el){
let len = el.children.length;
if(this.currentIndex == -1 || this.currentIndex == len - 3){
this.pageIndex = len - 3;
}else if(this.currentIndex == len - 2){
this.pageIndex = 0;
}else{
this.pageIndex = this.currentIndex;
}
}
pageIndex 是控制選中狀態用的。
必須得說一下左右按鈕,沒有默認箭頭,爲了可讓別人本身定義(實際上是懶得弄一套icon到項目裏)。而後採用的是監聽綁定的方法。
最簡單的左右箭頭,分頁圓點和輪播有了,最後加上了幾個移動端touch的幾個小點,和鼠標hover的功能。比較遺憾的是還沒寫移動端touch過程輪播隨着移動距離移動。代碼很簡單,能夠自行擴展。
其實說再多仍是不如本身下載下來看一下代碼,仍是但願能夠下載下來看看代碼,使用一下,之後簡單的輪播組件就用本身的,固然,兼容性是比不上那些第三方組件庫的,可是本身的爲所欲爲的可擴展。
已經發布npm,不得不說一下,一開始發佈版本號沒改,發不上去,改了以後不知道是否是由於以前沒改報錯的緣由,一直報錯400,花了不少時間查找爲何,後來改了版本號再發布就行了,地址:
或者直接下載:npm install wade-ui
最後祝你們國慶嗨皮!!!