|
|
|
@@ -81,29 +81,52 @@ class IHKHeader { |
|
|
|
initScroll() { |
|
|
|
const t = this; |
|
|
|
|
|
|
|
// State Machine für Scroll-Verhalten |
|
|
|
t.scrollState = { |
|
|
|
current: 'top', // 'top', 'scrolling-down', 'scrolled', 'scrolling-up' |
|
|
|
lastPosition: 0, |
|
|
|
transitioning: false |
|
|
|
}; |
|
|
|
|
|
|
|
window.addEventListener("scroll", function () { |
|
|
|
if (t.scrollState.transitioning) return; |
|
|
|
|
|
|
|
window.requestAnimationFrame(function () { |
|
|
|
t.checkScroll(); |
|
|
|
}) |
|
|
|
t.checkScrollWithStateMachine(); |
|
|
|
}); |
|
|
|
}, {passive: true}); |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
checkScroll() { |
|
|
|
checkScrollWithStateMachine() { |
|
|
|
const t = this; |
|
|
|
const st = this.window.scrollTop(); |
|
|
|
const state = t.scrollState; |
|
|
|
|
|
|
|
if (t.overlayOpen || $('.gallery-popup.open').length) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
if (st > 59) { |
|
|
|
this.header.addClass('scrolled'); |
|
|
|
this.body.addClass('header-scrolled'); |
|
|
|
} else { |
|
|
|
this.header.removeClass('scrolled'); |
|
|
|
this.body.removeClass('header-scrolled'); |
|
|
|
const delta = st - state.lastPosition; |
|
|
|
const isScrollingDown = delta > 0; |
|
|
|
const isScrollingUp = delta < 0; |
|
|
|
|
|
|
|
switch (state.current) { |
|
|
|
case 'top': |
|
|
|
if (st > 100 && isScrollingDown) { |
|
|
|
t.transitionTo('scrolled'); |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
case 'scrolled': |
|
|
|
if (st < 30 && isScrollingUp) { |
|
|
|
t.transitionTo('top'); |
|
|
|
} |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
state.lastPosition = st; |
|
|
|
|
|
|
|
// Toplink logic |
|
|
|
if (st > this.window.height() * 1.2) { |
|
|
|
this.header.addClass('show-toplink'); |
|
|
|
} else { |
|
|
|
@@ -111,6 +134,26 @@ class IHKHeader { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
transitionTo(newState) { |
|
|
|
const t = this; |
|
|
|
t.scrollState.transitioning = true; |
|
|
|
|
|
|
|
if (newState === 'scrolled') { |
|
|
|
this.header.addClass('scrolled'); |
|
|
|
this.body.addClass('header-scrolled'); |
|
|
|
} else if (newState === 'top') { |
|
|
|
this.header.removeClass('scrolled'); |
|
|
|
this.body.removeClass('header-scrolled'); |
|
|
|
} |
|
|
|
|
|
|
|
t.scrollState.current = newState; |
|
|
|
|
|
|
|
// Transition Lock |
|
|
|
setTimeout(() => { |
|
|
|
t.scrollState.transitioning = false; |
|
|
|
}, 150); |
|
|
|
} |
|
|
|
|
|
|
|
initToggling() { |
|
|
|
this.header.find('.overlay-holder').on('click touch', this.toggleNavigation.bind(this)); |
|
|
|
this.header.find('.toggle-nav').on('click touch', this.toggleNavigation.bind(this)); |
|
|
|
|