You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

193 lines
9.5 KiB
JavaScript

/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
*
* Version: 1.3.2
*
*/
!
function (e) {
jQuery.fn.extend({
slimScroll: function (i) {
var o = {
width: "auto",
height: "250px",
size: "7px",
color: "#000",
position: "right",
distance: "1px",
start: "top",
opacity: .4,
alwaysVisible: !1,
disableFadeOut: !1,
railVisible: !1,
railColor: "#333",
railOpacity: .2,
railDraggable: !0,
railClass: "slimScrollRail",
barClass: "slimScrollBar",
wrapperClass: "slimScrollDiv",
allowPageScroll: !1,
wheelStep: 20,
touchScrollStep: 200,
borderRadius: "7px",
railBorderRadius: "7px",
animate: !0
},
a = e.extend(o, i);
return this.each(function () {
function o(t) {
if (u) {
var t = t || window.event,
i = 0;
t.wheelDelta && (i = -t.wheelDelta / 120), t.detail && (i = t.detail / 3);
var o = t.target || t.srcTarget || t.srcElement;
e(o).closest("." + a.wrapperClass).is(S.parent()) && r(i, !0), t.preventDefault && !y && t.preventDefault(), y || (t.returnValue = !1)
}
}
function r(e, t, i) {
y = !1;
var o = e,
r = S.outerHeight() - M.outerHeight();
if (t && (o = parseInt(M.css("top")) + e * parseInt(a.wheelStep) / 100 * M.outerHeight(), o = Math.min(Math.max(o, 0), r), o = e > 0 ? Math.ceil(o) : Math.floor(o), M.css({
top: o + "px"
})), v = parseInt(M.css("top")) / (S.outerHeight() - M.outerHeight()), o = v * (S[0].scrollHeight - S.outerHeight()), i) {
o = e;
var s = o / S[0].scrollHeight * S.outerHeight();
s = Math.min(Math.max(s, 0), r), M.css({
top: s + "px"
})
}
"scrollTo" in a && a.animate ? S.animate({
scrollTop: o
}) : S.scrollTop(o), S.trigger("slimscrolling", ~~o), l(), c()
}
function s() {
window.addEventListener ? (this.addEventListener("DOMMouseScroll", o, !1), this.addEventListener("mousewheel", o, !1)) : document.attachEvent("onmousewheel", o)
}
function n() {
f = Math.max(S.outerHeight() / S[0].scrollHeight * S.outerHeight(), m), M.css({
height: f + "px"
});
var e = f == S.outerHeight() ? "none" : "block";
M.css({
display: e
})
}
function l() {
if (n(), clearTimeout(p), v == ~~v) {
if (y = a.allowPageScroll, b != v) {
var e = 0 == ~~v ? "top" : "bottom";
S.trigger("slimscroll", e)
}
} else y = !1;
return b = v, f >= S.outerHeight() ? void(y = !0) : (M.stop(!0, !0).fadeIn("fast"), void(a.railVisible && H.stop(!0, !0).fadeIn("fast")))
}
function c() {
a.alwaysVisible || (p = setTimeout(function () {
a.disableFadeOut && u || h || d || (M.fadeOut("slow"), H.fadeOut("slow"))
}, 1e3))
}
var u, h, d, p, g, f, v, b, w = "<div></div>",
m = 30,
y = !1,
S = e(this);
if ("ontouchstart" in window && window.navigator.msPointerEnabled && S.css("-ms-touch-action", "none"), S.parent().hasClass(a.wrapperClass)) {
var E = S.scrollTop();
if (M = S.parent().find("." + a.barClass), H = S.parent().find("." + a.railClass), n(), e.isPlainObject(i)) {
if ("height" in i && "auto" == i.height) {
S.parent().css("height", "auto"), S.css("height", "auto");
var x = S.parent().parent().height();
S.parent().css("height", x), S.css("height", x)
}
if ("scrollTo" in i) E = parseInt(a.scrollTo);
else if ("scrollBy" in i) E += parseInt(a.scrollBy);
else if ("destroy" in i) return M.remove(), H.remove(), void S.unwrap();
r(E, !1, !0)
}
} else {
a.height = "auto" == i.height ? S.parent().height() : i.height;
var C = e(w).addClass(a.wrapperClass).css({
position: "relative",
overflow: "hidden",
width: a.width,
height: a.height
});
S.css({
overflow: "hidden",
width: a.width,
height: a.height
});
var H = e(w).addClass(a.railClass).css({
width: a.size,
height: "100%",
position: "absolute",
top: 0,
display: a.alwaysVisible && a.railVisible ? "block" : "none",
"border-radius": a.railBorderRadius,
background: a.railColor,
opacity: a.railOpacity,
zIndex: 90
}),
M = e(w).addClass(a.barClass).css({
background: a.color,
width: a.size,
position: "absolute",
top: 0,
opacity: a.opacity,
display: a.alwaysVisible ? "block" : "none",
"border-radius": a.borderRadius,
BorderRadius: a.borderRadius,
MozBorderRadius: a.borderRadius,
WebkitBorderRadius: a.borderRadius,
zIndex: 99
}),
D = "right" == a.position ? {
right: a.distance
} : {
left: a.distance
};
H.css(D), M.css(D), S.wrap(C), S.parent().append(M), S.parent().append(H), a.railDraggable && M.bind("mousedown", function (i) {
var o = e(document);
return d = !0, t = parseFloat(M.css("top")), pageY = i.pageY, o.bind("mousemove.slimscroll", function (e) {
currTop = t + e.pageY - pageY, M.css("top", currTop), r(0, M.position().top, !1)
}), o.bind("mouseup.slimscroll", function () {
d = !1, c(), o.unbind(".slimscroll")
}), !1
}).bind("selectstart.slimscroll", function (e) {
return e.stopPropagation(), e.preventDefault(), !1
}), "ontouchstart" in window && window.navigator.msPointerEnabled && (S.bind("MSPointerDown", function (e) {
g = e.originalEvent.pageY
}), S.bind("MSPointerMove", function (e) {
e.originalEvent.preventDefault();
var t = (g - e.originalEvent.pageY) / a.touchScrollStep;
r(t, !0), g = e.originalEvent.pageY
})), H.hover(function () {
l()
}, function () {
c()
}), M.hover(function () {
h = !0
}, function () {
h = !1
}), S.hover(function () {
u = !0, l(), c()
}, function () {
u = !1, c()
}), S.bind("touchstart", function (e) {
e.originalEvent.touches.length && (g = e.originalEvent.touches[0].pageY)
}), S.bind("touchmove", function (e) {
if (y || e.originalEvent.preventDefault(), e.originalEvent.touches.length) {
var t = (g - e.originalEvent.touches[0].pageY) / a.touchScrollStep;
r(t, !0), g = e.originalEvent.touches[0].pageY
}
}), n(), "bottom" === a.start ? (M.css({
top: S.outerHeight() - M.outerHeight()
}), r(0, !0)) : "top" !== a.start && (r(e(a.start).position().top, null, !0), a.alwaysVisible || M.hide()), s()
}
}), this
}
}), jQuery.fn.extend({
slimscroll: jQuery.fn.slimScroll
})
}(jQuery);