jquery.jscroll.js 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. /**
  2. *
  3. * Copyright (c) 2009 May(qq104010230)
  4. * http://www.winwill.com
  5. * http://www.winwill.com/jquery/jscroll.html
  6. * admin@winwill.com
  7. */
  8. /*--------------------------------------------------------------------------------------------------*/
  9. $.fn.extend({//添加滚轮事件//by jun
  10. mousewheel:function(Func){
  11. return this.each(function(){
  12. var _self = this;
  13. _self.D = 0;//滚动方向
  14. if($.browser.msie||$.browser.safari){
  15. _self.onmousewheel=function(){_self.D = event.wheelDelta;event.returnValue = false;Func && Func.call(_self);};
  16. }else{
  17. _self.addEventListener("DOMMouseScroll",function(e){
  18. _self.D = e.detail>0?-1:1;
  19. e.preventDefault();
  20. Func && Func.call(_self);
  21. },false);
  22. }
  23. });
  24. }
  25. });
  26. $.fn.extend({
  27. jscroll:function(j){
  28. return this.each(function(){
  29. j = j || {}
  30. j.Bar = j.Bar||{};//2级对象
  31. j.Btn = j.Btn||{};//2级对象
  32. j.Bar.Bg = j.Bar.Bg||{};//3级对象
  33. j.Bar.Bd = j.Bar.Bd||{};//3级对象
  34. j.Btn.uBg = j.Btn.uBg||{};//3级对象
  35. j.Btn.dBg = j.Btn.dBg||{};//3级对象
  36. var jun = { W:"15px"
  37. ,BgUrl:""
  38. ,Bg:"#efefef"
  39. ,Bar:{ Pos:"up"
  40. ,Bd:{Out:"#b5b5b5",Hover:"#ccc"}
  41. ,Bg:{Out:"#fff",Hover:"#fff",Focus:"orange"}}
  42. ,Btn:{ btn:true
  43. ,uBg:{Out:"#ccc",Hover:"#fff",Focus:"orange"}
  44. ,dBg:{Out:"#ccc",Hover:"#fff",Focus:"orange"}}
  45. ,Fn:function(){}}
  46. j.W = j.W||jun.W;
  47. j.BgUrl = j.BgUrl||jun.BgUrl;
  48. j.Bg = j.Bg||jun.Bg;
  49. j.Bar.Pos = j.Bar.Pos||jun.Bar.Pos;
  50. j.Bar.Bd.Out = j.Bar.Bd.Out||jun.Bar.Bd.Out;
  51. j.Bar.Bd.Hover = j.Bar.Bd.Hover||jun.Bar.Bd.Hover;
  52. j.Bar.Bg.Out = j.Bar.Bg.Out||jun.Bar.Bg.Out;
  53. j.Bar.Bg.Hover = j.Bar.Bg.Hover||jun.Bar.Bg.Hover;
  54. j.Bar.Bg.Focus = j.Bar.Bg.Focus||jun.Bar.Bg.Focus;
  55. j.Btn.btn = j.Btn.btn!=undefined?j.Btn.btn:jun.Btn.btn;
  56. j.Btn.uBg.Out = j.Btn.uBg.Out||jun.Btn.uBg.Out;
  57. j.Btn.uBg.Hover = j.Btn.uBg.Hover||jun.Btn.uBg.Hover;
  58. j.Btn.uBg.Focus = j.Btn.uBg.Focus||jun.Btn.uBg.Focus;
  59. j.Btn.dBg.Out = j.Btn.dBg.Out||jun.Btn.dBg.Out;
  60. j.Btn.dBg.Hover = j.Btn.dBg.Hover||jun.Btn.dBg.Hover;
  61. j.Btn.dBg.Focus = j.Btn.dBg.Focus||jun.Btn.dBg.Focus;
  62. j.Fn = j.Fn||jun.Fn;
  63. var _self = this;
  64. var Stime,Sp=0,Isup=0;
  65. $(_self).css({overflow:"hidden",position:"relative",padding:"0px"});
  66. var dw = $(_self).width(), dh = $(_self).height()-1;
  67. var sw = j.W ? parseInt(j.W) : 21;
  68. var sl = dw - sw
  69. var bw = j.Btn.btn==true ? sw : 0;
  70. if($(_self).children(".jscroll-c").height()==null){//存在性检测
  71. $(_self).wrapInner("<div class='jscroll-c' style='top:0px;z-index:9999;zoom:1;position:relative'></div>");
  72. $(_self).children(".jscroll-c").prepend("<div style='height:0px;overflow:hidden'></div>");
  73. $(_self).append("<div class='jscroll-e' unselectable='on' style=' height:100%;top:0px;right:0;-moz-user-select:none;position:absolute;overflow:hidden;z-index:10000;'><div class='jscroll-u' style='position:absolute;top:0px;width:100%;left:0;background:blue;overflow:hidden'></div><div class='jscroll-h' unselectable='on' style='background:green;position:absolute;left:0;-moz-user-select:none;border:1px solid'></div><div class='jscroll-d' style='position:absolute;bottom:0px;width:100%;left:0;background:blue;overflow:hidden'></div></div>");
  74. }
  75. var jscrollc = $(_self).children(".jscroll-c");
  76. var jscrolle = $(_self).children(".jscroll-e");
  77. var jscrollh = jscrolle.children(".jscroll-h");
  78. var jscrollu = jscrolle.children(".jscroll-u");
  79. var jscrolld = jscrolle.children(".jscroll-d");
  80. if($.browser.msie){document.execCommand("BackgroundImageCache", false, true);}
  81. jscrollc.css({"padding-right":sw});
  82. jscrolle.css({width:sw,background:j.Bg,"background-image":j.BgUrl});
  83. jscrollh.css({top:bw,background:j.Bar.Bg.Out,"background-image":j.BgUrl,"border-color":j.Bar.Bd.Out,width:sw-2});
  84. jscrollu.css({height:bw,background:j.Btn.uBg.Out,"background-image":j.BgUrl});
  85. jscrolld.css({height:bw,background:j.Btn.dBg.Out,"background-image":j.BgUrl});
  86. jscrollh.hover(function(){if(Isup==0)$(this).css({background:j.Bar.Bg.Hover,"background-image":j.BgUrl,"border-color":j.Bar.Bd.Hover})},function(){if(Isup==0)$(this).css({background:j.Bar.Bg.Out,"background-image":j.BgUrl,"border-color":j.Bar.Bd.Out})})
  87. jscrollu.hover(function(){if(Isup==0)$(this).css({background:j.Btn.uBg.Hover,"background-image":j.BgUrl})},function(){if(Isup==0)$(this).css({background:j.Btn.uBg.Out,"background-image":j.BgUrl})})
  88. jscrolld.hover(function(){if(Isup==0)$(this).css({background:j.Btn.dBg.Hover,"background-image":j.BgUrl})},function(){if(Isup==0)$(this).css({background:j.Btn.dBg.Out,"background-image":j.BgUrl})})
  89. var sch = jscrollc.height();
  90. //var sh = Math.pow(dh,2) / sch ;//Math.pow(x,y)x的y次方
  91. var sh = (dh-2*bw)*dh / sch
  92. if(sh<10){sh=10}
  93. var wh = sh/6//滚动时候跳动幅度
  94. // sh = parseInt(sh);
  95. var curT = 0,allowS=false;
  96. jscrollh.height(sh);
  97. if(sch<=dh){jscrollc.css({padding:0});jscrolle.css({display:"none"})}else{allowS=true;}
  98. if(j.Bar.Pos!="up"){
  99. curT=dh-sh-bw;
  100. setT();
  101. }
  102. jscrollh.bind("mousedown",function(e){
  103. j['Fn'] && j['Fn'].call(_self);
  104. Isup=1;
  105. jscrollh.css({background:j.Bar.Bg.Focus,"background-image":j.BgUrl})
  106. var pageY = e.pageY ,t = parseInt($(this).css("top"));
  107. $(document).mousemove(function(e2){
  108. curT =t+ e2.pageY - pageY;//pageY浏览器可视区域鼠标位置,screenY屏幕可视区域鼠标位置
  109. setT();
  110. });
  111. $(document).mouseup(function(){
  112. Isup=0;
  113. jscrollh.css({background:j.Bar.Bg.Out,"background-image":j.BgUrl,"border-color":j.Bar.Bd.Out})
  114. $(document).unbind();
  115. });
  116. return false;
  117. });
  118. jscrollu.bind("mousedown",function(e){
  119. j['Fn'] && j['Fn'].call(_self);
  120. Isup=1;
  121. jscrollu.css({background:j.Btn.uBg.Focus,"background-image":j.BgUrl})
  122. _self.timeSetT("u");
  123. $(document).mouseup(function(){
  124. Isup=0;
  125. jscrollu.css({background:j.Btn.uBg.Out,"background-image":j.BgUrl})
  126. $(document).unbind();
  127. clearTimeout(Stime);
  128. Sp=0;
  129. });
  130. return false;
  131. });
  132. jscrolld.bind("mousedown",function(e){
  133. j['Fn'] && j['Fn'].call(_self);
  134. Isup=1;
  135. jscrolld.css({background:j.Btn.dBg.Focus,"background-image":j.BgUrl})
  136. _self.timeSetT("d");
  137. $(document).mouseup(function(){
  138. Isup=0;
  139. jscrolld.css({background:j.Btn.dBg.Out,"background-image":j.BgUrl})
  140. $(document).unbind();
  141. clearTimeout(Stime);
  142. Sp=0;
  143. });
  144. return false;
  145. });
  146. _self.timeSetT = function(d){
  147. var self=this;
  148. if(d=="u"){curT-=wh;}else{curT+=wh;}
  149. setT();
  150. Sp+=2;
  151. var t =500 - Sp*50;
  152. if(t<=0){t=0};
  153. Stime = setTimeout(function(){self.timeSetT(d);},t);
  154. }
  155. jscrolle.bind("mousedown",function(e){
  156. j['Fn'] && j['Fn'].call(_self);
  157. curT = curT + e.pageY - jscrollh.offset().top - sh/2;
  158. asetT();
  159. return false;
  160. });
  161. function asetT(){
  162. if(curT<bw){curT=bw;}
  163. if(curT>dh-sh-bw){curT=dh-sh-bw;}
  164. jscrollh.stop().animate({top:curT},100);
  165. var scT = -((curT-bw)*sch/(dh-2*bw));
  166. jscrollc.stop().animate({top:scT},1000);
  167. };
  168. function setT(){
  169. if(curT<bw){curT=bw;}
  170. if(curT>dh-sh-bw){curT=dh-sh-bw;}
  171. jscrollh.css({top:curT});
  172. var scT = -((curT-bw)*sch/(dh-2*bw));
  173. jscrollc.css({top:scT});
  174. };
  175. $(_self).mousewheel(function(){
  176. if(allowS!=true) return;
  177. j['Fn'] && j['Fn'].call(_self);
  178. if(this.D>0){curT-=wh;}else{curT+=wh;};
  179. setT();
  180. })
  181. });
  182. }
  183. });