Create elevator.js
This commit is contained in:
		
							
								
								
									
										184
									
								
								js/elevator.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										184
									
								
								js/elevator.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,184 @@ | |||||||
|  | /*! | ||||||
|  |  * Elevator.js | ||||||
|  |  * | ||||||
|  |  * MIT licensed | ||||||
|  |  * Copyright (C) 2015 Tim Holman, http://tholman.com | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | /********************************************* | ||||||
|  |  * Elevator.js | ||||||
|  |  *********************************************/ | ||||||
|  |  | ||||||
|  | var Elevator = (function() { | ||||||
|  |  | ||||||
|  |     'use strict'; | ||||||
|  |  | ||||||
|  |     // Elements | ||||||
|  |     var body = null; | ||||||
|  |  | ||||||
|  |     // Scroll vars | ||||||
|  |     var animation = null; | ||||||
|  |     var duration = null; // ms | ||||||
|  |     var customDuration = false; | ||||||
|  |     var startTime = null; | ||||||
|  |     var startPosition = null; | ||||||
|  |  | ||||||
|  |     var mainAudio; | ||||||
|  |     var endAudio; | ||||||
|  |  | ||||||
|  |     var elevating = false; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Utils | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     // Soft object augmentation | ||||||
|  |     function extend( target, source ) { | ||||||
|  |         for ( var key in source ) { | ||||||
|  |             if ( !( key in target ) ) { | ||||||
|  |                 target[ key ] = source[ key ]; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return target; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     // Thanks Mr Penner - http://robertpenner.com/easing/ | ||||||
|  |     function easeInOutQuad( t, b, c, d ) { | ||||||
|  |         t /= d/2; | ||||||
|  |         if (t < 1) return c/2*t*t + b; | ||||||
|  |         t--; | ||||||
|  |         return -c/2 * (t*(t-2) - 1) + b; | ||||||
|  |     }; | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * Main | ||||||
|  |      */ | ||||||
|  |  | ||||||
|  |     // Time is passed through requestAnimationFrame, what a world! | ||||||
|  |     function animateLoop( time ) { | ||||||
|  |         if (!startTime) { | ||||||
|  |             startTime = time; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         var timeSoFar = time - startTime; | ||||||
|  |         var easedPosition = easeInOutQuad(timeSoFar, startPosition, -startPosition, duration);                         | ||||||
|  |          | ||||||
|  |         window.scrollTo(0, easedPosition); | ||||||
|  |  | ||||||
|  |         if( timeSoFar < duration ) { | ||||||
|  |             animation = requestAnimationFrame(animateLoop); | ||||||
|  |         } else { | ||||||
|  |             animationFinished(); | ||||||
|  |         } | ||||||
|  |    }; | ||||||
|  |  | ||||||
|  | //            ELEVATE! | ||||||
|  | //              / | ||||||
|  | //         ____ | ||||||
|  | //       .'    '=====<0 | ||||||
|  | //       |======| | ||||||
|  | //       |======| | ||||||
|  | //       [IIIIII[\--() | ||||||
|  | //       |_______| | ||||||
|  | //       C O O O D | ||||||
|  | //      C O  O  O D | ||||||
|  | //     C  O  O  O  D | ||||||
|  | //     C__O__O__O__D | ||||||
|  | //    [_____________] | ||||||
|  |     function elevate() { | ||||||
|  |  | ||||||
|  |         if( elevating ) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         elevating = true; | ||||||
|  |         startPosition = (document.documentElement.scrollTop || body.scrollTop); | ||||||
|  |          | ||||||
|  |         // No custom duration set, so we travel at pixels per millisecond. (0.75px per ms) | ||||||
|  |         if( !customDuration ) { | ||||||
|  |             duration = (startPosition * 1.5); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         requestAnimationFrame( animateLoop ); | ||||||
|  |  | ||||||
|  |         // Start music! | ||||||
|  |         if( mainAudio ) { | ||||||
|  |             mainAudio.play(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function resetPositions() { | ||||||
|  |         startTime = null; | ||||||
|  |         startPosition = null; | ||||||
|  |         elevating = false; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function animationFinished() { | ||||||
|  |          | ||||||
|  |         resetPositions(); | ||||||
|  |  | ||||||
|  |         // Stop music! | ||||||
|  |         if( mainAudio ) { | ||||||
|  |             mainAudio.pause(); | ||||||
|  |             mainAudio.currentTime = 0; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if( endAudio ) { | ||||||
|  |             endAudio.play(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function onWindowBlur() { | ||||||
|  |  | ||||||
|  |         // If animating, go straight to the top. And play no more music. | ||||||
|  |         if( elevating ) { | ||||||
|  |  | ||||||
|  |             cancelAnimationFrame( animation ); | ||||||
|  |             resetPositions(); | ||||||
|  |  | ||||||
|  |             if( mainAudio ) { | ||||||
|  |                 mainAudio.pause(); | ||||||
|  |                 mainAudio.currentTime = 0; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             window.scrollTo(0, 0); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     //@TODO: Does this need tap bindings too? | ||||||
|  |     function bindElevateToElement( element ) { | ||||||
|  |         element.addEventListener('click', elevate, false); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     function main( options ) { | ||||||
|  |  | ||||||
|  |         // Bind to element click event, if need be. | ||||||
|  |         body = document.body; | ||||||
|  |  | ||||||
|  |         if( options.element ) { | ||||||
|  |             bindElevateToElement( options.element ); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if( options.duration ) { | ||||||
|  |             customDuration = true; | ||||||
|  |             duration = options.duration; | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if( options.mainAudio ) { | ||||||
|  |             mainAudio = new Audio( options.mainAudio ); | ||||||
|  |             mainAudio.setAttribute( 'preload', 'true' ); //@TODO: Option to not preload audio. | ||||||
|  |             mainAudio.setAttribute( 'loop', 'true' ); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         if( options.endAudio ) { | ||||||
|  |             endAudio = new Audio( options.endAudio ); | ||||||
|  |             endAudio.setAttribute( 'preload', 'true' ); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         window.addEventListener('blur', onWindowBlur, false); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     return extend(main, { | ||||||
|  |         elevate: elevate | ||||||
|  |     }); | ||||||
|  | })(); | ||||||
		Reference in New Issue
	
	Block a user
	 Timm
					Timm