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
// 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) |
|
} |