scrollBar.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. ;
  2. (function($) {
  3. $.fn.extend({
  4. "scrollBar": function(options) {
  5. var settings = { barWidth: 5, position: "x,y", wheelDis: 15 };
  6. options = $.extend(settings, options);
  7. var horizontalDiv = '<div class="zl-scrollBarBox" style="width:100%;left:0;height:' + settings.barWidth + 'px;bottom:0;">' +
  8. '<div class="zl-scrollBar zl-horizontalBar" style="height:' + settings.barWidth + 'px;border-radius:' + settings.barWidth / 2 + 'px;"></div>' +
  9. '</div>';
  10. var verticalDiv = '<div class="zl-scrollBarBox" style="height:100%;top:0;width:' + settings.barWidth + 'px;right:0;">' +
  11. '<div class="zl-scrollBar zl-verticalBar" style="width:' + settings.barWidth + 'px;border-radius:' + settings.barWidth / 2 + 'px;"></div>' +
  12. '</div>';
  13. var T = this;
  14. T.each(function() { $(this).attr("paddingR", $(this).css("padding-right")).attr("paddingB", $(this).css("padding-bottom")); });
  15. function creatScrollBar(obj) {
  16. var This = $(obj).get(0);
  17. var paddingR = parseFloat($(obj).attr("paddingR"));
  18. var paddingB = parseFloat($(obj).attr("paddingB"));
  19. $(obj).css({ "padding-right": paddingR + "px", "padding-bottom": paddingB + "px", "overflow": "hidden" });
  20. if (!($(obj).children().hasClass("zl-scrollContentDiv"))) { $(obj).wrapInner('<div class="zl-scrollContentDiv"></div>'); };
  21. if ($(obj).css("position") == "static") { $(obj).css({ "position": "relative" }); };
  22. var scrollContentDiv = $(obj).find(".zl-scrollContentDiv");
  23. var scrollH = scrollContentDiv[0].scrollHeight;
  24. var scrollW = scrollContentDiv[0].scrollWidth;
  25. var innerH = scrollContentDiv.height();
  26. var innerW = scrollContentDiv.width();
  27. var outerH = $(obj).innerHeight();
  28. var outerW = $(obj).innerWidth();
  29. function addVerticalBar(a) { This.style.paddingRight = paddingR + settings.barWidth + 'px';
  30. innerH = $(a).height(); var barHeight = outerH * (innerH / scrollH);
  31. $(a).find(".zl-scrollBarBox").remove().end().append(verticalDiv).find(".zl-verticalBar").height(barHeight); };
  32. function addHorizontalBar(a) { This.style.paddingBottom = paddingB + settings.barWidth + 'px';
  33. innerW = $(a).width(); var barWidth = outerW * (innerW / scrollW);
  34. $(a).find(".zl-scrollBarBox").remove().end().append(horizontalDiv).find(".zl-horizontalBar").width(barWidth); };
  35. switch (settings.position) {
  36. case "x,y":
  37. if (scrollH > innerH && scrollW > innerW) { This.style.paddingRight = paddingR + settings.barWidth + 'px';
  38. innerH = $(obj).height();
  39. outerH = $(obj).innerHeight(); var barHeight = (outerH - settings.barWidth) * ((innerH - settings.barWidth) / scrollH); if (!($(obj).find(".zl-verticalBar").length)) { $(obj).append(verticalDiv); };
  40. $(obj).find(".zl-verticalBar").height(barHeight).parent().height(outerH - settings.barWidth);
  41. This.style.paddingBottom = paddingB + settings.barWidth + 'px';
  42. innerW = $(obj).width(); var barWidth = (outerW - settings.barWidth) * ((innerW - settings.barWidth) / scrollW); if (!($(obj).find(".zl-horizontalBar").length)) { $(obj).append(horizontalDiv); };
  43. $(obj).find(".zl-horizontalBar").width(barWidth).parent().width(outerW).css({ "padding-right": settings.barWidth + "px", "box-sizing": "border-box" }); } else if (scrollH > innerH) { addVerticalBar(obj); } else if (scrollW > innerW) { addHorizontalBar(obj); } else { $(obj).find(".zl-scrollBarBox").remove(); }
  44. break;
  45. case "x":
  46. if (scrollW > innerW) { addHorizontalBar(obj); } else { $(obj).find(".zl-scrollBarBox").remove(); }
  47. break;
  48. case "y":
  49. if (scrollH > innerH) { addVerticalBar(obj); } else { $(obj).find(".zl-scrollBarBox").remove(); }
  50. break;
  51. };
  52. }
  53. function recycleThis() { T.each(function() { creatScrollBar(this); }); };
  54. recycleThis();
  55. function creatTimer(obj, oldWidth, oldHeight, oldInnerWidth, oldInnerHeight, timer) {
  56. timer = setInterval(function() {
  57. var newWidth = null;
  58. var newHeight = null;
  59. var newInnerWidth = null;
  60. var newInnerHeight = null;
  61. var topDiv = null;
  62. var leftDiv = null;
  63. var topBar = null;
  64. var leftBar = null;
  65. var scrollContentDiv = $(obj).find(".zl-scrollContentDiv");
  66. if (scrollContentDiv.length) { newWidth = scrollContentDiv[0].scrollWidth;
  67. newHeight = scrollContentDiv[0].scrollHeight;
  68. newInnerWidth = scrollContentDiv.width();
  69. newInnerHeight = scrollContentDiv.height(); } else { newWidth = $(obj)[0].scrollWidth - parseFloat($(obj).css("padding-left"));
  70. newHeight = $(obj)[0].scrollHeight - parseFloat($(obj).css("padding-top"));
  71. newInnerWidth = $(obj).width();
  72. newInnerHeight = $(obj).height(); };
  73. if (newWidth != oldWidth || newHeight != oldHeight || newInnerWidth != oldInnerWidth || newInnerHeight != oldInnerHeight) {
  74. if (scrollContentDiv.length) { topDiv = parseFloat(scrollContentDiv.css("top"));
  75. leftDiv = parseFloat(scrollContentDiv.css("left")); };
  76. if ($(obj).find(".zl-verticalBar").length) { topBar = parseFloat($(obj).find(".zl-verticalBar").css("top")); };
  77. if ($(obj).find(".zl-horizontalBar").length) { leftBar = parseFloat($(obj).find(".zl-horizontalBar").css("left")); };
  78. creatScrollBar(obj);
  79. if ($(obj).find(".zl-scrollBarBox").length) {
  80. if (topDiv) {
  81. var maxTopBox = scrollContentDiv[0].scrollHeight - $(obj).height();
  82. var maxLeftBox = scrollContentDiv[0].scrollWidth - $(obj).width();
  83. if (-leftDiv > maxLeftBox) { leftDiv = -maxLeftBox; }
  84. if (-topDiv > maxTopBox) { topDiv = -maxTopBox; }
  85. scrollContentDiv.css({ "left": leftDiv + 'px', "top": topDiv + 'px' });
  86. };
  87. if (topBar && $(obj).find(".zl-verticalBar").length) {
  88. var verticalBar = $(obj).find(".zl-verticalBar");
  89. var maxTop = verticalBar.parent().height() - verticalBar.height();
  90. if (topBar > maxTop) { topBar = maxTop; }
  91. verticalBar.css("top", topBar + 'px');
  92. };
  93. if (leftBar && $(obj).find(".zl-horizontalBar").length) {
  94. var horizontalBar = $(obj).find(".zl-verticalBar");
  95. var maxLeft = horizontalBar.parent().width() - horizontalBar.width();
  96. if (leftBar > maxLeft) { leftBar = maxLeft; }
  97. $(obj).find(".zl-horizontalBar").css("left", leftBar + 'px');
  98. };
  99. }
  100. oldWidth = newWidth;
  101. oldHeight = newHeight;
  102. oldInnerHeight = newInnerHeight;
  103. oldInnerWidth = newInnerWidth;
  104. }
  105. }, 100);
  106. }
  107. function addTimer() {
  108. $.each(T, function(k, v) {
  109. var obj = v;
  110. var timer = "timer" + k;
  111. var oldWidth = null;
  112. var oldHeight = null;
  113. var oldInnerWidth = null;
  114. var oldInnerHeight = null;
  115. if ($(v).find(".zl-scrollContentDiv").length) { oldWidth = $(v).find(".zl-scrollContentDiv")[0].scrollWidth;
  116. oldHeight = $(v).find(".zl-scrollContentDiv")[0].scrollHeight;
  117. oldInnerWidth = $(v).find(".zl-scrollContentDiv").width();
  118. oldInnerHeight = $(v).find(".zl-scrollContentDiv").height(); } else { oldWidth = $(obj)[0].scrollWidth - parseFloat($(obj).css("padding-left"));
  119. oldHeight = $(obj)[0].scrollHeight - parseFloat($(obj).css("padding-top"));
  120. oldInnerWidth = $(obj).width();
  121. oldInnerHeight = $(obj).height(); }
  122. creatTimer(obj, oldWidth, oldHeight, oldInnerWidth, oldInnerHeight, timer);
  123. });
  124. }
  125. addTimer();
  126. function clearTimer() { $.each(T, function(index, item) { var timer = "timer" + index;
  127. clearInterval(timer); }); };
  128. this.on("mousedown", ".zl-scrollBar", function(ev) {
  129. clearTimer();
  130. var direction = null;
  131. if ($(this).hasClass("zl-verticalBar")) { direction = "0"; } else if ($(this).hasClass("zl-horizontalBar")) { direction = "1"; }
  132. var This = $(this).get(0);
  133. var height = $(this).parent().height() - $(this).height();
  134. var width = $(this).parent().width() - $(this).width();
  135. var contentDiv = $(this).parent().parent().find(".zl-scrollContentDiv").get(0);
  136. var scrollH = contentDiv.scrollHeight;
  137. var innerH = $(this).parent().parent().height();
  138. var scrollW = contentDiv.scrollWidth;
  139. var innerW = $(this).parent().parent().width();
  140. var ev = ev || event;
  141. var disY = ev.clientY - This.offsetTop;
  142. var disX = ev.clientX - This.offsetLeft;
  143. var topCount = null;
  144. var leftCount = null;
  145. switch (direction) {
  146. case "0":
  147. document.onmousemove = function(ev) {
  148. var ev = ev || event;
  149. if (ev.clientY - disY <= 0) { topCount = 0; } else
  150. if ((ev.clientY - disY) >= height) { topCount = height; } else { topCount = ev.clientY - disY; }
  151. This.style.top = topCount + "px";
  152. contentDiv.style.top = -(topCount * (scrollH - innerH) / height) + 'px';
  153. };
  154. break;
  155. case "1":
  156. document.onmousemove = function(ev) {
  157. var ev = ev || event;
  158. if (ev.clientX - disX <= 0) { leftCount = 0; } else
  159. if ((ev.clientX - disX) >= width) { leftCount = width; } else { leftCount = ev.clientX - disX; }
  160. This.style.left = leftCount + "px";
  161. contentDiv.style.left = -(leftCount * (scrollW - innerW) / width) + 'px';
  162. };
  163. break;
  164. }
  165. document.onmouseup = function() { document.onmousemove = null;
  166. document.onmouseup = null;
  167. addTimer(); };
  168. return false;
  169. });
  170. function fn(ev, a) {
  171. if (a.find(".zl-verticalBar").length) {
  172. var b = true;
  173. var height = a.find(".zl-scrollBarBox").height() - a.find(".zl-scrollBar").height();
  174. var contentDiv = a.find(".zl-scrollContentDiv").get(0);
  175. var scrollH = contentDiv.scrollHeight;
  176. var innerH = a.height();
  177. if (ev.wheelDelta) { b = ev.wheelDelta > 0 ? true : false; } else { b = ev.detail < 0 ? true : false; }
  178. var topDis = parseFloat(a.find(".zl-scrollBar").css("top"));
  179. if (b) { topDis -= settings.wheelDis; if (topDis < 0) { topDis = 0; } } else { topDis += settings.wheelDis; if (topDis > height) { topDis = height; } }
  180. a.find(".zl-scrollBar").get(0).style.top = topDis + "px";
  181. a.find(".zl-scrollContentDiv").get(0).style.top = -(topDis * (scrollH - innerH) / height) + 'px';
  182. }
  183. };
  184. T.each(function() {
  185. var oDiv = $(this).get(0);
  186. if (oDiv.addEventListener) { oDiv.addEventListener("DOMMouseScroll", function(ev) { var ev = ev || event; var $This = $(this);
  187. fn(ev, $This);
  188. ev.preventDefault(); }, false); }
  189. oDiv.onmousewheel = function(ev) { var ev = ev || event; var $This = $(this);
  190. fn(ev, $This); return false; };
  191. });
  192. return this;
  193. }
  194. });
  195. })(jQuery);