navigation.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /*! jQuery navigation.js
  2. Adds toggle icon for mobile navigation and dropdown animations for widescreen navigation
  3. Author: Thomas W (themezee.com)
  4. */
  5. (function($) {
  6. /**--------------------------------------------------------------
  7. # Responsive Navigation for WordPress menus
  8. --------------------------------------------------------------*/
  9. $.fn.responsiveMenu = function( options ) {
  10. if (options === undefined) options = {};
  11. /* Set Defaults */
  12. var defaults = {
  13. menuID: "menu",
  14. toggleClass: "menu-toggle",
  15. toggleText: "",
  16. maxWidth: "60em"
  17. };
  18. /* Set Variables */
  19. var vars = $.extend({}, defaults, options),
  20. menuID = vars.menuID,
  21. toggleID = (vars.toggleID) ? vars.toggleID : vars.toggleClass,
  22. toggleClass = vars.toggleClass,
  23. toggleText = vars.toggleText,
  24. maxWidth = vars.maxWidth,
  25. $this = $(this),
  26. $menu = $('#' + menuID);
  27. /*********************
  28. * Desktop Navigation *
  29. **********************/
  30. /* Set and reset dropdown animations based on screen size */
  31. if(typeof matchMedia == 'function') {
  32. var mq = window.matchMedia('(max-width: ' + maxWidth + ')');
  33. mq.addListener(widthChange);
  34. widthChange(mq);
  35. }
  36. function widthChange(mq) {
  37. if (mq.matches) {
  38. /* Reset desktop navigation menu dropdown animation on smaller screens */
  39. $menu.find( 'ul.sub-menu' ).css( { display: 'block' } );
  40. $menu.find( 'li ul.sub-menu' ).css( { visibility: 'visible', display: 'block' } );
  41. $menu.find( 'li.menu-item-has-children' ).unbind( 'mouseenter mouseleave' );
  42. $menu.find( 'li.menu-item-has-children ul.sub-menu' ).each( function() {
  43. $( this ).hide();
  44. $( this ).parent().find( '.submenu-dropdown-toggle' ).removeClass( 'active' );
  45. } );
  46. } else {
  47. /* Add dropdown animation for desktop navigation menu */
  48. $menu.find( 'ul.sub-menu' ).css( { display: 'none' } );
  49. $menu.find( 'li.menu-item-has-children' ).hover( function() {
  50. $( this ).find( 'ul:first' ).css( { visibility: 'visible', display: 'none' } ).slideDown( 300 );
  51. }, function() {
  52. $( this ).find( 'ul:first' ).css( { visibility: 'hidden' } );
  53. } );
  54. }
  55. }
  56. /********************
  57. * Mobile Navigation *
  58. *********************/
  59. /* Add Menu Toggle Button for mobile navigation */
  60. $this.before('<button id=\"' + toggleID + '\" class=\"' + toggleClass + '\">' + toggleText + '</button>');
  61. /* Add dropdown toggle for submenus on mobile navigation */
  62. $menu.find('li.menu-item-has-children').prepend('<span class=\"submenu-dropdown-toggle\"></span>');
  63. /* Add dropdown slide animation for mobile devices */
  64. $('#' + toggleID).on('click', function(){
  65. $menu.slideToggle();
  66. $(this).toggleClass('active');
  67. });
  68. /* Add dropdown animation for submenus on mobile navigation */
  69. $menu.find('li.menu-item-has-children .sub-menu').each( function () {
  70. $( this ).hide();
  71. } );
  72. $menu.find('.submenu-dropdown-toggle').on('click', function(){
  73. $(this).parent().find('ul:first').slideToggle();
  74. $(this).toggleClass('active');
  75. });
  76. };
  77. /**--------------------------------------------------------------
  78. # Flip between dropdown menus for Social Icons and Top Navigation
  79. --------------------------------------------------------------*/
  80. $.fn.flipMenu = function( options ) {
  81. if (options === undefined) options = {};
  82. /* Set Defaults */
  83. var defaults = {
  84. menuID: "menu",
  85. flipMenuID: "menu",
  86. toggleClass: "menu-toggle",
  87. toggleText: ""
  88. };
  89. /* Set Variables */
  90. var vars = $.extend({}, defaults, options),
  91. menuID = vars.menuID,
  92. flipMenuID = vars.flipMenuID,
  93. toggleID = (vars.toggleID) ? vars.toggleID : vars.toggleClass,
  94. toggleClass = vars.toggleClass,
  95. toggleText = vars.toggleText,
  96. $this = $(this),
  97. $menu = $('#' + menuID),
  98. $flipMenu = $('#' + flipMenuID);
  99. /* Add both Menu Toggle Buttons */
  100. $this.before('<button id=\"' + toggleID + '\" class=\"' + toggleClass + '\">' + toggleText + '</button>');
  101. /* Add dropdown slide animation for mobile devices */
  102. $('#' + toggleID).on('click', function(){
  103. if( $flipMenu.is(':visible') ) {
  104. $flipMenu.slideToggle();
  105. $menu.delay(400).slideToggle();
  106. } else {
  107. $menu.slideToggle();
  108. }
  109. $(this).toggleClass('active');
  110. });
  111. };
  112. /**--------------------------------------------------------------
  113. # Setup Navigation Menus
  114. --------------------------------------------------------------*/
  115. $( document ).ready( function() {
  116. /* Setup Main Navigation */
  117. $("#mainnav").responsiveMenu({
  118. menuID: "mainnav-menu",
  119. toggleID: "mainnav-toggle-tablet",
  120. toggleClass: "mainnav-toggle",
  121. maxWidth: "60em"
  122. });
  123. /* Setup Top Navigation */
  124. $("#topnav").responsiveMenu({
  125. menuID: "topnav-menu",
  126. toggleID: "topnav-toggle",
  127. toggleClass: "nav-toggle",
  128. maxWidth: "60em"
  129. });
  130. /* Add flipMenu for social icons menu */
  131. $("#navi-social-icons").flipMenu({
  132. menuID: "social-icons-menu",
  133. flipMenuID: "mainnav-menu",
  134. toggleID: "social-menu-toggle",
  135. toggleClass: "social-menu-toggle"
  136. });
  137. /* Add flipMenu for top navigation */
  138. $("#mainnav").flipMenu({
  139. menuID: "mainnav-menu",
  140. flipMenuID: "social-icons-menu",
  141. toggleID: "mainnav-toggle-phone",
  142. toggleClass: "mainnav-toggle"
  143. });
  144. /* Add toggle effect for header search icon */
  145. $('.header-search-icon').on('click', function(){
  146. $('#header-search-wrap').slideToggle();
  147. $(this).toggleClass('active');
  148. });
  149. } );
  150. }(jQuery));