$(function(){ $('#icon-ham').on('click',function(){ openResponsiveMenu(); }); $('#close-menu-responsive').on('click',function(){ closeResponsiveMenu(); }); $('#HeaderMenu').on('click',function(e){ //if we click outside the menu we will close the menu if (e.target == this){ closeResponsiveMenu(); } }); }); function openResponsiveMenu(){ $('#HeaderMenu').bind( 'transitionend', $('#HeaderMenu').removeClass('--animatable')); $('#HeaderMenu').addClass('--animatable'); $('#HeaderMenu').addClass('--visible'); /* evitar scroll, posiblemente se elimine */ $.scrollLock(); } function closeResponsiveMenu(){ $('#HeaderMenu').bind( 'transitionend', $('#HeaderMenu').removeClass('--animatable')); $('#HeaderMenu').addClass('--animatable'); $('#HeaderMenu').removeClass('--visible'); /* evitar scroll, posiblemente se elimine */ $.scrollLock(); } /* function to lock the page scroll */ $.scrollLock = ( function scrollLockClosure() { 'use strict'; var $html = $( 'html' ), // State: unlocked by default locked = false, // State: scroll to revert to prevScroll = { scrollLeft : $( window ).scrollLeft(), scrollTop : $( window ).scrollTop() }, // State: styles to revert to prevStyles = {}, lockStyles = { 'overflow-y' : 'scroll', 'position' : 'fixed', 'width' : '100%' }; // Instantiate cache in case someone tries to unlock before locking saveStyles(); // Save context's inline styles in cache function saveStyles() { var styleAttr = $html.attr( 'style' ), styleStrs = [], styleHash = {}; if( !styleAttr ){ return; } styleStrs = styleAttr.split( /;\s/ ); $.each( styleStrs, function serializeStyleProp( styleString ){ if( !styleString ) { return; } var keyValue = styleString.split( /\s:\s/ ); if( keyValue.length < 2 ) { return; } styleHash[ keyValue[ 0 ] ] = keyValue[ 1 ]; } ); $.extend( prevStyles, styleHash ); } function lock() { var appliedLock = {}; // Duplicate execution will break DOM statefulness if( locked ) { return; } // Save scroll state... prevScroll = { scrollLeft : $( window ).scrollLeft(), scrollTop : $( window ).scrollTop() }; // ...and styles saveStyles(); // Compose our applied CSS $.extend( appliedLock, lockStyles, { // And apply scroll state as styles 'left' : - prevScroll.scrollLeft + 'px', 'top' : - prevScroll.scrollTop + 'px' } ); // Then lock styles... $html.css( appliedLock ); // ...and scroll state $( window ) .scrollLeft( 0 ) .scrollTop( 0 ); locked = true; } function unlock() { // Duplicate execution will break DOM statefulness if( !locked ) { return; } // Revert styles $html.attr( 'style', $( '' ).css( prevStyles ).attr( 'style' ) || '' ); // Revert scroll values $( window ) .scrollLeft( prevScroll.scrollLeft ) .scrollTop( prevScroll.scrollTop ); locked = false; } return function scrollLock( on ) { // If an argument is passed, lock or unlock depending on truthiness if( arguments.length ) { if( on ) { lock(); } else { unlock(); } } // Otherwise, toggle else { if( locked ){ unlock(); } else { lock(); } } }; }() );