輪播的實現原理是怎樣的?如果讓你來實現,你會抽象出哪些函數(or接口)供使用?
在實現輪播之前首先要確定要實現什么樣的輪播:
- 對于無限滾動輪播:
將圖片排成一行,并將一個供輪播的窗口固定大小,隱藏超出范圍的圖片,并在第一張圖片前添加復制的最后一張圖片,在最后一張圖片后添加復制的第一張圖片,當觸發點擊下一張圖片的事件時,根據方向移動圖片位置來滾動顯示圖片,滾動到最后一張圖片或第一張圖片時,再次滾動要跳轉到第一張的圖片或最后一張圖片的位置。 - 對于無限漸進漸出的輪播:
所有的圖片都疊放在一起,開始時統一設置display:none,然后通過fadeout當前頁,fadeIn需要展示的圖片。
其次,需要考慮一些細節問題:
- bullets與圖片滾動的同步問題。
- 若需要在快速點擊時,判斷輪播是否處于動畫中,就要利用jQuery中的
is(':animated')
或者引入isAnimated
變量動態判斷。 - 若對于快速點擊,需要輪播同時響應用戶的點擊,并且不讓用戶等的太久,可以利用jQuery中的stop()函數。例如:
$node.stop(true).animate()
這樣可以取消當前的動畫隊列,從而快速到達用戶想要的位置。 - 自動播放問題,是否添加自動播放,當用戶鼠標放在輪播上時,取消自動播放,提高用戶體驗。(注意使用
setTimeout()
來模擬setInterval()
) - 對于輪播圖片比較多,可以考慮通過懶加載的方式來節省流量,提高用戶體驗。
完成一個輪播是,必要的一些函數接口和變量:
- 變量:
- idx(0): 始終跟隨當前顯示圖片的索引。
- imgCount: 圖片的數量。
- isAnimated(false): 當前是否處于動畫中。
- 函數:
- autoPlay() 和 stopAuto()
- play(num) 這是最穩重要的輪播函數,num可以是目標idx與當前所在idx的差值,可正可負,為正時,向前滾動num個,為負時,向后滾動num個。在這其中,要注意idx的變化與計算(特別是當idx處于最大和最小時),可以利用:
idx = (idx + num + imgCount) % imgCount
(視具體情況而定) - setBullet() 函數,在play()中被調用。用來同步bullets(下方小點)的變化。
一些輪播實例
1
1
1
11
1
11
1
11
1