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

所属分类: 网络编程 / JavaScript 阅读数: 1053
收藏 0 赞 0 分享
我在源码里给出了注释,有什么不足之处后或者可以改进的地方, 希望能够大家留言探讨...

效果图(比较朴素):

复制代码 代码如下:

;(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
更多精彩内容其他人还在看

jQuery LigerUI 使用教程表格篇(1)

ligerGrid是ligerui系列插件的核心控件,用户可以快速地创建一个美观,而且功能强大的表格,支持排序、分页、多表头、固定列等等
收藏 0 赞 0 分享

JavaScript中常用的运算符小结

JavaScript中常用的运算符小结,需要的朋友可以参考下。
收藏 0 赞 0 分享

深入理解JavaScript系列(13) This? Yes,this!

在这篇文章里,我们将讨论跟执行上下文直接相关的更多细节。讨论的主题就是this关键字。实践证明,这个主题很难,在不同执行上下文中this的确定经常会发生问题
收藏 0 赞 0 分享

javascript (用setTimeout而非setInterval)

javascript (用setTimeout而非setInterval)如果用setInterval 可能出现 下次调用会在前一次调用前调用
收藏 0 赞 0 分享

JavaScript中两个感叹号的作用说明

用两个感叹号的作用就在于,如果明确设置了o中flag的值(非null/undefined/0""/等值),自然test就会取跟o.flag一样的值;如果没有设置,test就会默认为false,而不是null或undefined
收藏 0 赞 0 分享

javascript写的简单的计算器,内容很多,方法实用,推荐

最近用javascript写了一个简单的计算器,自己测试感觉还好,代码都给了注释,非常不错,推荐大家学习。
收藏 0 赞 0 分享

js的表单操作 简单计算器

javascript写的简单的加减乘除计算器,里面涉及到一些方法还是很实用的哦,新手不要错过
收藏 0 赞 0 分享

Jquery中删除元素的实现代码

empty用来删除指定元素的子元素,remove用来删除元素,或者设定细化条件执行删除
收藏 0 赞 0 分享

javaScript 利用闭包模拟对象的私有属性

JavaScript缺少块级作用域,没有private修饰符,但它具有函数作用域。作用域的好处是内部函数可以访问它们的外部函数的参数和变量(除了this和argument
收藏 0 赞 0 分享

为JavaScript类型增加方法的实现代码(增加功能)

大家在js开发过程中有些功能已经满足不了我们的需求,或没有我们需要的功能,那么我们就可以自己扩展下,个性化js
收藏 0 赞 0 分享
查看更多