jQuery新闻滚动插件 jquery.roller.js


Posted in Javascript onJune 27, 2011

我在源码里给出了注释,有什么不足之处后或者可以改进的地方, 希望能够大家留言探讨...

效果图(比较朴素):
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.3water.com/js/2011/news_roller_Demo/jquery.roller.html
打包下载 /201106/yuanma/news_roller_Demo.rar
Javascript 相关文章推荐
javascript 用原型继承来实现对象系统
Mar 22 Javascript
JS实现定时页面弹出类似QQ新闻的提示框
Nov 07 Javascript
jquery中的on方法使用介绍
Dec 29 Javascript
AngularJS中取消对HTML片段转义的方法例子
Jan 04 Javascript
js精美的幻灯片画集特效代码分享
Aug 29 Javascript
js控制按钮,防止频繁点击响应的实例
Feb 15 Javascript
vue实现点击当前标签高亮效果【推荐】
Jun 22 Javascript
node.js文件操作系统实例详解
Nov 05 Javascript
Vue 实现对quill-editor组件中的工具栏添加title
Aug 03 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
Aug 15 Javascript
js 实现碰撞检测的示例
Oct 28 Javascript
JS中forEach()、map()、every()、some()和filter()的用法
May 11 Javascript
jquery中获取select选中值的代码
Jun 27 #Javascript
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
Jun 27 #Javascript
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
Jun 27 #Javascript
读jQuery之十 事件模块概述
Jun 27 #Javascript
AeroWindow 基于JQuery的弹出窗口插件
Jun 27 #Javascript
jQuery表格行换色的三种实现方法
Jun 27 #Javascript
19个很有用的 JavaScript库推荐
Jun 27 #Javascript
You might like
如何在PHP中进行身份认证
2006/10/09 PHP
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
2006/12/06 PHP
四个常见html网页乱码问题及解决办法
2015/09/08 PHP
PHP面向对象程序设计类的定义与用法简单示例
2016/12/27 PHP
PHP实现的简单排列组合算法应用示例
2017/06/20 PHP
浅谈PHP各环境下的伪静态配置
2019/03/13 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
2019/10/15 PHP
javascript利用初始化数据装配模版的实现代码
2010/11/17 Javascript
JavaScript高级程序设计阅读笔记(十六) javascript检测浏览器和操作系统-detect.js
2012/08/14 Javascript
js拆分字符串并将分割的数据放到数组中的方法
2015/05/06 Javascript
BootStrap modal模态弹窗使用小结
2016/10/26 Javascript
canvas实现绘制吃豆鱼效果
2017/01/12 Javascript
对于input 框限定输入值为浮点型的js代码
2017/09/25 Javascript
微信小程序之滚动视图容器的实现方法
2017/09/26 Javascript
setTimeout时间设置为0详细解析
2018/03/13 Javascript
javascript实现计算指定范围内的质数示例
2018/12/29 Javascript
vue自定义指令directive的使用方法
2019/04/07 Javascript
Python中类的继承代码实例
2014/10/28 Python
Python docx库用法示例分析
2019/02/16 Python
Python中新式类与经典类的区别详析
2019/07/10 Python
意大利在线眼镜精品店:Ottica Lipari
2019/11/11 全球购物
培训主管的职业生涯规划
2014/03/06 职场文书
商务英语专业毕业生求职信
2014/07/06 职场文书
小学生自我评价100字(15篇)
2014/09/18 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
中班下学期幼儿评语
2014/12/30 职场文书
公司感谢信范文
2015/01/22 职场文书
公司副总经理岗位职责
2015/04/08 职场文书
2015年银行大堂经理工作总结
2015/04/24 职场文书
工作迟到检讨书范文
2015/05/06 职场文书
运动会三级跳加油稿
2015/07/21 职场文书
详细聊聊MySQL中慢SQL优化的方向
2021/08/30 MySQL
详解Python flask的前后端交互
2022/03/31 Python
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python
Redis实现分布式锁的五种方法详解
2022/06/14 Redis
不想升级Win11?教你彻底锁定老版Windows系统的方法(附下载地址)
2022/09/23 数码科技