*应用场景:*一般用于信息展示窗口 向上无缝滚动 > 演示地址

*大致实现思路:*用animate往上滚(marginTop) 1px,需要注意的是动画回调里写的玩意,这是实现无缝的精华,然后就是跑定时器,为啥要用遍历去包裹定时器我还没弄懂,我去掉遍历demo跑起来也没问题,然后看遍历影响的是intId这个定时器对象数组,估计是出于性能方面的考究,清除定时器只清除对应的?还不是特别懂,希望有懂的朋友告知,然后继续学习吧~

*感悟:*之前在公司也有写过这种业务需求的小插件,思路大体类似,用的scrollTop这个属性,这玩意不好的地方就是会产生滚动条,无缝实现起来没那么容易,而且animate动画不支持,然后就不流畅~,滚一行是一行,滚到底了又重新回到顶上继续滚,然后突然觉得对于一个问题,想出解决办法可能不是难事,想出最佳的解决办法才是比较难的~,所以关于思想,算法的考虑就尤为重要了吧~算法=。=~~


JavaScript:

// JavaScript Document
	(function($){
		$.fn.myScroll = function(options){
		//默认配置
		var defaults = {
			speed:40,  //滚动速度,值越大速度越慢
			rowHeight:24 //每行的高度
		};
		
		var opts = $.extend({}, defaults, options),intId = [];
		
		function marquee(obj, step){
		
			obj.find("ul").animate({
				marginTop: '-=1'
			},0,function(){
					var s = Math.abs(parseInt($(this).css("margin-top")));
					if(s >= step){
						$(this).find("li").slice(0, 1).appendTo($(this));
						$(this).css("margin-top", 0);
					}
				});
			}
			
			this.each(function(i){
				var sh = opts["rowHeight"],speed = opts["speed"],_this = $(this);
				intId[i] = setInterval(function(){
					if(_this.find("ul").height()<=_this.height()){
						clearInterval(intId[i]);
					}else{
						marquee(_this, sh);
					}
				}, speed);
	
				_this.hover(function(){
					clearInterval(intId[i]);
				},function(){
					intId[i] = setInterval(function(){
						if(_this.find("ul").height()<=_this.height()){
							clearInterval(intId[i]);
						}else{
							marquee(_this, sh);
						}
					}, speed);
				});
			
			});
	
		}
	
	})(jQuery);