jQuery新闻滚动插件 jquery.roller.js |
本文标签:新闻滚动 我在源码里给出了注释,有什么不足之处后或者可以改进的地方, 希望能够大家留言探讨... 效果图(比较朴素): ![]() 复制代码 代码如下: ;(function($) { $.fn.roller = function(options) { var opts = $.extend({}, $.fn.roller.defaults, options), // 通过循环队列来管理滚动信息 itemQueue = new Array(); return this.each(function(index) { var $div = $(this).addClass(roller-container); // 用给定的数组进行初始化 if(opts.items && Util.isArray(opts.items)) { for(var i = 0, len = opts.items.length; i < len; i++) { itemQueue.push($(<DIV class=roller-item></DIV>).append(buildLink(opts.items[i]))); } } else { //同样可以用页面元素进行初始化 } // 把一开始要显示的条目加入容器中 for(i = 0, len = opts.showNum; i < len; i++) { if(isUp()) { $div.append(itemQueue[i]); } else { $div.prepend(itemQueue[i]); } } // 把已经加入容器的条目副本 放到循环队列的尾部 for(i = 0, len = opts.showNum; i < len; i++) { var temp = itemQueue.shift(); itemQueue.push(temp.clone()); } // 取得一个滚动元素 var _item = $(.roller-item:first, this), // 取得它的外围高度 包括margin _outHeight = _item.outerHeight(true), // 容器的内容总高度 totalHeight = _outHeight * parseInt(opts.showNum, 10); // 保存初始marginTop值 opts.orginal_marginTop = parseInt(_item.css(margin-top), 10); if(isUp()) { opts.anim_marginTop = opts.orginal_marginTop - _outHeight - parseInt($div.css(padding-top), 10); } else { opts.anim_marginTop = opts.orginal_marginTop + _outHeight; } // 初始化容器样式和事件 $div.css({ height: totalHeight + px, overflow: hidden }).hover(function() { // 鼠标进入时 停止滚动 opts.hold = true; }, function() { // 鼠标离开 重新开始滚动 opts.hold = false; startRolling($(this)); }).trigger(mouseleave); }); /** * 滚动方向判断 */ function isUp() { if(opts.direction === up) return true; if(opts.direction === down) return false; throw new Error(direction should be "up" or "down"); } /** * 生成一个jQuery封装的<A></A> */ function buildLink(item) { var html = item.html; delete item.html; return $(<A></A>).attr(item).html(html); } function startRolling($div) { setTimeout(function() { // 是否停止滚动 if(!opts.hold) { var first = null, _funSelf = arguments.callee; // 当前第一个元素 first = $div.find(.roller-item:first); first.animate({marginTop: opts.anim_marginTop}, opts.interval, function() { // 从队列中取出下一个条目 var temp = itemQueue.shift(); // 把它的副本放到队列的尾部 itemQueue.push(temp.clone()); if(isUp()) { // 移除当前第一个元素 first.remove(); // 把刚取出的条目append到容器中 $div.append(temp.hide()); } else { // 移除当前最后一个元素 $div.find(.roller-item:last).remove(); // 让当前第一个元素的marginTop恢复成初始值 first.css(margin-top, opts.orginal_marginTop + px); // 把刚取出的条目prepend到容器中 $div.prepend(temp.hide()); } temp.fadeIn(opts.interval - 50); // 触发下一个循环 setTimeout(_funSelf, opts.interval); }); } }, opts.interval); }; }; //工具方法集合 var Util = { toString: function(v) { return Object.prototype.toString.apply(v); }, // 判断是否是Array isArray : function(v){ return Util.toString(v) === [object Array]; } }; // 滚动新闻默认配置 $.fn.roller.defaults = { interval: 1000, // 滚动间隔 showNum: 5, // 一次显示新闻数 hold: false, // 是否停止滚动 direction: up // 滚动方向 }; })(jQuery); 看下页面使用代码 复制代码 代码如下: <DIV id=container> </DIV> $(#container).roller({ showNum:4, //显示个数 interval: 1500, //滚动的时间间隔 direction: down, //滚动方向 items: [{ //内容 title: ccav滚动新闻1, //a的title属性 html: ccav滚动新闻1, //a的innerHTML target: _blank, //a的target href: http://www.google.com.hk //a的href }, { title: ccav滚动新闻2, html: ccav滚动新闻2, target: _blank, href: http://www.google.com.hk }, { title: ccav滚动新闻3, html: ccav滚动新闻3, target: _blank, href: http://www.google.com.hk }, { title: ccav滚动新闻4, html: ccav滚动新闻4, target: _blank, href: http://www.google.com.hk }, { title: ccav滚动新闻5, html: ccav滚动新闻5, target: _blank, href: http://www.google.com.hk }, { title: ccav滚动新闻6, html: ccav滚动新闻6, target: _blank, href: http://www.google.com.hk }] }); 在线演示 http://demo.jb51.net/js/2011/news_roller_Demo/jquery.roller.html 打包下载 /201106/yuanma/news_roller_Demo.rar |