/**
* Navigation Plugin
* Includes responsiveMenu() function
*
* Copyright 2016 ThemeZee
* Free to use under the GPLv2 and later license.
* http://www.gnu.org/licenses/gpl-2.0.html
*
* Author: Thomas Weichselbaumer (themezee.com)
*
* @package Poseidon
*/
(function($) {
/**--------------------------------------------------------------
# Responsive Navigation for WordPress menus
--------------------------------------------------------------*/
$.fn.responsiveMenu = function( options ) {
if ( options === undefined ) {
options = {};
}
/* Set Defaults */
var defaults = {
menuClass: 'menu',
toggleClass: 'menu-toggle',
toggleText: '',
maxWidth: '60em'
};
/* Set Variables */
var vars = $.extend( {}, defaults, options ),
menuClass = vars.menuClass,
toggleID = ( vars.toggleID ) ? vars.toggleID : vars.toggleClass,
toggleClass = vars.toggleClass,
toggleText = vars.toggleText,
maxWidth = vars.maxWidth,
$this = $( this ),
$menu = $( '.' + menuClass );
/*********************
* Desktop Navigation *
**********************/
/* Set and reset dropdown animations based on screen size */
if ( typeof matchMedia == 'function' ) {
var mq = window.matchMedia( '(max-width: ' + maxWidth + ')' );
mq.addListener( widthChange );
widthChange( mq );
}
function widthChange( mq ) {
if ( mq.matches ) {
/* Reset desktop navigation menu dropdown animation on smaller screens */
$menu.find( 'ul.sub-menu' ).css( { display: 'block' } );
$menu.find( 'li ul.sub-menu' ).css( { visibility: 'visible', display: 'block' } );
$menu.find( 'li.menu-item-has-children' ).unbind( 'mouseenter mouseleave' );
$menu.find( 'li.menu-item-has-children ul.sub-menu' ).each( function() {
$( this ).hide();
$( this ).parent().find( '.submenu-dropdown-toggle' ).removeClass( 'active' );
} );
/* Remove ARIA states on mobile devices */
$menu.find( 'li.menu-item-has-children > a' ).unbind( 'focus.aria mouseenter.aria blur.aria mouseleave.aria' );
} else {
/* Add dropdown animation for desktop navigation menu */
$menu.find( 'ul.sub-menu' ).css( { display: 'none' } );
$menu.find( 'li.menu-item-has-children' ).hover( function() {
$( this ).find( 'ul:first' ).css( { visibility: 'visible', display: 'none' } ).slideDown( 300 );
}, function() {
$( this ).find( 'ul:first' ).css( { visibility: 'hidden' } );
} );
/* Make sure menu does not fly off the right of the screen */
$menu.find( 'li ul.sub-menu li.menu-item-has-children' ).mouseenter( function() {
if ( $( this ).children( 'ul.sub-menu' ).offset().left + 250 > $( window ).width() ) {
$( this ).children( 'ul.sub-menu' ).css( { right: '100%', left: 'auto' } );
}
});
// Add menu items with submenus to aria-haspopup="true".
$menu.find( 'li.menu-item-has-children' ).attr( 'aria-haspopup', 'true' ).attr( 'aria-expanded', 'false' );
/* Properly update the ARIA states on focus (keyboard) and mouse over events */
$menu.find( 'li.menu-item-has-children > a' ).on( 'focus.aria mouseenter.aria', function() {
$( this ).parents( '.menu-item' ).attr( 'aria-expanded', true ).find( 'ul:first' ).css( { visibility: 'visible', display: 'block' } );
} );
/* Properly update the ARIA states on blur (keyboard) and mouse out events */
$menu.find( 'li.menu-item-has-children > a' ).on( 'blur.aria mouseleave.aria', function() {
if( ! $(this).parent().next( 'li' ).length > 0 && ! $(this).next('ul').length > 0 ) {
$( this ).closest( 'li.menu-item-has-children' ).attr( 'aria-expanded', false ).find( '.sub-menu' ).css( { display: 'none' } );
}
} );
}
}
/********************
* Mobile Navigation *
*********************/
/* Add Menu Toggle Button for mobile navigation */
$this.before( '' );
/* Add dropdown toggle for submenus on mobile navigation */
$menu.find( 'li.menu-item-has-children' ).prepend( '' );
/* Add dropdown slide animation for mobile devices */
$( '#' + toggleID ).on( 'click', function() {
$menu.slideToggle();
$( this ).toggleClass( 'active' );
});
/* Add dropdown animation for submenus on mobile navigation */
$menu.find( 'li.menu-item-has-children .sub-menu' ).each( function () {
$( this ).hide();
} );
$menu.find( '.submenu-dropdown-toggle' ).on( 'click', function() {
$( this ).parent().find( 'ul:first' ).slideToggle();
$( this ).toggleClass( 'active' );
});
};
/**--------------------------------------------------------------
# Setup Navigation Menus
--------------------------------------------------------------*/
$( document ).ready( function() {
/* Setup Main Navigation */
$( '#main-navigation' ).responsiveMenu( {
menuClass: 'main-navigation-menu',
toggleClass: 'main-navigation-toggle',
maxWidth: '60em'
} );
/* Setup Top Navigation */
$( '#top-navigation' ).responsiveMenu( {
menuClass: 'top-navigation-menu',
toggleClass: 'top-navigation-toggle',
maxWidth: '60em'
} );
} );
}(jQuery));