2014-10-28 3 views
-1

이 회전식 고리를 반복 할 수 있습니까? jquery와 속성에 대해 많이 알지 못합니다. 내가 모르는 사이에 내가 혼란스러워 진다면, 모든 것이 엉망이 될 것입니다. 내가 구입 한 템플릿에서 이걸 얻었습니다.Jquery Carousel Looping

/*! 
* jCarousel - Riding carousels with jQuery 
* http://sorgalla.com/jcarousel/ 
* 
* Copyright (c) 2006 Jan Sorgalla (http://sorgalla.com) 
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. 
* 
* Built on top of the jQuery library 
* http://jquery.com 
* 
* Inspired by the "Carousel Component" by Bill Scott 
* http://billwscott.com/carousel/ 
*/ 

/*global window, jQuery */ 
(function($) { 
    // Default configuration properties. 
    var defaults = { 
     vertical: false, 
     rtl: false, 
     start: 1, 
     offset: 1, 
     size: null, 
     scroll: 1, 
     visible: null, 
     animation: 'normal', 
     easing: 'swing', 
     auto: 5, 
     wrap: null, 
     initCallback: null, 
     setupCallback: null, 
     reloadCallback: null, 
     itemLoadCallback: null, 
     itemFirstInCallback: null, 
     itemFirstOutCallback: null, 
     itemLastInCallback: null, 
     itemLastOutCallback: null, 
     itemVisibleInCallback: null, 
     itemVisibleOutCallback: null, 
     animationStepCallback: null, 
     buttonNextHTML: '<div></div>', 
     buttonPrevHTML: '<div></div>', 
     buttonNextEvent: 'click', 
     buttonPrevEvent: 'click', 
     buttonNextCallback: null, 
     buttonPrevCallback: null, 
     itemFallbackDimension: null 
    }, windowLoaded = false; 

    $(window).bind('load.jcarousel', function() { windowLoaded = true; }); 

    /** 
    * The jCarousel object. 
    * 
    * @constructor 
    * @class jcarousel 
    * @param e {HTMLElement} The element to create the carousel for. 
    * @param o {Object} A set of key/value pairs to set as configuration properties. 
    * @cat Plugins/jCarousel 
    */ 
    $.jcarousel = function(e, o) { 
     this.options = $.extend({}, defaults, o || {}); 

     this.locked   = false; 
     this.autoStopped  = false; 

     this.container  = null; 
     this.clip   = null; 
     this.list   = null; 
     this.buttonNext  = null; 
     this.buttonPrev  = null; 
     this.buttonNextState = null; 
     this.buttonPrevState = null; 

     // Only set if not explicitly passed as option 
     if (!o || o.rtl === undefined) { 
      this.options.rtl = ($(e).attr('dir') || $('html').attr('dir') || '').toLowerCase() == 'rtl'; 
     } 

     this.wh = !this.options.vertical ? 'width' : 'height'; 
     this.lt = !this.options.vertical ? (this.options.rtl ? 'right' : 'left') : 'top'; 

     // Extract skin class 
     var skin = '', split = e.className.split(' '); 

     for (var i = 0; i < split.length; i++) { 
      if (split[i].indexOf('jcarousel-skin') != -1) { 
       $(e).removeClass(split[i]); 
       skin = split[i]; 
       break; 
      } 
     } 

     if (e.nodeName.toUpperCase() == 'UL' || e.nodeName.toUpperCase() == 'OL') { 
      this.list  = $(e); 
      this.clip  = this.list.parents('.jcarousel-clip'); 
      this.container = this.list.parents('.jcarousel-container'); 
     } else { 
      this.container = $(e); 
      this.list  = this.container.find('ul,ol').eq(0); 
      this.clip  = this.container.find('.jcarousel-clip'); 
     } 

     if (this.clip.size() === 0) { 
      this.clip = this.list.wrap('<div></div>').parent(); 
     } 

     if (this.container.size() === 0) { 
      this.container = this.clip.wrap('<div></div>').parent(); 
     } 

     if (skin !== '' && this.container.parent()[0].className.indexOf('jcarousel-skin') == -1) { 
      this.container.wrap('<div class=" '+ skin + '"></div>'); 
     } 

     this.buttonPrev = $('.jcarousel-prev', this.container); 

     if (this.buttonPrev.size() === 0 && this.options.buttonPrevHTML !== null) { 
      this.buttonPrev = $(this.options.buttonPrevHTML).appendTo(this.container); 
     } 

     this.buttonPrev.addClass(this.className('jcarousel-prev')); 

     this.buttonNext = $('.jcarousel-next', this.container); 

     if (this.buttonNext.size() === 0 && this.options.buttonNextHTML !== null) { 
      this.buttonNext = $(this.options.buttonNextHTML).appendTo(this.container); 
     } 

     this.buttonNext.addClass(this.className('jcarousel-next')); 

     this.clip.addClass(this.className('jcarousel-clip')).css({ 
      position: 'relative' 
     }); 

     this.list.addClass(this.className('jcarousel-list')).css({ 
      overflow: 'hidden', 
      position: 'relative', 
      top: 0, 
      margin: 0, 
      padding: 0 
     }).css((this.options.rtl ? 'right' : 'left'), 0); 

     this.container.addClass(this.className('jcarousel-container')).css({ 
      position: 'relative' 
     }); 

     if (!this.options.vertical && this.options.rtl) { 
      this.container.addClass('jcarousel-direction-rtl').attr('dir', 'rtl'); 
     } 

     var di = this.options.visible !== null ? Math.ceil(this.clipping()/this.options.visible) : null; 
     var li = this.list.children('li'); 

     var self = this; 

     if (li.size() > 0) { 
      var wh = 0, j = this.options.offset; 
      li.each(function() { 
       self.format(this, j++); 
       wh += self.dimension(this, di); 
      }); 

      this.list.css(this.wh, (wh + 100) + 'px'); 

      // Only set if not explicitly passed as option 
      if (!o || o.size === undefined) { 
       this.options.size = li.size(); 
      } 
     } 

     // For whatever reason, .show() does not work in Safari... 
     this.container.css('display', 'block'); 
     this.buttonNext.css('display', 'block'); 
     this.buttonPrev.css('display', 'block'); 

     this.funcNext = function() { self.next(); }; 
     this.funcPrev = function() { self.prev(); }; 
     this.funcResize = function() { 
      if (self.resizeTimer) { 
       clearTimeout(self.resizeTimer); 
      } 

      self.resizeTimer = setTimeout(function() { 
       self.reload(); 
      }, 100); 
     }; 

     if (this.options.initCallback !== null) { 
      this.options.initCallback(this, 'init'); 
     } 

     if (!windowLoaded && $.browser.safari) { 
      this.buttons(false, false); 
      $(window).bind('load.jcarousel', function() { self.setup(); }); 
     } else { 
      this.setup(); 
     } 
    }; 

    // Create shortcut for internal use 
    var $jc = $.jcarousel; 

    $jc.fn = $jc.prototype = { 
     jcarousel: '0.2.8' 
    }; 

    $jc.fn.extend = $jc.extend = $.extend; 

    $jc.fn.extend({ 
     /** 
     * Setups the carousel. 
     * 
     * @method setup 
     * @return undefined 
     */ 
     setup: function() { 
      this.first  = null; 
      this.last  = null; 
      this.prevFirst = null; 
      this.prevLast = null; 
      this.animating = false; 
      this.timer  = null; 
      this.resizeTimer = null; 
      this.tail  = null; 
      this.inTail  = false; 

      if (this.locked) { 
       return; 
      } 

      this.list.css(this.lt, this.pos(this.options.offset) + 'px'); 
      var p = this.pos(this.options.start, true); 
      this.prevFirst = this.prevLast = null; 
      this.animate(p, false); 

      $(window).unbind('resize.jcarousel', this.funcResize).bind('resize.jcarousel', this.funcResize); 

      if (this.options.setupCallback !== null) { 
       this.options.setupCallback(this); 
      } 
     }, 

     /** 
     * Clears the list and resets the carousel. 
     * 
     * @method reset 
     * @return undefined 
     */ 
     reset: function() { 
      this.list.empty(); 

      this.list.css(this.lt, '0px'); 
      this.list.css(this.wh, '10px'); 

      if (this.options.initCallback !== null) { 
       this.options.initCallback(this, 'reset'); 
      } 

      this.setup(); 
     }, 

     /** 
     * Reloads the carousel and adjusts positions. 
     * 
     * @method reload 
     * @return undefined 
     */ 
     reload: function() { 
      if (this.tail !== null && this.inTail) { 
       this.list.css(this.lt, $jc.intval(this.list.css(this.lt)) + this.tail); 
      } 

      this.tail = null; 
      this.inTail = false; 

      if (this.options.reloadCallback !== null) { 
       this.options.reloadCallback(this); 
      } 

      if (this.options.visible !== null) { 
       var self = this; 
       var di = Math.ceil(this.clipping()/this.options.visible), wh = 0, lt = 0; 
       this.list.children('li').each(function(i) { 
        wh += self.dimension(this, di); 
        if (i + 1 < self.first) { 
         lt = wh; 
        } 
       }); 

       this.list.css(this.wh, wh + 'px'); 
       this.list.css(this.lt, -lt + 'px'); 
      } 

      this.scroll(this.first, false); 
     }, 

     /** 
     * Locks the carousel. 
     * 
     * @method lock 
     * @return undefined 
     */ 
     lock: function() { 
      this.locked = true; 
      this.buttons(); 
     }, 

     /** 
     * Unlocks the carousel. 
     * 
     * @method unlock 
     * @return undefined 
     */ 
     unlock: function() { 
      this.locked = false; 
      this.buttons(); 
     }, 

     /** 
     * Sets the size of the carousel. 
     * 
     * @method size 
     * @return undefined 
     * @param s {Number} The size of the carousel. 
     */ 
     size: function(s) { 
      if (s !== undefined) { 
       this.options.size = s; 
       if (!this.locked) { 
        this.buttons(); 
       } 
      } 

      return this.options.size; 
     }, 

     /** 
     * Checks whether a list element exists for the given index (or index range). 
     * 
     * @method get 
     * @return bool 
     * @param i {Number} The index of the (first) element. 
     * @param i2 {Number} The index of the last element. 
     */ 
     has: function(i, i2) { 
      if (i2 === undefined || !i2) { 
       i2 = i; 
      } 

      if (this.options.size !== null && i2 > this.options.size) { 
       i2 = this.options.size; 
      } 

      for (var j = i; j <= i2; j++) { 
       var e = this.get(j); 
       if (!e.length || e.hasClass('jcarousel-item-placeholder')) { 
        return false; 
       } 
      } 

      return true; 
     }, 

     /** 
     * Returns a jQuery object with list element for the given index. 
     * 
     * @method get 
     * @return jQuery 
     * @param i {Number} The index of the element. 
     */ 
     get: function(i) { 
      return $('>.jcarousel-item-' + i, this.list); 
     }, 

     /** 
     * Adds an element for the given index to the list. 
     * If the element already exists, it updates the inner html. 
     * Returns the created element as jQuery object. 
     * 
     * @method add 
     * @return jQuery 
     * @param i {Number} The index of the element. 
     * @param s {String} The innerHTML of the element. 
     */ 
     add: function(i, s) { 
      var e = this.get(i), old = 0, n = $(s); 

      if (e.length === 0) { 
       var c, j = $jc.intval(i); 
       e = this.create(i); 
       while (true) { 
        c = this.get(--j); 
        if (j <= 0 || c.length) { 
         if (j <= 0) { 
          this.list.prepend(e); 
         } else { 
          c.after(e); 
         } 
         break; 
        } 
       } 
      } else { 
       old = this.dimension(e); 
      } 

      if (n.get(0).nodeName.toUpperCase() == 'LI') { 
       e.replaceWith(n); 
       e = n; 
      } else { 
       e.empty().append(s); 
      } 

      this.format(e.removeClass(this.className('jcarousel-item-placeholder')), i); 

      var di = this.options.visible !== null ? Math.ceil(this.clipping()/this.options.visible) : null; 
      var wh = this.dimension(e, di) - old; 

      if (i > 0 && i < this.first) { 
       this.list.css(this.lt, $jc.intval(this.list.css(this.lt)) - wh + 'px'); 
      } 

      this.list.css(this.wh, $jc.intval(this.list.css(this.wh)) + wh + 'px'); 

      return e; 
     }, 

     /** 
     * Removes an element for the given index from the list. 
     * 
     * @method remove 
     * @return undefined 
     * @param i {Number} The index of the element. 
     */ 
     remove: function(i) { 
      var e = this.get(i); 

      // Check if item exists and is not currently visible 
      if (!e.length || (i >= this.first && i <= this.last)) { 
       return; 
      } 

      var d = this.dimension(e); 

      if (i < this.first) { 
       this.list.css(this.lt, $jc.intval(this.list.css(this.lt)) + d + 'px'); 
      } 

      e.remove(); 

      this.list.css(this.wh, $jc.intval(this.list.css(this.wh)) - d + 'px'); 
     }, 

     /** 
     * Moves the carousel forwards. 
     * 
     * @method next 
     * @return undefined 
     */ 
     next: function() { 
      if (this.tail !== null && !this.inTail) { 
       this.scrollTail(false); 
      } else { 
       this.scroll(((this.options.wrap == 'both' || this.options.wrap == 'last') && this.options.size !== null && this.last == this.options.size) ? 1 : this.first + this.options.scroll); 
      } 
     }, 

     /** 
     * Moves the carousel backwards. 
     * 
     * @method prev 
     * @return undefined 
     */ 
     prev: function() { 
      if (this.tail !== null && this.inTail) { 
       this.scrollTail(true); 
      } else { 
       this.scroll(((this.options.wrap == 'both' || this.options.wrap == 'first') && this.options.size !== null && this.first == 1) ? this.options.size : this.first - this.options.scroll); 
      } 
     }, 

     /** 
     * Scrolls the tail of the carousel. 
     * 
     * @method scrollTail 
     * @return undefined 
     * @param b {Boolean} Whether scroll the tail back or forward. 
     */ 
     scrollTail: function(b) { 
      if (this.locked || this.animating || !this.tail) { 
       return; 
      } 

      this.pauseAuto(); 

      var pos = $jc.intval(this.list.css(this.lt)); 

      pos = !b ? pos - this.tail : pos + this.tail; 
      this.inTail = !b; 

      // Save for callbacks 
      this.prevFirst = this.first; 
      this.prevLast = this.last; 

      this.animate(pos); 
     }, 

     /** 
     * Scrolls the carousel to a certain position. 
     * 
     * @method scroll 
     * @return undefined 
     * @param i {Number} The index of the element to scoll to. 
     * @param a {Boolean} Flag indicating whether to perform animation. 
     */ 
     scroll: function(i, a) { 
      if (this.locked || this.animating) { 
       return; 
      } 

      this.pauseAuto(); 
      this.animate(this.pos(i), a); 
     }, 

     /** 
     * Prepares the carousel and return the position for a certian index. 
     * 
     * @method pos 
     * @return {Number} 
     * @param i {Number} The index of the element to scoll to. 
     * @param fv {Boolean} Whether to force last item to be visible. 
     */ 
     pos: function(i, fv) { 
      var pos = $jc.intval(this.list.css(this.lt)); 

      if (this.locked || this.animating) { 
       return pos; 
      } 

      if (this.options.wrap != 'circular') { 
       i = i < 1 ? 1 : (this.options.size && i > this.options.size ? this.options.size : i); 
      } 

      var back = this.first > i; 

      // Create placeholders, new list width/height 
      // and new list position 
      var f = this.options.wrap != 'circular' && this.first <= 1 ? 1 : this.first; 
      var c = back ? this.get(f) : this.get(this.last); 
      var j = back ? f : f - 1; 
      var e = null, l = 0, p = false, d = 0, g; 

      while (back ? --j >= i : ++j < i) { 
       e = this.get(j); 
       p = !e.length; 
       if (e.length === 0) { 
        e = this.create(j).addClass(this.className('jcarousel-item-placeholder')); 
        c[back ? 'before' : 'after' ](e); 

        if (this.first !== null && this.options.wrap == 'circular' && this.options.size !== null && (j <= 0 || j > this.options.size)) { 
         g = this.get(this.index(j)); 
         if (g.length) { 
          e = this.add(j, g.clone(true)); 
         } 
        } 
       } 

       c = e; 
       d = this.dimension(e); 

       if (p) { 
        l += d; 
       } 

       if (this.first !== null && (this.options.wrap == 'circular' || (j >= 1 && (this.options.size === null || j <= this.options.size)))) { 
        pos = back ? pos + d : pos - d; 
       } 
      } 

      // Calculate visible items 
      var clipping = this.clipping(), cache = [], visible = 0, v = 0; 
      c = this.get(i - 1); 
      j = i; 

      while (++visible) { 
       e = this.get(j); 
       p = !e.length; 
       if (e.length === 0) { 
        e = this.create(j).addClass(this.className('jcarousel-item-placeholder')); 
        // This should only happen on a next scroll 
        if (c.length === 0) { 
         this.list.prepend(e); 
        } else { 
         c[back ? 'before' : 'after' ](e); 
        } 

        if (this.first !== null && this.options.wrap == 'circular' && this.options.size !== null && (j <= 0 || j > this.options.size)) { 
         g = this.get(this.index(j)); 
         if (g.length) { 
          e = this.add(j, g.clone(true)); 
         } 
        } 
       } 

       c = e; 
       d = this.dimension(e); 
       if (d === 0) { 
        throw new Error('jCarousel: No width/height set for items. This will cause an infinite loop. Aborting...'); 
       } 

       if (this.options.wrap != 'circular' && this.options.size !== null && j > this.options.size) { 
        cache.push(e); 
       } else if (p) { 
        l += d; 
       } 

       v += d; 

       if (v >= clipping) { 
        break; 
       } 

       j++; 
      } 
+0

에 대한 문서를 찾을 수 있습니다

$('#jcarousel').jcarousel({ wrap: 'circular' }); 

Here처럼 보일 것입니다, 그들에게 읽어 보시기 바랍니다이 HTTP에 유용한 정보가 많이있다 : //sorgalla.com/jcarousel/docs/reference/configuration.html –

답변

0

당신이 제공 한 것은 플러그인 소스 코드입니다. 캐 러셀을 초기화하는 코드를 찾으십시오.

$('#jcarousel').jcarousel({ 
    list: '.jcarousel-list' 
}); 

wrap이라는 개체 속성을 전달할 수 있습니다. 그래서 최종 코드는 당신이 의견에 문서로도 링크가이