123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- /**
- * Header enhancements for more intelligent dynamic headers.
- *
- * This sets the masthead to the height of an uploaded image and applies sticky navigation.
- */
- ( function( $ ) {
- // Fit header into the available space
- function fitHeader() {
- var windowWidth = $( window ).width();
- var headerHeight = $( '#pique-header-image' ).height();
- var navHeight = $( '#primary-menu' ).height();
- var brandingHeight = $( '.site-branding' ).height();
- // Make sure we're not on the homepage, since that handles stuff differently
- if ( ! $( 'body' ).hasClass( 'pique-frontpage' )) {
- if ( 0 < $( '#pique-header-image' ).length ) {
- // Add the height of our header image and the height of our nav
- $( '#masthead' ).css( 'height', headerHeight + navHeight );
- } else {
- // Give enough room for our branding
- console.log('no header');
- $( '#masthead' ).css( 'height', brandingHeight + navHeight + 40 );
- }
- }
- };
- // Priority+ navigation, whee!
- function priorityNav() {
- // Make sure we have a menu and that the more-more item is present
- if ( 0 < $( '#site-navigation' ).length && 0 < $( '#more-menu' ).length ) {
- var navWidth = 0;
- var firstMoreElement = $( '#more-menu li' ).first();
- // Calculate the width of our "more" containing element
- var moreWidth = $( '#more-menu' ).outerWidth( true );
- // Calculate the current width of our navigation
- $( '#site-navigation .menu > li' ).each( function() {
- navWidth += $( this ).outerWidth( true );
- });
- // Calculate our available space
- var availableSpace = $( '#site-navigation' ).outerWidth( true ) - moreWidth;
- // If our nav is wider than our available space, we're going to move items
- if (navWidth > availableSpace) {
- var lastItem = $( '#site-navigation .menu > li:not(#more-menu)' ).last();
- lastItem.attr( 'data-width', lastItem.outerWidth( true ) );
- lastItem.prependTo( $( '#more-menu .sub-menu' ).eq( 0 ) );
- priorityNav(); // Rerun this function!
- // But if we have the extra space, we should add the items back to our menu
- } else if (navWidth + firstMoreElement.data( 'width' ) < availableSpace) {
- // Check to be sure there's enough space for our extra element
- firstMoreElement.insertBefore( $( '#site-navigation .menu > li' ).last() );
- priorityNav();
- }
- // Hide our more-menu entirely if there's nothing in it
- if ($( '#more-menu li' ).length > 0) {
- $( '#more-menu' ).addClass( 'visible' );
- } else {
- $( '#more-menu' ).removeClass( 'visible' );
- }
- } // check for body class
- }; // function priorityNav
- // Okay, now we want to stick-ify our menu when we reach it
- function stickyNav() {
- var nav_container = $( '#site-navigation-wrapper' );
- var nav = $( '#site-navigation' );
- nav_container.waypoint( {
- handler: function(direction) {
- nav.toggleClass( 'sticky', direction == 'down' );
- // Ensure we don't have an awkward jump when the menu sticks
- if ('down' === direction) {
- nav_container.css( { 'height':nav.outerHeight() } );
- } else {
- nav_container.css( { 'height':'auto' } );
- }
- }
- });
- };
- // Run our functions once the window has loaded fully
- $( window ).on( 'load', function() {
- priorityNav();
- fitHeader();
- stickyNav();
- });
- // Annnnnd also every time the window resizes
- var isResizing = false;
- $( window ).on('resize', function() {
- if (isResizing) {
- return;
- }
- isResizing = true;
- setTimeout(function() {
- priorityNav();
- fitHeader();
- isResizing = false;
- }, 150);
- });
- } )( jQuery );
|