| @@ -81,29 +81,52 @@ class IHKHeader { | |||||
| initScroll() { | initScroll() { | ||||
| const t = this; | 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 () { | window.addEventListener("scroll", function () { | ||||
| if (t.scrollState.transitioning) return; | |||||
| window.requestAnimationFrame(function () { | window.requestAnimationFrame(function () { | ||||
| t.checkScroll(); | |||||
| }) | |||||
| t.checkScrollWithStateMachine(); | |||||
| }); | |||||
| }, {passive: true}); | }, {passive: true}); | ||||
| }; | |||||
| } | |||||
| checkScroll() { | |||||
| checkScrollWithStateMachine() { | |||||
| const t = this; | const t = this; | ||||
| const st = this.window.scrollTop(); | const st = this.window.scrollTop(); | ||||
| const state = t.scrollState; | |||||
| if (t.overlayOpen || $('.gallery-popup.open').length) { | if (t.overlayOpen || $('.gallery-popup.open').length) { | ||||
| return false; | 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) { | if (st > this.window.height() * 1.2) { | ||||
| this.header.addClass('show-toplink'); | this.header.addClass('show-toplink'); | ||||
| } else { | } 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() { | initToggling() { | ||||
| this.header.find('.overlay-holder').on('click touch', this.toggleNavigation.bind(this)); | this.header.find('.overlay-holder').on('click touch', this.toggleNavigation.bind(this)); | ||||
| this.header.find('.toggle-nav').on('click touch', this.toggleNavigation.bind(this)); | this.header.find('.toggle-nav').on('click touch', this.toggleNavigation.bind(this)); | ||||