/*** @name Marquee-Slide @description 基于 jQuery 的多功能无缝滚动插件 @url https://github.com/wange1228/marquee-slide @version 0.4.3 @author 万戈 @blog http://wange.im ***/ !function (a) { var b; b = function () { function b(b, c) { this.elements = { wrap: b, ul: b.children(), li: b.children().children() }, this.settings = a.extend({}, a.fn.marquee.defaults, c), this.cache = { allowMarquee: !0} } return b.prototype.init = function () { this.setStyle(), this.move(), this.bind() }, b.prototype.setStyle = function () { var a, b, c, d, e, f, g, h; switch (d = this.elements.li.outerWidth(!0), c = this.elements.li.outerHeight(!0), b = Math.max(parseInt(this.elements.li.css("margin-top"), 10), parseInt(this.elements.li.css("margin-bottom"), 10)), this.settings.type) { case "horizontal": h = this.settings.showNum * d, g = c, f = 9999, e = "auto", a = "left", this.cache.stepW = this.settings.stepLen * d, this.cache.prevAnimateObj = { left: -this.cache.stepW }, this.cache.nextAnimateObj = { left: 0 }, this.cache.leftOrTop = "left"; break; case "vertical": h = d, g = this.settings.showNum * c - b, f = "auto", e = 9999, a = "none", this.cache.stepW = this.settings.stepLen * c - b, this.cache.prevAnimateObj = { top: -this.cache.stepW }, this.cache.nextAnimateObj = { top: 0 }, this.cache.leftOrTop = "top" } this.elements.wrap.css({ position: "relative", width: h, height: g, overflow: "hidden" }), this.elements.ul.css({ position: "relative", width: f, height: e }), this.elements.li.css({ "float": a }) }, b.prototype.bind = function () { var a, b, c, d, e, f; f = this, null != (a = this.settings.prevElement) && a.click(function (a) { a.preventDefault(), f.prev() }), null != (b = this.settings.nextElement) && b.click(function (a) { a.preventDefault(), f.next() }), null != (c = this.settings.pauseElement) && c.click(function (a) { a.preventDefault(), f.pause() }), null != (d = this.settings.resumeElement) && d.click(function (a) { a.preventDefault(), f.resume() }), null != (e = this.elements.wrap) && e.hover(function () { f.pause() }, function () { f.resume() }) }, b.prototype.move = function () { var a, b, c; if (c = this, this.settings.auto) { switch (this.settings.direction) { case "forward": b = c.prev; break; case "backward": b = c.next } a = c.settings.interval, setTimeout(function () { b.call(c), setTimeout(arguments.callee, a) }, a), this.cache.moveBefore = this.cache.moveAfter = function () { return null } } else this.cache.moveBefore = function () { return c.cache.allowMarquee = !1 }, this.cache.moveAfter = function () { return c.cache.allowMarquee = !0 } }, b.prototype.prev = function () { var a, b, c; c = this, this.cache.allowMarquee && (this.cache.moveBefore.call(this), this.settings.prevBefore.call(this), b = this.elements.ul, a = b.children().slice(0, this.settings.stepLen), a.clone().appendTo(b), b.animate(this.cache.prevAnimateObj, this.settings.speed, function () { b.css(c.cache.leftOrTop, 0), a.remove(), c.cache.moveAfter.call(c), c.settings.prevAfter.call(c) })) }, b.prototype.next = function () { var a, b, c; c = this, this.cache.allowMarquee && (this.cache.moveBefore.call(this), this.settings.nextBefore.call(this), b = this.elements.ul, a = b.children().slice(-this.settings.stepLen), a.clone().prependTo(b), b.css(c.cache.leftOrTop, -this.cache.stepW).animate(this.cache.nextAnimateObj, this.settings.speed, function () { a.remove(), c.cache.moveAfter.call(c), c.settings.nextAfter.call(c) })) }, b.prototype.pause = function () { this.settings.pauseBefore.call(this), this.cache.allowMarquee = !1, this.settings.pauseAfter.call(this) }, b.prototype.resume = function () { this.settings.resumeBefore.call(this), this.cache.allowMarquee = !0, this.settings.resumeAfter.call(this) }, b } (), a.fn.marquee = function (c) { this.each(function () { var d; d = new b(a(this), c), d.init() }) }, a.fn.marquee.defaults = { auto: !0, interval: 3e3, direction: "forward", speed: 500, showNum: 1, stepLen: 1, type: "horizontal", prevElement: null, prevBefore: function () { }, prevAfter: function () { }, nextElement: null, nextBefore: function () { }, nextAfter: function () { }, pauseElement: null, pauseBefore: function () { }, pauseAfter: function () { }, resumeElement: null, resumeBefore: function () { }, resumeAfter: function () { } } } (jQuery);