123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314 |
- /**
- * @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,//缓动效果,单次移动时间,越小速度越快,为0时无缓动效果
- * time:5,//停顿时间,单位为秒
- * direction: 'left',//滚动方向,'left','right','up','down'
- * scrollAmount:1,//步长
- * scrollDelay:20//时长,单位为毫秒
- * isEqual:true,//所有滚动的元素长宽是否相等,true,false
- * loop: 0,//循环滚动次数,0时无限
- * btnGo:{left:'#goL',right:'#goR'},//控制方向的按钮ID,有四个属性left,right,up,down分别对应四个方向
- * eventGo:'click',//鼠标事件
- * controlBtn:{left:'#goL',right:'#goR'},//控制加速滚动的按钮ID,有四个属性left,right,up,down分别对应四个方向
- * newAmount:4,//加速滚动的步长
- * eventA:'mouseenter',//鼠标事件,加速
- * eventB:'mouseleave',//鼠标事件,原速
- * navId:'#marqueeNav', //导航容器ID,导航DOM:<ul><li>1</li><li>2</li><ul>,导航CSS:.navOn
- * 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);//滚动元素容器DOM
- 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;//滚动类型,1左右,0上下
- var scrollId, rollId, isMove, marqueeId;
- var t,b,c,d,e; //滚动动画的参数,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 = setInterval(scrollFunc, opts.scrollDelay);
- marqueeId = setTimeout(scrollFunc, opts.scrollDelay);
- //鼠标划过停止滚动
- $marquee.hover(
- function(){
- clearInterval(marqueeId);
- },
- function(){
- //marqueeId = setInterval(scrollFunc, opts.scrollDelay);
- 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;
- }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;
- //得到当前所看元素序号并改变导航CSS
- 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];
- //c=(pPos != undefined)?pPos:_neg*opts.distance;
- 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;
-
- //scrollId = setInterval(scrollFunc, opts.scrollDelay);
- 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,//是否为Marquee
- isEqual:true,//所有滚动的元素长宽是否相等,true,false
- loop: 0,//循环滚动次数,0时无限
- newAmount:3,//加速滚动的步长
- eventA:'mousedown',//鼠标事件,加速
- eventB:'mouseup',//鼠标事件,原速
- isAuto:true,//是否自动轮换
- time:5,//停顿时间,单位为秒
- duration:50,//缓动效果,单次移动时间,越小速度越快,为0时无缓动效果
- eventGo:'click', //鼠标事件,向前向后走
- direction: 'left',//滚动方向,'left','right','up','down'
- scrollAmount:1,//步长
- scrollDelay:10,//时长
- eventNav:'click'//导航事件
- };
-
- $.fn.kxbdSuperMarquee.setDefaults = function(settings) {
- $.extend( $.fn.kxbdSuperMarquee.defaults, settings );
- };
-
- })(jQuery);
|