carousel.js 6.82 KB
Newer Older
1
/* ========================================================================
Mark Otto's avatar
Mark Otto committed
2
 * Bootstrap: carousel.js v3.1.1
3
 * http://getbootstrap.com/javascript/#carousel
4
 * ========================================================================
5
 * Copyright 2011-2014 Twitter, Inc.
6
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
7
 * ======================================================================== */
fat's avatar
fat committed
8
9


10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
+function () { 'use strict';

  (function (o_o) {
    typeof define  == 'function' && define.amd ? define(['jquery'], o_o) :
    typeof exports == 'object' ? o_o(require('jquery')) : o_o(jQuery)
  })(function ($) {

    // CAROUSEL CLASS DEFINITION
    // =========================

    var Carousel = function (element, options) {
      this.$element    = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this))
      this.$indicators = this.$element.find('.carousel-indicators')
      this.options     = options
      this.paused      =
      this.sliding     =
      this.interval    =
      this.$active     =
      this.$items      = null

      this.options.pause == 'hover' && this.$element
        .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
        .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
33
34
    }

35
    Carousel.VERSION  = '3.1.1'
36

37
38
39
40
41
    Carousel.DEFAULTS = {
      interval: 5000,
      pause: 'hover',
      wrap: true
    }
fat's avatar
fat committed
42

43
44
45
46
47
48
    Carousel.prototype.keydown = function (e) {
      switch (e.which) {
        case 37: this.prev(); break
        case 39: this.next(); break
        default: return
      }
fat's avatar
fat committed
49

50
51
      e.preventDefault()
    }
fat's avatar
fat committed
52

53
54
    Carousel.prototype.cycle = function (e) {
      e || (this.paused = false)
fat's avatar
fat committed
55

56
      this.interval && clearInterval(this.interval)
fat's avatar
fat committed
57

58
59
60
      this.options.interval
        && !this.paused
        && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
fat's avatar
fat committed
61

62
      return this
fat's avatar
fat committed
63
64
    }

65
66
67
68
    Carousel.prototype.getItemIndex = function (item) {
      this.$items = item.parent().children('.item')
      return this.$items.index(item || this.$active)
    }
fat's avatar
fat committed
69

70
71
72
    Carousel.prototype.to = function (pos) {
      var that        = this
      var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
fat's avatar
fat committed
73

74
      if (pos > (this.$items.length - 1) || pos < 0) return
fat's avatar
fat committed
75

76
77
      if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
      if (activeIndex == pos) return this.pause().cycle()
fat's avatar
fat committed
78

79
      return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
Jacob Thornton's avatar
Jacob Thornton committed
80
81
    }

82
83
    Carousel.prototype.pause = function (e) {
      e || (this.paused = true)
fat's avatar
fat committed
84

85
86
87
88
      if (this.$element.find('.next, .prev').length && $.support.transition) {
        this.$element.trigger($.support.transition.end)
        this.cycle(true)
      }
fat's avatar
fat committed
89

90
      this.interval = clearInterval(this.interval)
91

92
93
      return this
    }
fat's avatar
fat committed
94

95
96
97
    Carousel.prototype.next = function () {
      if (this.sliding) return
      return this.slide('next')
fat's avatar
fat committed
98
99
    }

100
101
102
    Carousel.prototype.prev = function () {
      if (this.sliding) return
      return this.slide('prev')
fat's avatar
fat committed
103
104
    }

105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
    Carousel.prototype.slide = function (type, next) {
      var $active   = this.$element.find('.item.active')
      var $next     = next || $active[type]()
      var isCycling = this.interval
      var direction = type == 'next' ? 'left' : 'right'
      var fallback  = type == 'next' ? 'first' : 'last'
      var that      = this

      if (!$next.length) {
        if (!this.options.wrap) return
        $next = this.$element.find('.item')[fallback]()
      }

      if ($next.hasClass('active')) return (this.sliding = false)

      var relatedTarget = $next[0]
      var slideEvent = $.Event('slide.bs.carousel', {
        relatedTarget: relatedTarget,
        direction: direction
      })
      this.$element.trigger(slideEvent)
      if (slideEvent.isDefaultPrevented()) return

      this.sliding = true

      isCycling && this.pause()

      if (this.$indicators.length) {
        this.$indicators.find('.active').removeClass('active')
        var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
        $nextIndicator && $nextIndicator.addClass('active')
      }

      var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
      if ($.support.transition && this.$element.hasClass('slide')) {
        $next.addClass(type)
        $next[0].offsetWidth // force reflow
        $active.addClass(direction)
        $next.addClass(direction)
        $active
          .one('bsTransitionEnd', function () {
            $next.removeClass([type, direction].join(' ')).addClass('active')
            $active.removeClass(['active', direction].join(' '))
            that.sliding = false
            setTimeout(function () {
              that.$element.trigger(slidEvent)
            }, 0)
          })
          .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)
      } else {
        $active.removeClass('active')
        $next.addClass('active')
        this.sliding = false
        this.$element.trigger(slidEvent)
      }

      isCycling && this.cycle()

      return this
    }
fat's avatar
fat committed
165
166


167
168
    // CAROUSEL PLUGIN DEFINITION
    // ==========================
fat's avatar
fat committed
169

170
171
172
173
174
175
    function Plugin(option) {
      return this.each(function () {
        var $this   = $(this)
        var data    = $this.data('bs.carousel')
        var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
        var action  = typeof option == 'string' ? option : options.slide
fat's avatar
fat committed
176

177
178
179
180
181
182
        if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
        if (typeof option == 'number') data.to(option)
        else if (action) data[action]()
        else if (options.interval) data.pause().cycle()
      })
    }
fat's avatar
fat committed
183

184
    var old = $.fn.carousel
185

186
187
    $.fn.carousel             = Plugin
    $.fn.carousel.Constructor = Carousel
fat's avatar
fat committed
188
189


190
191
    // CAROUSEL NO CONFLICT
    // ====================
fat's avatar
fat committed
192

193
194
195
196
    $.fn.carousel.noConflict = function () {
      $.fn.carousel = old
      return this
    }
fat's avatar
fat committed
197

fat's avatar
fat committed
198

199
200
    // CAROUSEL DATA-API
    // =================
fat's avatar
fat committed
201

202
203
204
205
206
207
208
    $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
      var href
      var $this   = $(this)
      var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
      var options = $.extend({}, $target.data(), $this.data())
      var slideIndex = $this.attr('data-slide-to')
      if (slideIndex) options.interval = false
fat's avatar
fat committed
209

210
      Plugin.call($target, options)
fat's avatar
fat committed
211

212
213
214
      if (slideIndex) {
        $target.data('bs.carousel').to(slideIndex)
      }
fat's avatar
fat committed
215

216
217
      e.preventDefault()
    })
fat's avatar
fat committed
218

219
220
221
222
223
    $(window).on('load', function () {
      $('[data-ride="carousel"]').each(function () {
        var $carousel = $(this)
        Plugin.call($carousel, $carousel.data())
      })
224
    })
225

226
227
  })

228
}();