From 62f9aa3421f2e044206d4138634a9e82d480ec82 Mon Sep 17 00:00:00 2001 From: T Date: Tue, 2 Jun 2026 02:36:05 +0200 Subject: [PATCH] Fix elevator mobile --- js/elevator.js | 112 ++++++++++++++++++++++++++------------------- js/elevator.min.js | 1 - 2 files changed, 64 insertions(+), 49 deletions(-) delete mode 100644 js/elevator.min.js diff --git a/js/elevator.js b/js/elevator.js index 5fc06477..9b073ae0 100644 --- a/js/elevator.js +++ b/js/elevator.js @@ -9,7 +9,7 @@ * Elevator.js *********************************************/ -var Elevator = function(options) { +var Elevator = function (options) { 'use strict'; @@ -33,23 +33,23 @@ var Elevator = function(options) { var loopAudio; var that = this; - + /** * Utils */ // Thanks Mr Penner - http://robertpenner.com/easing/ - function easeInOutQuad( t, b, c, d ) { + function easeInOutQuad(t, b, c, d) { t /= d / 2; - if ( t < 1 ) return c / 2 * t * t + b; + if (t < 1) return c / 2 * t * t + b; t--; - return -c / 2 * ( t * ( t -2 ) - 1 ) + b; + return -c / 2 * (t * (t - 2) - 1) + b; } - function extendParameters(options, defaults){ - for( var option in defaults ){ + function extendParameters(options, defaults) { + for (var option in defaults) { var t = options[option] === undefined && typeof option !== "function"; - if(t){ + if (t) { options[option] = defaults[option]; } } @@ -58,20 +58,31 @@ var Elevator = function(options) { function getVerticalOffset(element) { var verticalOffset = 0; - while( element ){ + while (element) { verticalOffset += element.offsetTop || 0; element = element.offsetParent; } return verticalOffset; } + function getScrollTop() { + return window.pageYOffset || document.documentElement.scrollTop || body.scrollTop || 0; + } + + function playAudio(audio) { + var playPromise = audio.play(); + if (playPromise && playPromise.catch) { + playPromise.catch(() => 0); + } + } + /** * Main */ // Time is passed through requestAnimationFrame, what a world! - function animateLoop( time ) { - if ( !startTime ) { + function animateLoop(time) { + if (!startTime) { startTime = time; } @@ -80,12 +91,12 @@ var Elevator = function(options) { window.scrollTo(0, easedPosition); - if( timeSoFar < duration ) { + if (timeSoFar < duration) { animation = requestAnimationFrame(animateLoop); } else { animationFinished(); } - } + } // ELEVATE! // / @@ -100,27 +111,26 @@ var Elevator = function(options) { // C O O O D // C__O__O__O__D // [_____________] - this.elevate = function() { - - if( elevating ) { + this.elevate = function () { + if (elevating) { return; } elevating = true; - startPosition = (document.documentElement.scrollTop || body.scrollTop); + startPosition = getScrollTop(); // No custom duration set, so we travel at pixels per millisecond. (0.75px per ms) - if( !customDuration ) { + if (!customDuration) { duration = (startPosition * 1.5); } - requestAnimationFrame( animateLoop ); + requestAnimationFrame(animateLoop); loadAudio(); // Start music! - if( mainAudio ) { - mainAudio.play(); + if (mainAudio) { + playAudio(mainAudio); } }; @@ -139,25 +149,24 @@ var Elevator = function(options) { resetPositions(); // Stop music! - if( mainAudio ) { + if (mainAudio) { mainAudio.pause(); mainAudio.currentTime = 0; } - if( endAudio ) { - endAudio.play(); + if (endAudio) { + playAudio(endAudio); } } function onWindowBlur() { // If animating, go straight to the top. And play no more music. - if( elevating ) { - - cancelAnimationFrame( animation ); + if (elevating) { + cancelAnimationFrame(animation); resetPositions(); - if( mainAudio ) { + if (mainAudio) { mainAudio.pause(); mainAudio.currentTime = 0; } @@ -166,12 +175,19 @@ var Elevator = function(options) { } } - function bindElevateToElement( element ) { - if( element.addEventListener ) { - element.addEventListener('click', that.elevate, false); + function handleElevate(event) { + if (event && event.type === 'touchend') + event.preventDefault(); + that.elevate(); + } + + function bindElevateToElement(element) { + if (element.addEventListener) { + element.addEventListener('click', handleElevate, false); + element.addEventListener('touchend', handleElevate, false); } else { // Older browsers - element.attachEvent('onclick', function() { + element.attachEvent('onclick', function () { document.documentElement.scrollTop = endPosition; document.body.scrollTop = endPosition; window.scroll(0, endPosition); @@ -180,19 +196,19 @@ var Elevator = function(options) { } function loadAudio() { - if( !mainAudio && mainAudioPath ) { - mainAudio = new Audio( mainAudioPath ); - mainAudio.setAttribute( 'preload', preloadAudio ); - mainAudio.setAttribute( 'loop', loopAudio ); + if (!mainAudio && mainAudioPath) { + mainAudio = new Audio(mainAudioPath); + mainAudio.setAttribute('preload', preloadAudio); + mainAudio.setAttribute('loop', loopAudio); } - if( !endAudio && endAudioPath ) { - endAudio = new Audio( endAudioPath ); - endAudio.setAttribute( 'preload', 'auto' ); + if (!endAudio && endAudioPath) { + endAudio = new Audio(endAudioPath); + endAudio.setAttribute('preload', 'auto'); } } - function init( _options ) { + function init(_options) { // Bind to element click event, if need be. body = document.body; @@ -206,25 +222,25 @@ var Elevator = function(options) { _options = extendParameters(_options, defaults); - if( _options.elements ) { - for( var i = 0; i < _options.elements.length; i++ ) { - bindElevateToElement( _options.elements[i] ); + if (_options.elements) { + for (var i = 0; i < _options.elements.length; i++) { + bindElevateToElement(_options.elements[i]); } - } else if( _options.element ) { - bindElevateToElement( _options.element ); + } else if (_options.element) { + bindElevateToElement(_options.element); } // Take the stairs instead - if( !browserMeetsRequirements() ) { + if (!browserMeetsRequirements()) { return; } - if( _options.duration ) { + if (_options.duration) { customDuration = true; duration = _options.duration; } - if( _options.targetElement ) { + if (_options.targetElement) { endPosition = getVerticalOffset(_options.targetElement); } diff --git a/js/elevator.min.js b/js/elevator.min.js deleted file mode 100644 index 286a3da7..00000000 --- a/js/elevator.min.js +++ /dev/null @@ -1 +0,0 @@ -var Elevator=function(){"use strict";function n(n,e){for(var t in e)t in n||(n[t]=e[t]);return n}function e(n,e,t,u){return n/=u/2,1>n?t/2*n*n+e:(n--,-t/2*(n*(n-2)-1)+e)}function t(n){p||(p=n);var u=n-p,o=e(u,v,-v,A);window.scrollTo(0,o),A>u?s=requestAnimationFrame(t):i()}function u(){w||(w=!0,v=document.documentElement.scrollTop||m.scrollTop,f||(A=1.5*v),requestAnimationFrame(t),c&&c.play())}function o(){p=null,v=null,w=!1}function i(){o(),c&&(c.pause(),c.currentTime=0),d&&d.play()}function r(){w&&(cancelAnimationFrame(s),o(),c&&(c.pause(),c.currentTime=0),window.scrollTo(0,0))}function l(n){n.addEventListener("click",u,!1)}function a(n){m=document.body,n.element&&l(n.element),n.duration&&(f=!0,A=n.duration),n.mainAudio&&(c=new Audio(n.mainAudio),c.setAttribute("preload","true"),c.setAttribute("loop","true")),n.endAudio&&(d=new Audio(n.endAudio),d.setAttribute("preload","true")),window.addEventListener("blur",r,!1)}var c,d,m=null,s=null,A=null,f=!1,p=null,v=null,w=!1;return n(a,{elevate:u})}(); \ No newline at end of file