;
(function($) {
$.fn.extend({
"scrollBar": function(options) {
var settings = { barWidth: 5, position: "x,y", wheelDis: 15 };
options = $.extend(settings, options);
var horizontalDiv = '
';
var verticalDiv = '';
var T = this;
T.each(function() { $(this).attr("paddingR", $(this).css("padding-right")).attr("paddingB", $(this).css("padding-bottom")); });
function creatScrollBar(obj) {
var This = $(obj).get(0);
var paddingR = parseFloat($(obj).attr("paddingR"));
var paddingB = parseFloat($(obj).attr("paddingB"));
$(obj).css({ "padding-right": paddingR + "px", "padding-bottom": paddingB + "px", "overflow": "hidden" });
if (!($(obj).children().hasClass("zl-scrollContentDiv"))) { $(obj).wrapInner(''); };
if ($(obj).css("position") == "static") { $(obj).css({ "position": "relative" }); };
var scrollContentDiv = $(obj).find(".zl-scrollContentDiv");
var scrollH = scrollContentDiv[0].scrollHeight;
var scrollW = scrollContentDiv[0].scrollWidth;
var innerH = scrollContentDiv.height();
var innerW = scrollContentDiv.width();
var outerH = $(obj).innerHeight();
var outerW = $(obj).innerWidth();
function addVerticalBar(a) { This.style.paddingRight = paddingR + settings.barWidth + 'px';
innerH = $(a).height(); var barHeight = outerH * (innerH / scrollH);
$(a).find(".zl-scrollBarBox").remove().end().append(verticalDiv).find(".zl-verticalBar").height(barHeight); };
function addHorizontalBar(a) { This.style.paddingBottom = paddingB + settings.barWidth + 'px';
innerW = $(a).width(); var barWidth = outerW * (innerW / scrollW);
$(a).find(".zl-scrollBarBox").remove().end().append(horizontalDiv).find(".zl-horizontalBar").width(barWidth); };
switch (settings.position) {
case "x,y":
if (scrollH > innerH && scrollW > innerW) { This.style.paddingRight = paddingR + settings.barWidth + 'px';
innerH = $(obj).height();
outerH = $(obj).innerHeight(); var barHeight = (outerH - settings.barWidth) * ((innerH - settings.barWidth) / scrollH); if (!($(obj).find(".zl-verticalBar").length)) { $(obj).append(verticalDiv); };
$(obj).find(".zl-verticalBar").height(barHeight).parent().height(outerH - settings.barWidth);
This.style.paddingBottom = paddingB + settings.barWidth + 'px';
innerW = $(obj).width(); var barWidth = (outerW - settings.barWidth) * ((innerW - settings.barWidth) / scrollW); if (!($(obj).find(".zl-horizontalBar").length)) { $(obj).append(horizontalDiv); };
$(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(); }
break;
case "x":
if (scrollW > innerW) { addHorizontalBar(obj); } else { $(obj).find(".zl-scrollBarBox").remove(); }
break;
case "y":
if (scrollH > innerH) { addVerticalBar(obj); } else { $(obj).find(".zl-scrollBarBox").remove(); }
break;
};
}
function recycleThis() { T.each(function() { creatScrollBar(this); }); };
recycleThis();
function creatTimer(obj, oldWidth, oldHeight, oldInnerWidth, oldInnerHeight, timer) {
timer = setInterval(function() {
var newWidth = null;
var newHeight = null;
var newInnerWidth = null;
var newInnerHeight = null;
var topDiv = null;
var leftDiv = null;
var topBar = null;
var leftBar = null;
var scrollContentDiv = $(obj).find(".zl-scrollContentDiv");
if (scrollContentDiv.length) { newWidth = scrollContentDiv[0].scrollWidth;
newHeight = scrollContentDiv[0].scrollHeight;
newInnerWidth = scrollContentDiv.width();
newInnerHeight = scrollContentDiv.height(); } else { newWidth = $(obj)[0].scrollWidth - parseFloat($(obj).css("padding-left"));
newHeight = $(obj)[0].scrollHeight - parseFloat($(obj).css("padding-top"));
newInnerWidth = $(obj).width();
newInnerHeight = $(obj).height(); };
if (newWidth != oldWidth || newHeight != oldHeight || newInnerWidth != oldInnerWidth || newInnerHeight != oldInnerHeight) {
if (scrollContentDiv.length) { topDiv = parseFloat(scrollContentDiv.css("top"));
leftDiv = parseFloat(scrollContentDiv.css("left")); };
if ($(obj).find(".zl-verticalBar").length) { topBar = parseFloat($(obj).find(".zl-verticalBar").css("top")); };
if ($(obj).find(".zl-horizontalBar").length) { leftBar = parseFloat($(obj).find(".zl-horizontalBar").css("left")); };
creatScrollBar(obj);
if ($(obj).find(".zl-scrollBarBox").length) {
if (topDiv) {
var maxTopBox = scrollContentDiv[0].scrollHeight - $(obj).height();
var maxLeftBox = scrollContentDiv[0].scrollWidth - $(obj).width();
if (-leftDiv > maxLeftBox) { leftDiv = -maxLeftBox; }
if (-topDiv > maxTopBox) { topDiv = -maxTopBox; }
scrollContentDiv.css({ "left": leftDiv + 'px', "top": topDiv + 'px' });
};
if (topBar && $(obj).find(".zl-verticalBar").length) {
var verticalBar = $(obj).find(".zl-verticalBar");
var maxTop = verticalBar.parent().height() - verticalBar.height();
if (topBar > maxTop) { topBar = maxTop; }
verticalBar.css("top", topBar + 'px');
};
if (leftBar && $(obj).find(".zl-horizontalBar").length) {
var horizontalBar = $(obj).find(".zl-verticalBar");
var maxLeft = horizontalBar.parent().width() - horizontalBar.width();
if (leftBar > maxLeft) { leftBar = maxLeft; }
$(obj).find(".zl-horizontalBar").css("left", leftBar + 'px');
};
}
oldWidth = newWidth;
oldHeight = newHeight;
oldInnerHeight = newInnerHeight;
oldInnerWidth = newInnerWidth;
}
}, 100);
}
function addTimer() {
$.each(T, function(k, v) {
var obj = v;
var timer = "timer" + k;
var oldWidth = null;
var oldHeight = null;
var oldInnerWidth = null;
var oldInnerHeight = null;
if ($(v).find(".zl-scrollContentDiv").length) { oldWidth = $(v).find(".zl-scrollContentDiv")[0].scrollWidth;
oldHeight = $(v).find(".zl-scrollContentDiv")[0].scrollHeight;
oldInnerWidth = $(v).find(".zl-scrollContentDiv").width();
oldInnerHeight = $(v).find(".zl-scrollContentDiv").height(); } else { oldWidth = $(obj)[0].scrollWidth - parseFloat($(obj).css("padding-left"));
oldHeight = $(obj)[0].scrollHeight - parseFloat($(obj).css("padding-top"));
oldInnerWidth = $(obj).width();
oldInnerHeight = $(obj).height(); }
creatTimer(obj, oldWidth, oldHeight, oldInnerWidth, oldInnerHeight, timer);
});
}
addTimer();
function clearTimer() { $.each(T, function(index, item) { var timer = "timer" + index;
clearInterval(timer); }); };
this.on("mousedown", ".zl-scrollBar", function(ev) {
clearTimer();
var direction = null;
if ($(this).hasClass("zl-verticalBar")) { direction = "0"; } else if ($(this).hasClass("zl-horizontalBar")) { direction = "1"; }
var This = $(this).get(0);
var height = $(this).parent().height() - $(this).height();
var width = $(this).parent().width() - $(this).width();
var contentDiv = $(this).parent().parent().find(".zl-scrollContentDiv").get(0);
var scrollH = contentDiv.scrollHeight;
var innerH = $(this).parent().parent().height();
var scrollW = contentDiv.scrollWidth;
var innerW = $(this).parent().parent().width();
var ev = ev || event;
var disY = ev.clientY - This.offsetTop;
var disX = ev.clientX - This.offsetLeft;
var topCount = null;
var leftCount = null;
switch (direction) {
case "0":
document.onmousemove = function(ev) {
var ev = ev || event;
if (ev.clientY - disY <= 0) { topCount = 0; } else
if ((ev.clientY - disY) >= height) { topCount = height; } else { topCount = ev.clientY - disY; }
This.style.top = topCount + "px";
contentDiv.style.top = -(topCount * (scrollH - innerH) / height) + 'px';
};
break;
case "1":
document.onmousemove = function(ev) {
var ev = ev || event;
if (ev.clientX - disX <= 0) { leftCount = 0; } else
if ((ev.clientX - disX) >= width) { leftCount = width; } else { leftCount = ev.clientX - disX; }
This.style.left = leftCount + "px";
contentDiv.style.left = -(leftCount * (scrollW - innerW) / width) + 'px';
};
break;
}
document.onmouseup = function() { document.onmousemove = null;
document.onmouseup = null;
addTimer(); };
return false;
});
function fn(ev, a) {
if (a.find(".zl-verticalBar").length) {
var b = true;
var height = a.find(".zl-scrollBarBox").height() - a.find(".zl-scrollBar").height();
var contentDiv = a.find(".zl-scrollContentDiv").get(0);
var scrollH = contentDiv.scrollHeight;
var innerH = a.height();
if (ev.wheelDelta) { b = ev.wheelDelta > 0 ? true : false; } else { b = ev.detail < 0 ? true : false; }
var topDis = parseFloat(a.find(".zl-scrollBar").css("top"));
if (b) { topDis -= settings.wheelDis; if (topDis < 0) { topDis = 0; } } else { topDis += settings.wheelDis; if (topDis > height) { topDis = height; } }
a.find(".zl-scrollBar").get(0).style.top = topDis + "px";
a.find(".zl-scrollContentDiv").get(0).style.top = -(topDis * (scrollH - innerH) / height) + 'px';
}
};
T.each(function() {
var oDiv = $(this).get(0);
if (oDiv.addEventListener) { oDiv.addEventListener("DOMMouseScroll", function(ev) { var ev = ev || event; var $This = $(this);
fn(ev, $This);
ev.preventDefault(); }, false); }
oDiv.onmousewheel = function(ev) { var ev = ev || event; var $This = $(this);
fn(ev, $This); return false; };
});
return this;
}
});
})(jQuery);