mirror of
				https://github.com/dawidolko/Website-Templates.git
				synced 2025-10-27 16:03:10 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			303 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			303 lines
		
	
	
		
			6.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // 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)
 | |
| } |