Update GreedyNav.js

This commit is contained in:
Michael Rose 2017-02-13 22:14:10 -05:00
parent d2ac1aebec
commit 3c93905e23

View file

@ -1,72 +1,74 @@
/* /*
* Greedy Navigation GreedyNav.js - https://github.com/lukejacksonn/GreedyNav
* Licensed under the MIT license - http://opensource.org/licenses/MIT
* http://codepen.io/lukejacksonn/pen/PwmwWV Copyright (c) 2015 Luke Jackson
*
*/ */
var $nav = $('#site-nav'); $(function() {
var $btn = $('#site-nav button');
var $vlinks = $('#site-nav .visible-links');
var $hlinks = $('#site-nav .hidden-links');
var breaks = []; var $btn = $('nav.greedy-nav button');
var $vlinks = $('nav.greedy-nav .visible-links');
var $hlinks = $('nav.greedy-nav .hidden-links');
function updateNav() { var numOfItems = 0;
var totalSpace = 0;
var closingTime = 1000;
var breakWidths = [];
var availableSpace = $btn.hasClass('hidden') ? $nav.width() : $nav.width() - $btn.width() - 30; // Get initial state
$vlinks.children().outerWidth(function(i, w) {
totalSpace += w;
numOfItems += 1;
breakWidths.push(totalSpace);
});
// The visible list is overflowing the nav var availableSpace, numOfVisibleItems, requiredSpace, timer;
if($vlinks.width() > availableSpace) {
// Record the width of the list function check() {
breaks.push($vlinks.width());
// Move item to the hidden list // Get instant state
availableSpace = $vlinks.width() - 10;
numOfVisibleItems = $vlinks.children().length;
requiredSpace = breakWidths[numOfVisibleItems - 1];
// There is not enough space
if (requiredSpace > availableSpace) {
$vlinks.children().last().prependTo($hlinks); $vlinks.children().last().prependTo($hlinks);
numOfVisibleItems -= 1;
// Show the dropdown btn check();
if($btn.hasClass('hidden')) { // There is more than enough space
$btn.removeClass('hidden'); } else if (availableSpace > breakWidths[numOfVisibleItems]) {
}
// The visible list is not overflowing
} else {
// There is space for another item in the nav
if(availableSpace > breaks[breaks.length-1]) {
// Move the item to the visible list
$hlinks.children().first().appendTo($vlinks); $hlinks.children().first().appendTo($vlinks);
breaks.pop(); numOfVisibleItems += 1;
check();
} }
// Update the button accordingly
// Hide the dropdown btn if hidden list is empty $btn.attr("count", numOfItems - numOfVisibleItems);
if(breaks.length < 1) { if (numOfVisibleItems === numOfItems) {
$btn.addClass('hidden'); $btn.addClass('hidden');
$hlinks.addClass('hidden'); } else $btn.removeClass('hidden');
}
} }
// Keep counter updated // Window listeners
$btn.attr("count", breaks.length); $(window).resize(function() {
check();
});
// Recur if the visible list is still overflowing the nav $btn.on('click', function() {
if($vlinks.width() > availableSpace) {
updateNav();
}
}
// Window listeners
$(window).resize(function() {
updateNav();
});
$btn.on('click', function() {
$hlinks.toggleClass('hidden'); $hlinks.toggleClass('hidden');
$(this).toggleClass('close'); clearTimeout(timer);
}); });
updateNav(); $hlinks.on('mouseleave', function() {
// Mouse has left, start the timer
timer = setTimeout(function() {
$hlinks.addClass('hidden');
}, closingTime);
}).on('mouseenter', function() {
// Mouse is back, cancel the timer
clearTimeout(timer);
})
check();
});