輪播實現

一、輪播的實現原理是怎樣的?如果讓你來實現,你會抽象出哪些函數(or接口)供使用?(比如 play())

輪播的常見實現有兩種:

  1. 橫向排列所有圖片,父元素設置為絕對定位,通過設置left或者right來位移父元素達到圖片切換效果(需要注意,該父元素的父元素寬度應為一張圖片大小,并overflow: hidden)。
  2. 所有圖片絕對定位,這樣實際上所有圖片都重合在一個位置,然后控制對應圖片顯示,其他圖片隱藏。

一般輪播的功能有:

  1. 左右位移按鈕
  2. 中間的指定下標移動按鈕
  3. 自動輪播

因此我會未以上三個功能抽出來做邏輯運算,然后再加個move()函數,在每個功能里邊調用。另外還有一些動畫回調或其他小功能抽出做單獨函數。如:


    /**
     * 新建一個輪播對象,所有方法基于 jQuery
     * @param {Object} options 
     *    {
     *      swiperNode: 輪播的父節點 jQ 對象(即將位移的對象)  ( 必填 )
     *      btnsNode: 輪播的按鈕對象數組 jQ 對象   ( 必填 )
     *      speed: 輪播速度,單位 ms 。默認 500
     *      distance: 每張圖片的寬度,也就是每次位移的最小距離,單位 px 。默認 960 px
     *      currentIndex: 當前輪播圖位置
     *      activeClass: 激活的樣式,默認 active
     *      auto: 是否開啟自動輪播, Boolean 類型, 默認 false
     *      interval: 自動輪播間隔,單位 ms ,默認 2000 。
     *    }
     */
    function _swiper(options) {
      this.swiperNode = options.swiperNode
      this.btnsNode = options.btnsNode
      this.speed = options.speed || 500
      this.distance = options.distance || 960
      this.currentIndex = options.currentIndex || 0
      this.activeClass = options.activeClass || 'active'
      this.auto = options.auto || false
      this.interval = options.interval || 2000
      this.start = 0
      this.end = Math.floor((this.swiperNode).innerWidth() / this.distance) - 1
    }

    /**
     * 初始化,激活輪播
     */
    _swiper.prototype.init = function () {
      this.currentMode(this.currentIndex)
      this._judgeAuto()
    }

    /**
     * 計算模式,用于左右位移
     * @param {Number} offset { -1 / 1  => 控制輪播位移方向}
     */
    _swiper.prototype.calculateMode = function (offset) {
      this._optimizedAutoMode()
      this.currentIndex += offset
      if (this.currentIndex < 0) {
        this.swiperNode.css('left', -this.distance * this.end + 'px')
        this.currentIndex = this.end - 1
      } else if (this.currentIndex > this.end) {
        this.swiperNode.css('left', this.start + 'px')
        this.currentIndex = this.start + 1
      }
      this._move()
      this._judgeAuto()
    }

    /**
     * 按鈕模式,根據按鈕的索引位移圖片
     * @param {Number} index {按鈕的索引}
     */
    _swiper.prototype.currentMode = function (index) {
      this._optimizedAutoMode()
      this.currentIndex = index
      this._move()
      this._judgeAuto()
    }

    /**
     * 判斷自動模式是否開啟
     */
    _swiper.prototype._judgeAuto = function () {
      if (this.auto) {
        this._autoMode()
      }
    }

    /**
     * 自動模式函數,定時器模擬點擊
     */
    _swiper.prototype._autoMode = function () {
      var self = this
      clearInterval(self.timer)
      self.timer = setInterval(function () {
        self.calculateMode(1)
      }, self.interval)
    }

    /**
     * 優化自動模式體驗,手動時先清除自動模式
     */
    _swiper.prototype._optimizedAutoMode = function () {
      clearInterval(this.timer)
    }

    /**
     * 輪播對象的移動函數
     */
    _swiper.prototype._move = function () {
      this.swiperNode.stop().animate({
        left: -this.distance * this.currentIndex + 'px'
      }, this.speed, this._animateCallBack.call(this))
    }

    /**
     * 輪播動畫的回調函數,用于同步按鈕顯示
     */
    _swiper.prototype._animateCallBack = function () {
      var fakeIndex = this.currentIndex
      var len = this.btnsNode.length
      if (fakeIndex >= len) {
        fakeIndex = 0
      }
      this.btnsNode.removeClass(this.activeClass)
      $(this.btnsNode[fakeIndex]).addClass(this.activeClass)
    }

二、實現左右滾動無限循環輪播效果

三、實現一個漸變輪播效果

在線預覽 | GitHub

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,115評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,577評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,514評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,234評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,621評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,822評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,380評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,128評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,319評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,548評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,970評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,229評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,048評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,285評論 2 376

推薦閱讀更多精彩內容