1
0
mirror of https://github.com/meineerde/holgerjust.de.git synced 2025-10-17 17:01:01 +00:00

105 lines
3.4 KiB
JavaScript

(function() {
domready(function () {
document.querySelectorAll('.menu-button, .nav-cover, .nav-close').forEach(function(element) {
element.addEventListener('click', function(event) {
event.preventDefault();
var body_classes = document.body.className.split(' ');
["nav-opened", "nav-closed"].forEach(function(klass){
var i = body_classes.indexOf(klass);
i >= 0 ? body_classes.splice(i, 1) : body_classes.push(klass);
});
document.body.className = body_classes.join(' ');
});
});
});
// slightly adapted from http://stackoverflow.com/a/26798337/421705
window.requestAnimFrame = (function(){
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
function( callback ){
window.setTimeout(callback, 1000 / 60);
};
})();
function scrollToY(scrollTargetY, speed, easing) {
// scrollTargetY: the target scrollY property of the window
// speed: time in pixels per second
// easing: easing equation to use
var scrollY = window.scrollY,
scrollTargetY = scrollTargetY || 0,
speed = speed || 2000,
easing = easing || 'easeOutSine',
currentTime = 0;
// min time .1, max time .8 seconds
var time = Math.max(.1, Math.min(Math.abs(scrollY - scrollTargetY) / speed, .8));
// easing equations from https://github.com/danro/easing-js/blob/master/easing.js
var PI_D2 = Math.PI / 2,
easingEquations = {
easeOutSine: function (pos) {
return Math.sin(pos * (Math.PI / 2));
},
easeInOutSine: function (pos) {
return (-0.5 * (Math.cos(Math.PI * pos) - 1));
},
easeInOutQuint: function (pos) {
if ((pos /= 0.5) < 1) {
return 0.5 * Math.pow(pos, 5);
}
return 0.5 * (Math.pow((pos - 2), 5) + 2);
},
easeOutQuint: function(pos) {
return (Math.pow((pos-1), 5) +1);
},
};
// add animation loop
function tick() {
currentTime += 1 / 60;
var p = currentTime / time;
var t = easingEquations[easing](p);
if (p < 1) {
requestAnimFrame(tick);
window.scrollTo(0, scrollY + ((scrollTargetY - scrollY) * t));
} else {
window.scrollTo(0, scrollTargetY);
}
}
// call it once to get started
tick();
}
domready(function () {
document.querySelectorAll('.scroll-down').forEach(function(element) {
element.addEventListener('click', function(event) {
event.preventDefault();
var speed = 500,
offset = this.getAttribute('data-offset') ? this.getAttribute('data-offset') : false,
position = this.getAttribute('data-position') ? this.getAttribute('data-position') : false,
toMove;
var elementBottom = this.getBoundingClientRect().bottom + window.pageYOffset - (document.clientTop || 0);
if (offset) {
toMove = parseInt(offset);
scrollToY(elementBottom + toMove, speed, 'easeOutQuint')
} else if (position) {
toMove = parseInt(position);
scrollToY(toMove, speed, 'easeOutQuint')
} else {
scrollToY(elementBottom, speed, 'easeOutQuint')
}
});
});
});
})();