;
(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);