mirror of https://github.com/juliancwirko/abc.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
303 lines
6.4 KiB
303 lines
6.4 KiB
10 years ago
|
// SmoothScroll v0.9.9
|
||
|
// Licensed under the terms of the MIT license.
|
||
|
// People involved
|
||
|
// - Balazs Galambosi: maintainer (CHANGELOG.txt)
|
||
|
// - Patrick Brunner (patrickb1991@gmail.com)
|
||
|
// - Michael Herf: ssc_pulse Algorithm
|
||
|
|
||
|
function ssc_init() {
|
||
|
if (!document.body) return;
|
||
|
var e = document.body;
|
||
|
var t = document.documentElement;
|
||
|
var n = window.innerHeight;
|
||
|
var r = e.scrollHeight;
|
||
|
ssc_root = document.compatMode.indexOf("CSS") >= 0 ? t : e;
|
||
|
ssc_activeElement = e;
|
||
|
ssc_initdone = true;
|
||
|
if (top != self) {
|
||
|
ssc_frame = true
|
||
|
} else if (r > n && (e.offsetHeight <= n || t.offsetHeight <= n)) {
|
||
|
ssc_root.style.height = "auto";
|
||
|
if (ssc_root.offsetHeight <= n) {
|
||
|
var i = document.createElement("div");
|
||
|
i.style.clear = "both";
|
||
|
e.appendChild(i)
|
||
|
}
|
||
|
}
|
||
|
if (!ssc_fixedback) {
|
||
|
e.style.backgroundAttachment = "scroll";
|
||
|
t.style.backgroundAttachment = "scroll"
|
||
|
}
|
||
|
if (ssc_keyboardsupport) {
|
||
|
ssc_addEvent("keydown", ssc_keydown)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function ssc_scrollArray(e, t, n, r) {
|
||
|
r || (r = 1e3);
|
||
|
ssc_directionCheck(t, n);
|
||
|
ssc_que.push({
|
||
|
x: t,
|
||
|
y: n,
|
||
|
lastX: t < 0 ? .99 : -.99,
|
||
|
lastY: n < 0 ? .99 : -.99,
|
||
|
start: +(new Date)
|
||
|
});
|
||
|
if (ssc_pending) {
|
||
|
return
|
||
|
}
|
||
|
var i = function() {
|
||
|
var s = +(new Date);
|
||
|
var o = 0;
|
||
|
var u = 0;
|
||
|
for (var a = 0; a < ssc_que.length; a++) {
|
||
|
var f = ssc_que[a];
|
||
|
var l = s - f.start;
|
||
|
var c = l >= ssc_animtime;
|
||
|
var h = c ? 1 : l / ssc_animtime;
|
||
|
if (ssc_pulseAlgorithm) {
|
||
|
h = ssc_pulse(h)
|
||
|
}
|
||
|
var p = f.x * h - f.lastX >> 0;
|
||
|
var d = f.y * h - f.lastY >> 0;
|
||
|
o += p;
|
||
|
u += d;
|
||
|
f.lastX += p;
|
||
|
f.lastY += d;
|
||
|
if (c) {
|
||
|
ssc_que.splice(a, 1);
|
||
|
a--
|
||
|
}
|
||
|
}
|
||
|
if (t) {
|
||
|
var v = e.scrollLeft;
|
||
|
e.scrollLeft += o;
|
||
|
if (o && e.scrollLeft === v) {
|
||
|
t = 0
|
||
|
}
|
||
|
}
|
||
|
if (n) {
|
||
|
var m = e.scrollTop;
|
||
|
e.scrollTop += u;
|
||
|
if (u && e.scrollTop === m) {
|
||
|
n = 0
|
||
|
}
|
||
|
}
|
||
|
if (!t && !n) {
|
||
|
ssc_que = []
|
||
|
}
|
||
|
if (ssc_que.length) {
|
||
|
setTimeout(i, r / ssc_framerate + 1)
|
||
|
} else {
|
||
|
ssc_pending = false
|
||
|
}
|
||
|
};
|
||
|
setTimeout(i, 0);
|
||
|
ssc_pending = true
|
||
|
}
|
||
|
|
||
|
function ssc_wheel(e) {
|
||
|
if (!ssc_initdone) {
|
||
|
ssc_init()
|
||
|
}
|
||
|
var t = e.target;
|
||
|
var n = ssc_overflowingAncestor(t);
|
||
|
if (!n || e.defaultPrevented || ssc_isNodeName(ssc_activeElement, "embed") || ssc_isNodeName(t, "embed") && /\.pdf/i.test(t.src)) {
|
||
|
return true
|
||
|
}
|
||
|
var r = e.wheelDeltaX || 0;
|
||
|
var i = e.wheelDeltaY || 0;
|
||
|
if (!r && !i) {
|
||
|
i = e.wheelDelta || 0
|
||
|
}
|
||
|
if (Math.abs(r) > 1.2) {
|
||
|
r *= ssc_stepsize / 120
|
||
|
}
|
||
|
if (Math.abs(i) > 1.2) {
|
||
|
i *= ssc_stepsize / 120
|
||
|
}
|
||
|
ssc_scrollArray(n, -r, -i);
|
||
|
e.preventDefault()
|
||
|
}
|
||
|
|
||
|
function ssc_keydown(e) {
|
||
|
var t = e.target;
|
||
|
var n = e.ctrlKey || e.altKey || e.metaKey;
|
||
|
if (/input|textarea|embed/i.test(t.nodeName) || t.isContentEditable || e.defaultPrevented || n) {
|
||
|
return true
|
||
|
}
|
||
|
if (ssc_isNodeName(t, "button") && e.keyCode === ssc_key.spacebar) {
|
||
|
return true
|
||
|
}
|
||
|
var r, i = 0,
|
||
|
s = 0;
|
||
|
var o = ssc_overflowingAncestor(ssc_activeElement);
|
||
|
var u = o.clientHeight;
|
||
|
if (o == document.body) {
|
||
|
u = window.innerHeight
|
||
|
}
|
||
|
switch (e.keyCode) {
|
||
|
case ssc_key.up:
|
||
|
s = -ssc_arrowscroll;
|
||
|
break;
|
||
|
case ssc_key.down:
|
||
|
s = ssc_arrowscroll;
|
||
|
break;
|
||
|
case ssc_key.spacebar:
|
||
|
r = e.shiftKey ? 1 : -1;
|
||
|
s = -r * u * .9;
|
||
|
break;
|
||
|
case ssc_key.pageup:
|
||
|
s = -u * .9;
|
||
|
break;
|
||
|
case ssc_key.pagedown:
|
||
|
s = u * .9;
|
||
|
break;
|
||
|
case ssc_key.home:
|
||
|
s = -o.scrollTop;
|
||
|
break;
|
||
|
case ssc_key.end:
|
||
|
var a = o.scrollHeight - o.scrollTop - u;
|
||
|
s = a > 0 ? a + 10 : 0;
|
||
|
break;
|
||
|
case ssc_key.left:
|
||
|
i = -ssc_arrowscroll;
|
||
|
break;
|
||
|
case ssc_key.right:
|
||
|
i = ssc_arrowscroll;
|
||
|
break;
|
||
|
default:
|
||
|
return true
|
||
|
}
|
||
|
ssc_scrollArray(o, i, s);
|
||
|
e.preventDefault()
|
||
|
}
|
||
|
|
||
|
function ssc_mousedown(e) {
|
||
|
ssc_activeElement = e.target
|
||
|
}
|
||
|
|
||
|
function ssc_setCache(e, t) {
|
||
|
for (var n = e.length; n--;) ssc_cache[ssc_uniqueID(e[n])] = t;
|
||
|
return t
|
||
|
}
|
||
|
|
||
|
function ssc_overflowingAncestor(e) {
|
||
|
var t = [];
|
||
|
var n = ssc_root.scrollHeight;
|
||
|
do {
|
||
|
var r = ssc_cache[ssc_uniqueID(e)];
|
||
|
if (r) {
|
||
|
return ssc_setCache(t, r)
|
||
|
}
|
||
|
t.push(e);
|
||
|
if (n === e.scrollHeight) {
|
||
|
if (!ssc_frame || ssc_root.clientHeight + 10 < n) {
|
||
|
return ssc_setCache(t, document.body)
|
||
|
}
|
||
|
} else if (e.clientHeight + 10 < e.scrollHeight) {
|
||
|
overflow = getComputedStyle(e, "").getPropertyValue("overflow");
|
||
|
if (overflow === "scroll" || overflow === "auto") {
|
||
|
return ssc_setCache(t, e)
|
||
|
}
|
||
|
}
|
||
|
} while (e = e.parentNode)
|
||
|
}
|
||
|
|
||
|
function ssc_addEvent(e, t, n) {
|
||
|
window.addEventListener(e, t, n || false)
|
||
|
}
|
||
|
|
||
|
function ssc_removeEvent(e, t, n) {
|
||
|
window.removeEventListener(e, t, n || false)
|
||
|
}
|
||
|
|
||
|
function ssc_isNodeName(e, t) {
|
||
|
return e.nodeName.toLowerCase() === t.toLowerCase()
|
||
|
}
|
||
|
|
||
|
function ssc_directionCheck(e, t) {
|
||
|
e = e > 0 ? 1 : -1;
|
||
|
t = t > 0 ? 1 : -1;
|
||
|
if (ssc_direction.x !== e || ssc_direction.y !== t) {
|
||
|
ssc_direction.x = e;
|
||
|
ssc_direction.y = t;
|
||
|
ssc_que = []
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function ssc_pulse_(e) {
|
||
|
var t, n, r;
|
||
|
e = e * ssc_pulseScale;
|
||
|
if (e < 1) {
|
||
|
t = e - (1 - Math.exp(-e))
|
||
|
} else {
|
||
|
n = Math.exp(-1);
|
||
|
e -= 1;
|
||
|
r = 1 - Math.exp(-e);
|
||
|
t = n + r * (1 - n)
|
||
|
}
|
||
|
return t * ssc_pulseNormalize
|
||
|
}
|
||
|
|
||
|
function ssc_pulse(e) {
|
||
|
if (e >= 1) return 1;
|
||
|
if (e <= 0) return 0;
|
||
|
if (ssc_pulseNormalize == 1) {
|
||
|
ssc_pulseNormalize /= ssc_pulse_(1)
|
||
|
}
|
||
|
return ssc_pulse_(e)
|
||
|
}
|
||
|
|
||
|
var ssc_framerate = 150;
|
||
|
var ssc_animtime = 500;
|
||
|
var ssc_stepsize = 150;
|
||
|
var ssc_pulseAlgorithm = true;
|
||
|
var ssc_pulseScale = 6;
|
||
|
var ssc_pulseNormalize = 1;
|
||
|
var ssc_keyboardsupport = true;
|
||
|
var ssc_arrowscroll = 50;
|
||
|
var ssc_frame = false;
|
||
|
var ssc_direction = {
|
||
|
x: 0,
|
||
|
y: 0
|
||
|
};
|
||
|
|
||
|
var ssc_initdone = false;
|
||
|
var ssc_fixedback = true;
|
||
|
var ssc_root = document.documentElement;
|
||
|
var ssc_activeElement;
|
||
|
var ssc_key = {
|
||
|
left: 37,
|
||
|
up: 38,
|
||
|
right: 39,
|
||
|
down: 40,
|
||
|
spacebar: 32,
|
||
|
pageup: 33,
|
||
|
pagedown: 34,
|
||
|
end: 35,
|
||
|
home: 36
|
||
|
};
|
||
|
|
||
|
var ssc_que = [];
|
||
|
var ssc_pending = false;
|
||
|
var ssc_cache = {};
|
||
|
|
||
|
setInterval(function() {
|
||
|
ssc_cache = {}
|
||
|
}, 10 * 1e3);
|
||
|
|
||
|
var ssc_uniqueID = function() {
|
||
|
var e = 0;
|
||
|
return function(t) {
|
||
|
return t.ssc_uniqueID || (t.ssc_uniqueID = e++)
|
||
|
}
|
||
|
}();
|
||
|
|
||
|
var ischrome = /chrome/.test(navigator.userAgent.toLowerCase());
|
||
|
|
||
|
if (ischrome) {
|
||
|
ssc_addEvent("mousedown", ssc_mousedown);
|
||
|
ssc_addEvent("mousewheel", ssc_wheel);
|
||
|
ssc_addEvent("load", ssc_init)
|
||
|
}
|