325 lines
6.8 KiB
JavaScript
325 lines
6.8 KiB
JavaScript
|
/**
|
|||
|
* @classDescription 超级Marquee,可做图片导航,图片轮换
|
|||
|
* @author Aken Li(www.kxbd.com)
|
|||
|
* @date 2009-07-27
|
|||
|
* @dependence jQuery 1.3.2
|
|||
|
* @DOM
|
|||
|
* <div id="marquee">
|
|||
|
* <ul>
|
|||
|
* <li></li>
|
|||
|
* <li></li>
|
|||
|
* </ul>
|
|||
|
* </div>
|
|||
|
* @CSS
|
|||
|
* #marquee {width:200px;height:50px;overflow:hidden;}
|
|||
|
* @Usage
|
|||
|
* $('#marquee').kxbdSuperMarquee(options);
|
|||
|
* @options
|
|||
|
* distance:200,
|
|||
|
* duration:20,
|
|||
|
* time:5,
|
|||
|
* direction: 'left',
|
|||
|
* scrollAmount:1,
|
|||
|
* scrollDelay:20
|
|||
|
* isEqual:true,
|
|||
|
* loop: 0,
|
|||
|
* btnGo:{left:'#goL',right:'#goR'},
|
|||
|
* eventGo:'click',
|
|||
|
* controlBtn:{left:'#goL',right:'#goR'},
|
|||
|
* newAmount:4,
|
|||
|
* eventA:'mouseenter',
|
|||
|
* eventB:'mouseleave',
|
|||
|
* navId:'#marqueeNav',
|
|||
|
* eventNav:'click'
|
|||
|
*/
|
|||
|
(function($){
|
|||
|
|
|||
|
$.fn.kxbdSuperMarquee = function(options){
|
|||
|
var opts = $.extend({},$.fn.kxbdSuperMarquee.defaults, options);
|
|||
|
|
|||
|
return this.each(function(){
|
|||
|
var $marquee = $(this);
|
|||
|
var _scrollObj = $marquee.get(0);
|
|||
|
var scrollW = $marquee.width();
|
|||
|
var scrollH = $marquee.height();
|
|||
|
var $element = $marquee.children();
|
|||
|
var $kids = $element.children();
|
|||
|
var scrollSize=0;
|
|||
|
var _type = (opts.direction == 'left' || opts.direction == 'right') ? 1:0;
|
|||
|
var scrollId, rollId, isMove, marqueeId;
|
|||
|
var t,b,c,d,e;
|
|||
|
var _size, _len;
|
|||
|
var $nav,$navBtns;
|
|||
|
var arrPos = [];
|
|||
|
var numView = 0;
|
|||
|
var numRoll=0;
|
|||
|
var numMoved = 0;
|
|||
|
|
|||
|
|
|||
|
$element.css(_type?'width':'height',10000);
|
|||
|
|
|||
|
var navHtml = '<ul>';
|
|||
|
if (opts.isEqual) {
|
|||
|
_size = $kids[_type?'outerWidth':'outerHeight']();
|
|||
|
_len = $kids.length;
|
|||
|
scrollSize = _size * _len;
|
|||
|
for(var i=0;i<_len;i++){
|
|||
|
arrPos.push(i*_size);
|
|||
|
navHtml += '<li>'+ (i+1) +'</li>';
|
|||
|
}
|
|||
|
}else{
|
|||
|
$kids.each(function(i){
|
|||
|
arrPos.push(scrollSize);
|
|||
|
scrollSize += $(this)[_type?'outerWidth':'outerHeight']();
|
|||
|
navHtml += '<li>'+ (i+1) +'</li>';
|
|||
|
});
|
|||
|
}
|
|||
|
navHtml += '</ul>';
|
|||
|
|
|||
|
|
|||
|
if (scrollSize<(_type?scrollW:scrollH)) return;
|
|||
|
|
|||
|
$element.append($kids.clone()).css(_type?'width':'height',scrollSize*2);
|
|||
|
|
|||
|
|
|||
|
if (opts.navId) {
|
|||
|
$nav = $(opts.navId).append(navHtml).hover( stop, start );
|
|||
|
$navBtns = $('li', $nav);
|
|||
|
$navBtns.each(function(i){
|
|||
|
$(this).bind(opts.eventNav,function(){
|
|||
|
if(isMove) return;
|
|||
|
if(numView==i) return;
|
|||
|
rollFunc(arrPos[i]);
|
|||
|
$navBtns.eq(numView).removeClass('navOn');
|
|||
|
numView = i;
|
|||
|
$(this).addClass('navOn');
|
|||
|
});
|
|||
|
});
|
|||
|
$navBtns.eq(numView).addClass('navOn');
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if (opts.direction == 'right' || opts.direction == 'down') {
|
|||
|
_scrollObj[_type?'scrollLeft':'scrollTop'] = scrollSize;
|
|||
|
}else{
|
|||
|
_scrollObj[_type?'scrollLeft':'scrollTop'] = 0;
|
|||
|
}
|
|||
|
|
|||
|
if(opts.isMarquee){
|
|||
|
|
|||
|
|
|||
|
marqueeId = setTimeout(scrollFunc, opts.scrollDelay);
|
|||
|
|
|||
|
$marquee.hover(
|
|||
|
function(){
|
|||
|
clearInterval(marqueeId);
|
|||
|
},
|
|||
|
function(){
|
|||
|
|
|||
|
clearInterval(marqueeId);
|
|||
|
marqueeId = setTimeout(scrollFunc, opts.scrollDelay);
|
|||
|
}
|
|||
|
);
|
|||
|
|
|||
|
|
|||
|
if(opts.controlBtn){
|
|||
|
$.each(opts.controlBtn, function(i,val){
|
|||
|
$(val).bind(opts.eventA,function(){
|
|||
|
opts.direction = i;
|
|||
|
opts.oldAmount = opts.scrollAmount;
|
|||
|
opts.scrollAmount = opts.newAmount;
|
|||
|
}).bind(opts.eventB,function(){
|
|||
|
opts.scrollAmount = opts.oldAmount;
|
|||
|
});
|
|||
|
});
|
|||
|
}
|
|||
|
}else{
|
|||
|
if(opts.isAuto){
|
|||
|
|
|||
|
start();
|
|||
|
|
|||
|
|
|||
|
$marquee.hover( stop, start );
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
if(opts.btnGo){
|
|||
|
$.each(opts.btnGo, function(i,val){
|
|||
|
$(val).bind(opts.eventGo,function(){
|
|||
|
if(isMove == true) return;
|
|||
|
opts.direction = i;
|
|||
|
rollFunc();
|
|||
|
if (opts.isAuto) {
|
|||
|
stop();
|
|||
|
start();
|
|||
|
}
|
|||
|
});
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
function scrollFunc(){
|
|||
|
var _dir = (opts.direction == 'left' || opts.direction == 'right') ? 'scrollLeft':'scrollTop';
|
|||
|
|
|||
|
if(opts.isMarquee){
|
|||
|
if (opts.loop > 0) {
|
|||
|
numMoved+=opts.scrollAmount;
|
|||
|
if(numMoved>scrollSize*opts.loop){
|
|||
|
_scrollObj[_dir] = 0;
|
|||
|
return clearInterval(marqueeId);
|
|||
|
}
|
|||
|
}
|
|||
|
var newPos = _scrollObj[_dir]+(opts.direction == 'left' || opts.direction == 'up'?1:-1)*opts.scrollAmount;
|
|||
|
|
|||
|
if (newPos==(scrollSize-$(".marquee").width())){
|
|||
|
$(".marquee").trigger("reload");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
}else{
|
|||
|
if(opts.duration){
|
|||
|
if(t++<d){
|
|||
|
isMove = true;
|
|||
|
var newPos = Math.ceil(easeOutQuad(t,b,c,d));
|
|||
|
if(t==d){
|
|||
|
newPos = e;
|
|||
|
}
|
|||
|
}else{
|
|||
|
newPos = e;
|
|||
|
clearInterval(scrollId);
|
|||
|
isMove = false;
|
|||
|
return;
|
|||
|
}
|
|||
|
}else{
|
|||
|
var newPos = e;
|
|||
|
clearInterval(scrollId);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if(opts.direction == 'left' || opts.direction == 'up'){
|
|||
|
if(newPos>=scrollSize){
|
|||
|
newPos-=scrollSize;
|
|||
|
}
|
|||
|
}else{
|
|||
|
if(newPos<=0){
|
|||
|
newPos+=scrollSize;
|
|||
|
}
|
|||
|
}
|
|||
|
_scrollObj[_dir] = newPos;
|
|||
|
|
|||
|
if(opts.isMarquee){
|
|||
|
marqueeId = setTimeout(scrollFunc, opts.scrollDelay);
|
|||
|
}else if(t<d){
|
|||
|
if(scrollId) clearTimeout(scrollId);
|
|||
|
scrollId = setTimeout(scrollFunc, opts.scrollDelay);
|
|||
|
}else{
|
|||
|
isMove = false;
|
|||
|
}
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
function rollFunc(pPos){
|
|||
|
isMove = true;
|
|||
|
var _dir = (opts.direction == 'left' || opts.direction == 'right') ? 'scrollLeft':'scrollTop';
|
|||
|
var _neg = opts.direction == 'left' || opts.direction == 'up'?1:-1;
|
|||
|
|
|||
|
numRoll = numRoll +_neg;
|
|||
|
|
|||
|
if(pPos == undefined&&opts.navId){
|
|||
|
$navBtns.eq(numView).removeClass('navOn');
|
|||
|
numView +=_neg;
|
|||
|
if(numView>=_len){
|
|||
|
numView = 0;
|
|||
|
|
|||
|
}else if(numView<0){
|
|||
|
numView = _len-1;
|
|||
|
}
|
|||
|
$navBtns.eq(numView).addClass('navOn');
|
|||
|
numRoll = numView;
|
|||
|
}
|
|||
|
|
|||
|
var _temp = numRoll<0?scrollSize:0;
|
|||
|
t=0;
|
|||
|
b=_scrollObj[_dir];
|
|||
|
|
|||
|
e=(pPos != undefined)?pPos:_temp+(opts.distance*numRoll)%scrollSize;
|
|||
|
if(_neg==1){
|
|||
|
|
|||
|
if(e>b){
|
|||
|
c = e-b;
|
|||
|
}else{
|
|||
|
c = e+scrollSize -b;
|
|||
|
}
|
|||
|
}else{
|
|||
|
if(e>b){
|
|||
|
c =e-scrollSize-b;
|
|||
|
}else{
|
|||
|
c = e-b;
|
|||
|
}
|
|||
|
}
|
|||
|
d=opts.duration;
|
|||
|
|
|||
|
|
|||
|
if(scrollId) clearTimeout(scrollId);
|
|||
|
scrollId = setTimeout(scrollFunc, opts.scrollDelay);
|
|||
|
}
|
|||
|
|
|||
|
function start(){
|
|||
|
rollId = setInterval(function(){
|
|||
|
rollFunc();
|
|||
|
}, opts.time*1000);
|
|||
|
}
|
|||
|
function stop(){
|
|||
|
clearInterval(rollId);
|
|||
|
}
|
|||
|
|
|||
|
function easeOutQuad(t,b,c,d){
|
|||
|
return -c *(t/=d)*(t-2) + b;
|
|||
|
}
|
|||
|
|
|||
|
function easeOutQuint(t,b,c,d){
|
|||
|
return c*((t=t/d-1)*t*t*t*t + 1) + b;
|
|||
|
}
|
|||
|
|
|||
|
});
|
|||
|
};
|
|||
|
$.fn.kxbdSuperMarquee.defaults = {
|
|||
|
isMarquee:false,
|
|||
|
isEqual:true,
|
|||
|
loop: 0,
|
|||
|
newAmount:3,
|
|||
|
eventA:'mousedown',
|
|||
|
eventB:'mouseup',
|
|||
|
isAuto:true,
|
|||
|
time:5,
|
|||
|
duration:50,
|
|||
|
eventGo:'click',
|
|||
|
direction: 'left',
|
|||
|
scrollAmount:1,
|
|||
|
scrollDelay:10,
|
|||
|
eventNav:'click'
|
|||
|
};
|
|||
|
|
|||
|
$.fn.kxbdSuperMarquee.setDefaults = function(settings) {
|
|||
|
$.extend( $.fn.kxbdSuperMarquee.defaults, settings );
|
|||
|
};
|
|||
|
|
|||
|
})(jQuery);
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|