(function($) { var timers = []; function nextMove(obj, step) { obj.find("ul").animate({ marginLeft: -step }, 300, 'swing', function() { $(this).find("li").slice(0, 1).appendTo($(this)); $(this).css("margin-left", 0); }); } function preMove(obj, step) { var ul = obj.find("ul"); ul.css('margin-left', -step); ul.find("li").last().prependTo(ul); ul.animate({ marginLeft: 0 }, 300, 'swing', function() { ul.css("margin-left", 0); }); } function downMove(obj, step) { obj.find("ul").animate({ marginTop: -step }, 300, 'swing', function() { $(this).find("li").slice(0, 1).appendTo($(this)); $(this).css("margin-top", 0); }); } function upMove(obj, step) { var ul = obj.find("ul"); ul.find("li").last().prependTo(ul); ul.css('margin-top', -step); ul.animate({ marginTop: 0 }, 300, 'swing', function() { ul.css("margin-top", 0); }); } var methods = { init: function(options) { var defaults = { speed: 3000, direction: 'horizantal' }; var opts = $.extend({}, defaults, options); return this.each(function(i) { var speed = opts["speed"] < 1000 ? 3000 : opts["speed"]; var direction = opts["direction"] == 'vertical' || opts["direction"] == 'horizantal' ? opts["direction"] : 'vertical'; var _this = $(this); var ul = _this.find("ul"), pre = _this.find(".pre"), next = _this.find(".next"); var sh, isMove, ishori, move, lmove, rmove; if (direction == 'horizantal') { isMove = _this.width() < ul.width(); ishori = true; move = nextMove; lmove = preMove; rmove = nextMove; sh = ul.find("li:first").outerWidth(true); } else { isMove = _this.height() < ul.height(); ishori = false; move = downMove; lmove = upMove; rmove = downMove; sh = ul.find("li:first").outerHeight(true); } if (isMove) { timers[i] = setInterval(function() { move(_this, sh); }, speed); _this.hover(function() { clearInterval(timers[i]); }, function() { timers[i] = setInterval(function() { move(_this, sh); }, speed); }); pre.click(function() { lmove(_this, sh); }); next.click(function() { rmove(_this, sh); }); } }); }, destroy: function() { return this.each(function(i) { _this = $(this); clearInterval(timers[i]); _this.find('ul').css({ 'margin-top': 0 }); _this.find('ul').css({ 'margin-left': 0 }); _this.unbind("mouseenter").unbind("mouseleave"); _this.find('.pre').unbind('click'); _this.find('.next').unbind('click'); }); } } $.fn.mySingleScroll = function(options) { var method = arguments[0]; if (methods[method]) { method = methods[method]; } else if (typeof method == 'object' || !method) { method = methods.init; } else { $.error('error'); return this; } return method.apply(this, arguments); } })(jQuery)