jquery.cxscroll.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. (function($){
  2. $.fn.cxScroll=function(settings){
  3. if(!this.length){return;};
  4. settings=$.extend({},$.cxScroll.defaults,settings);
  5. var obj=this;
  6. var scroller={};
  7. scroller.fn={};
  8. scroller.box=obj.find(".box");
  9. scroller.list=scroller.box.find(".list");
  10. scroller.items=scroller.list.find("li");
  11. scroller.itemSum=scroller.items.length;
  12. if(scroller.itemSum<=1){return;};
  13. scroller.plusBtn=obj.find(".plus");
  14. scroller.minusBtn=obj.find(".minus");
  15. scroller.itemWidth=scroller.items.outerWidth();
  16. scroller.itemHeight=scroller.items.outerHeight();
  17. if(settings.direction=="left"||settings.direction=="right"){
  18. if(scroller.itemWidth*scroller.itemSum<=scroller.box.outerWidth()){return;};
  19. scroller.plusVal="left";
  20. scroller.minusVal="right";
  21. scroller.moveVal=scroller.itemWidth;
  22. }else{
  23. if(scroller.itemHeight*scroller.itemSum<=scroller.box.outerHeight()){return;};
  24. scroller.plusVal="top";
  25. scroller.minusVal="bottom";
  26. scroller.moveVal=scroller.itemHeight;
  27. };
  28. // 元素:左右操作按钮
  29. if(settings.plus&&!scroller.plusBtn.length){
  30. scroller.plusBtn=$("<a></a>",{"class":"plus"}).appendTo(obj);
  31. };
  32. if(settings.minus&&!scroller.minusBtn.length){
  33. scroller.minusBtn=$("<a></a>",{"class":"minus"}).appendTo(obj);
  34. };
  35. // 元素:后补
  36. scroller.list.append(scroller.list.html());
  37. // 方法:开始
  38. scroller.fn.on=function(){
  39. if(!settings.auto){return;};
  40. scroller.fn.off();
  41. scroller.run=setTimeout(function(){
  42. scroller.fn.goto(settings.direction);
  43. },settings.time);
  44. };
  45. // 方法:停止
  46. scroller.fn.off=function(){
  47. if(typeof(scroller.run)!=="undefined"){clearTimeout(scroller.run);};
  48. };
  49. // 方法:增加控制
  50. scroller.fn.addControl=function(){
  51. if(settings.plus&&scroller.minusBtn.length){
  52. scroller.plusBtn.bind("click",function(){
  53. scroller.fn.goto(scroller.plusVal);
  54. });
  55. };
  56. if(settings.minus&&scroller.minusBtn.length){
  57. scroller.minusBtn.bind("click",function(){
  58. scroller.fn.goto(scroller.minusVal);
  59. });
  60. };
  61. };
  62. // 方法:解除控制
  63. scroller.fn.removeControl=function(){
  64. if(scroller.plusBtn.length){scroller.plusBtn.unbind("click");};
  65. if(scroller.minusBtn.length){scroller.minusBtn.unbind("click");};
  66. };
  67. // 方法:滚动
  68. scroller.fn.goto=function(d){
  69. scroller.fn.off();
  70. scroller.fn.removeControl();
  71. scroller.box.stop(true);
  72. var _max; // _max 滚动的最大限度
  73. var _dis; // _dis 滚动的距离
  74. switch(d){
  75. case "left":
  76. case "top":
  77. _max=0;
  78. if(d=="left"){
  79. if(parseInt(scroller.box.scrollLeft(),10)==0){
  80. scroller.box.scrollLeft(scroller.itemSum*scroller.moveVal);
  81. };
  82. _dis=scroller.box.scrollLeft()-(scroller.moveVal*settings.step);
  83. if(_dis<_max){_dis=_max};
  84. scroller.box.animate({"scrollLeft":_dis},settings.speed,function(){
  85. if(parseInt(scroller.box.scrollLeft(),10)<=_max){
  86. scroller.box.scrollLeft(0);
  87. };
  88. scroller.fn.addControl();
  89. });
  90. }else{
  91. if(parseInt(scroller.box.scrollTop(),10)==0){
  92. scroller.box.scrollTop(scroller.itemSum*scroller.moveVal);
  93. };
  94. _dis=scroller.box.scrollTop()-(scroller.moveVal*settings.step);
  95. if(_dis<_max){_dis=_max};
  96. scroller.box.animate({"scrollTop":_dis},settings.speed,function(){
  97. if(parseInt(scroller.box.scrollTop(),10)<=_max){
  98. scroller.box.scrollTop(0);
  99. };
  100. scroller.fn.addControl();
  101. });
  102. };
  103. break;
  104. case "right":
  105. case "bottom":
  106. _max=scroller.itemSum*scroller.moveVal;
  107. if(d=="right"){
  108. _dis=scroller.box.scrollLeft()+(scroller.moveVal*settings.step);
  109. if(_dis>_max){_dis=_max};
  110. scroller.box.animate({"scrollLeft":_dis},settings.speed,function(){
  111. if(parseInt(scroller.box.scrollLeft(),10)>=_max){
  112. scroller.box.scrollLeft(0);
  113. };
  114. });
  115. }else{
  116. _dis=scroller.box.scrollTop()+(scroller.moveVal*settings.step);
  117. if(_dis>_max){_dis=_max};
  118. scroller.box.animate({"scrollTop":_dis},settings.speed,function(){
  119. if(parseInt(scroller.box.scrollTop(),10)>=_max){
  120. scroller.box.scrollTop(0);
  121. };
  122. });
  123. };
  124. break;
  125. };
  126. scroller.box.queue(function(){
  127. scroller.fn.addControl();
  128. scroller.fn.on();
  129. $(this).dequeue();
  130. });
  131. };
  132. // 事件:鼠标移入停止,移出开始
  133. scroller.box.hover(function(){
  134. scroller.fn.off();
  135. },function(){
  136. scroller.fn.on();
  137. });
  138. scroller.fn.addControl();
  139. scroller.fn.on();
  140. };
  141. // 默认值
  142. $.cxScroll={defaults:{
  143. direction:"right", // 滚动方向
  144. step:1, // 滚动步长
  145. speed:800, // 滚动速度
  146. time:4000, // 自动滚动间隔时间
  147. auto:true, // 是否自动滚动
  148. plus:true, // 是否使用 plus 按钮
  149. minus:true // 是否使用 minus 按钮
  150. }};
  151. })(jQuery);