From 0c17b50ec21bb1ed407a2818b2da60d647fa2413 Mon Sep 17 00:00:00 2001 From: daemonhunt Date: Mon, 17 Mar 2014 18:46:18 +1300 Subject: [PATCH 1/3] Update jquery.flexnav.js Hi indyplanets. Here are the changes I made re: window edge detect. Would you mind having a looksie to see how I could get this to play nice with .hoverIntent? Thanks! --- js/jquery.flexnav.js | 270 ++++++++++++++++++++++++------------------- 1 file changed, 150 insertions(+), 120 deletions(-) diff --git a/js/jquery.flexnav.js b/js/jquery.flexnav.js index d8f6bf9..a842023 100644 --- a/js/jquery.flexnav.js +++ b/js/jquery.flexnav.js @@ -8,135 +8,165 @@ */ -(function() { - var $; +(function () { + var $; - $ = jQuery; + $ = jQuery; - $.fn.flexNav = function(options) { - var $nav, $top_nav_items, breakpoint, count, nav_percent, nav_width, resetMenu, resizer, settings, showMenu, toggle_selector, touch_selector; - settings = $.extend({ - 'animationSpeed': 250, - 'transitionOpacity': true, - 'buttonSelector': '.menu-button', - 'hoverIntent': false, - 'hoverIntentTimeout': 150, - 'calcItemWidths': false, - 'hover': true - }, options); - $nav = $(this); - $nav.addClass('with-js'); - if (settings.transitionOpacity === true) { - $nav.addClass('opacity'); - } - $nav.find("li").each(function() { - if ($(this).has("ul").length) { - return $(this).addClass("item-with-ul").find("ul").hide(); - } - }); - if (settings.calcItemWidths === true) { - $top_nav_items = $nav.find('>li'); - count = $top_nav_items.length; - nav_width = 100 / count; - nav_percent = nav_width + "%"; - } - if ($nav.data('breakpoint')) { - breakpoint = $nav.data('breakpoint'); - } - showMenu = function() { - if ($nav.hasClass('lg-screen') === true && settings.hover === true) { + $.fn.flexNav = function (options) { + var $nav, $top_nav_items, breakpoint, count, nav_percent, nav_width, resetMenu, resizer, settings, showMenu, toggle_selector, touch_selector, edgeDetect; + settings = $.extend({ + 'animationSpeed': 250, + 'transitionOpacity': true, + 'buttonSelector': '.menu-button', + 'hoverIntent': false, + 'hoverIntentTimeout': 200, + 'calcItemWidths': false, + 'hover': true, + 'detectEdges': true + }, options); + $nav = $(this); + $nav.addClass('with-js'); if (settings.transitionOpacity === true) { - return $(this).find('>ul').addClass('flexnav-show').stop(true, true).animate({ - height: ["toggle", "swing"], - opacity: "toggle" - }, settings.animationSpeed); - } else { - return $(this).find('>ul').addClass('flexnav-show').stop(true, true).animate({ - height: ["toggle", "swing"] - }, settings.animationSpeed); + $nav.addClass('opacity'); } - } - }; - resetMenu = function() { - if ($nav.hasClass('lg-screen') === true && $(this).find('>ul').hasClass('flexnav-show') === true && settings.hover === true) { - if (settings.transitionOpacity === true) { - return $(this).find('>ul').removeClass('flexnav-show').stop(true, true).animate({ - height: ["toggle", "swing"], - opacity: "toggle" - }, settings.animationSpeed); - } else { - return $(this).find('>ul').removeClass('flexnav-show').stop(true, true).animate({ - height: ["toggle", "swing"] - }, settings.animationSpeed); - } - } - }; - resizer = function() { - var selector; - if ($(window).width() <= breakpoint) { - $nav.removeClass("lg-screen").addClass("sm-screen"); + $nav.find('li').each(function () { + if ($(this).has('li').length) { + return $(this).addClass('item-with-ul').find('ul').hide(); + } + }); if (settings.calcItemWidths === true) { - $top_nav_items.css('width', '100%'); + $top_nav_items = $nav.find('>li'); + count = $top_nav_items.length; + nav_width = 100 / count; + nav_percent = nav_width + "%"; } - selector = settings['buttonSelector'] + ', ' + settings['buttonSelector'] + ' .touch-button'; - $(selector).removeClass('active'); - return $('.one-page li a').on('click', function() { - return $nav.removeClass('flexnav-show'); + /* Edge Detect */ + if (settings.detectEdges === true) { + $(function() { + + $('.item-with-ul').on('mouseenter mouseleave', function (e) { + var elm = $('ul:first', this); + var off = elm.offset(); + var l = off.left; + var w = elm.width(); + var docW = $(window).width(); + + var isEntirelyVisible = (l + w <= docW); + + if (!isEntirelyVisible) { + $(this).addClass('edge'); + } else { + $(this).delay(260).queue(function () { + $(this).removeClass('edge'); + $(this).dequeue(); + }); + } + }); + + }); - } else if ($(window).width() > breakpoint) { - $nav.removeClass("sm-screen").addClass("lg-screen"); - if (settings.calcItemWidths === true) { - $top_nav_items.css('width', nav_percent); } - $nav.removeClass('flexnav-show').find('.item-with-ul').on(); - $('.item-with-ul').find('ul').removeClass('flexnav-show'); - resetMenu(); - if (settings.hoverIntent === true) { - return $('.item-with-ul').hoverIntent({ - over: showMenu, - out: resetMenu, - timeout: settings.hoverIntentTimeout - }); - } else if (settings.hoverIntent === false) { - return $('.item-with-ul').on('mouseenter', showMenu).on('mouseleave', resetMenu); + /* End Edge Detect */ + if ($nav.data('breakpoint')) { + breakpoint = $nav.data('breakpoint'); } - } + showMenu = function () { + if ($nav.hasClass('lg-screen') === true && settings.hover === true) { + if (settings.transitionOpacity === true) { + return $(this).find('>ul').addClass('flexnav-show').stop(true, true).animate({ + height: ["toggle", "swing"], + opacity: "toggle" + }, settings.animationSpeed); + } else { + return $(this).find('>ul').addClass('flexnav-show').stop(true, true).animate({ + height: ["toggle", "swing"] + }, settings.animationSpeed); + } + } + }; + resetMenu = function () { + if ($nav.hasClass('lg-screen') === true && $(this).find('>ul').hasClass('flexnav-show') === true && settings.hover === true) { + if (settings.transitionOpacity === true) { + return $(this).find('>ul').removeClass('flexnav-show').stop(true, true).animate({ + height: ["toggle", "swing"], + opacity: "toggle" + }, settings.animationSpeed); + } else { + return $(this).find('>ul').removeClass('flexnav-show').stop(true, true).animate({ + height: ["toggle", "swing"] + }, settings.animationSpeed); + } + } + }; + resizer = function () { + var selector; + if ($(window).width() <= breakpoint) { + $nav.removeClass("lg-screen").addClass("sm-screen"); + if (settings.calcItemWidths === true) { + $top_nav_items.css('width', '100%'); + } + selector = settings['buttonSelector'] + ', ' + settings['buttonSelector'] + ' .touch-button'; + $(selector).removeClass('active'); + return $('.one-page li a').on('click', function () { + return $nav.removeClass('flexnav-show'); + }); + } else if ($(window).width() > breakpoint) { + $nav.removeClass("sm-screen").addClass("lg-screen"); + if (settings.calcItemWidths === true) { + $top_nav_items.css('width', nav_percent); + } + $nav.removeClass('flexnav-show').find('.item-with-ul').on(); + $('.item-with-ul').find('ul').removeClass('flexnav-show'); + resetMenu(); + if (settings.hoverIntent === true) { + return $('.item-with-ul').hoverIntent({ + over: showMenu, + out: resetMenu, + timeout: settings.hoverIntentTimeout + }); + } else if (settings.hoverIntent === false) { + $('.item-with-ul').unbind('mouseenter').unbind('mouseleave'); + return $('.item-with-ul').on('mouseenter', showMenu).on('mouseleave', resetMenu); + } + } + }; + $(settings['buttonSelector']).data('navEl', $nav); + touch_selector = '.item-with-ul, ' + settings['buttonSelector']; + $(touch_selector).append(''); + toggle_selector = settings['buttonSelector'] + ', ' + settings['buttonSelector'] + ' .touch-button'; + $(toggle_selector).on('click', function (e) { + var $btnParent, $thisNav, bs; + $(toggle_selector).toggleClass('active'); + e.preventDefault(); + e.stopPropagation(); + bs = settings['buttonSelector']; + $btnParent = $(this).is(bs) ? $(this) : $(this).parent(bs); + $thisNav = $btnParent.data('navEl'); + return $thisNav.toggleClass('flexnav-show'); + }); + $('.touch-button').on('click', function (e) { + var $sub, $touchButton; + $sub = $(this).parent('.item-with-ul').find('>ul'); + $touchButton = $(this).parent('.item-with-ul').find('>span.touch-button'); + if ($nav.hasClass('lg-screen') === true) { + $(this).parent('.item-with-ul').siblings().find('ul.flexnav-show').removeClass('flexnav-show').hide(); + } + if ($sub.hasClass('flexnav-show') === true) { + $sub.removeClass('flexnav-show').slideUp(settings.animationSpeed); + return $touchButton.removeClass('active'); + } else if ($sub.hasClass('flexnav-show') === false) { + $sub.addClass('flexnav-show').slideDown(settings.animationSpeed); + return $touchButton.addClass('active'); + } + }); + $nav.find('.item-with-ul *').focus(function () { + $(this).parent('.item-with-ul').parent().find(".open").not(this).removeClass("open").hide(); + return $(this).parent('.item-with-ul').find('>ul').addClass("open").show(); + }); + resizer(); + return $(window).on('resize', resizer); }; - $(settings['buttonSelector']).data('navEl', $nav); - touch_selector = '.item-with-ul, ' + settings['buttonSelector']; - $(touch_selector).append(''); - toggle_selector = settings['buttonSelector'] + ', ' + settings['buttonSelector'] + ' .touch-button'; - $(toggle_selector).on('click', function(e) { - var $btnParent, $thisNav, bs; - $(toggle_selector).toggleClass('active'); - e.preventDefault(); - e.stopPropagation(); - bs = settings['buttonSelector']; - $btnParent = $(this).is(bs) ? $(this) : $(this).parent(bs); - $thisNav = $btnParent.data('navEl'); - return $thisNav.toggleClass('flexnav-show'); - }); - $('.touch-button').on('click', function(e) { - var $sub, $touchButton; - $sub = $(this).parent('.item-with-ul').find('>ul'); - $touchButton = $(this).parent('.item-with-ul').find('>span.touch-button'); - if ($nav.hasClass('lg-screen') === true) { - $(this).parent('.item-with-ul').siblings().find('ul.flexnav-show').removeClass('flexnav-show').hide(); - } - if ($sub.hasClass('flexnav-show') === true) { - $sub.removeClass('flexnav-show').slideUp(settings.animationSpeed); - return $touchButton.removeClass('active'); - } else if ($sub.hasClass('flexnav-show') === false) { - $sub.addClass('flexnav-show').slideDown(settings.animationSpeed); - return $touchButton.addClass('active'); - } - }); - $nav.find('.item-with-ul *').focus(function() { - $(this).parent('.item-with-ul').parent().find(".open").not(this).removeClass("open").hide(); - return $(this).parent('.item-with-ul').find('>ul').addClass("open").show(); - }); - resizer(); - return $(window).on('resize', resizer); - }; + }).call(this); From ed487cb8638085edea096e485c13f0ef1a7a5211 Mon Sep 17 00:00:00 2001 From: daemonhunt Date: Mon, 17 Mar 2014 18:55:04 +1300 Subject: [PATCH 2/3] Update jquery.flexnav.js --- js/jquery.flexnav.js | 268 +++++++++++++++++++++---------------------- 1 file changed, 133 insertions(+), 135 deletions(-) diff --git a/js/jquery.flexnav.js b/js/jquery.flexnav.js index a842023..1a0b240 100644 --- a/js/jquery.flexnav.js +++ b/js/jquery.flexnav.js @@ -8,43 +8,43 @@ */ -(function () { - var $; +(function() { + var $; - $ = jQuery; + $ = jQuery; + + $.fn.flexNav = function(options) { + var $nav, $top_nav_items, breakpoint, count, nav_percent, nav_width, resetMenu, resizer, settings, showMenu, toggle_selector, touch_selector, edgeDetect; + settings = $.extend({ + 'animationSpeed': 250, + 'transitionOpacity': true, + 'buttonSelector': '.menu-button', + 'hoverIntent': false, + 'hoverIntentTimeout': 150, + 'calcItemWidths': false, + 'hover': true, + 'detectEdges': true + }, options); + $nav = $(this); + $nav.addClass('with-js'); + if (settings.transitionOpacity === true) { + $nav.addClass('opacity'); + } + $nav.find("li").each(function() { + if ($(this).has("ul").length) { + return $(this).addClass("item-with-ul").find("ul").hide(); + } + }); + if (settings.calcItemWidths === true) { + $top_nav_items = $nav.find('>li'); + count = $top_nav_items.length; + nav_width = 100 / count; + nav_percent = nav_width + "%"; + } + /* Edge Detect */ + if (settings.detectEdges === true) { + $(function () { - $.fn.flexNav = function (options) { - var $nav, $top_nav_items, breakpoint, count, nav_percent, nav_width, resetMenu, resizer, settings, showMenu, toggle_selector, touch_selector, edgeDetect; - settings = $.extend({ - 'animationSpeed': 250, - 'transitionOpacity': true, - 'buttonSelector': '.menu-button', - 'hoverIntent': false, - 'hoverIntentTimeout': 200, - 'calcItemWidths': false, - 'hover': true, - 'detectEdges': true - }, options); - $nav = $(this); - $nav.addClass('with-js'); - if (settings.transitionOpacity === true) { - $nav.addClass('opacity'); - } - $nav.find('li').each(function () { - if ($(this).has('li').length) { - return $(this).addClass('item-with-ul').find('ul').hide(); - } - }); - if (settings.calcItemWidths === true) { - $top_nav_items = $nav.find('>li'); - count = $top_nav_items.length; - nav_width = 100 / count; - nav_percent = nav_width + "%"; - } - /* Edge Detect */ - if (settings.detectEdges === true) { - $(function() { - $('.item-with-ul').on('mouseenter mouseleave', function (e) { var elm = $('ul:first', this); var off = elm.offset(); @@ -63,110 +63,108 @@ }); } }); - - + + }); + } + /* End Edge Detect */ + if ($nav.data('breakpoint')) { + breakpoint = $nav.data('breakpoint'); + } + showMenu = function() { + if ($nav.hasClass('lg-screen') === true && settings.hover === true) { + if (settings.transitionOpacity === true) { + return $(this).find('>ul').addClass('flexnav-show').stop(true, true).animate({ + height: ["toggle", "swing"], + opacity: "toggle" + }, settings.animationSpeed); + } else { + return $(this).find('>ul').addClass('flexnav-show').stop(true, true).animate({ + height: ["toggle", "swing"] + }, settings.animationSpeed); } - /* End Edge Detect */ - if ($nav.data('breakpoint')) { - breakpoint = $nav.data('breakpoint'); + } + }; + resetMenu = function() { + if ($nav.hasClass('lg-screen') === true && $(this).find('>ul').hasClass('flexnav-show') === true && settings.hover === true) { + if (settings.transitionOpacity === true) { + return $(this).find('>ul').removeClass('flexnav-show').stop(true, true).animate({ + height: ["toggle", "swing"], + opacity: "toggle" + }, settings.animationSpeed); + } else { + return $(this).find('>ul').removeClass('flexnav-show').stop(true, true).animate({ + height: ["toggle", "swing"] + }, settings.animationSpeed); } - showMenu = function () { - if ($nav.hasClass('lg-screen') === true && settings.hover === true) { - if (settings.transitionOpacity === true) { - return $(this).find('>ul').addClass('flexnav-show').stop(true, true).animate({ - height: ["toggle", "swing"], - opacity: "toggle" - }, settings.animationSpeed); - } else { - return $(this).find('>ul').addClass('flexnav-show').stop(true, true).animate({ - height: ["toggle", "swing"] - }, settings.animationSpeed); - } - } - }; - resetMenu = function () { - if ($nav.hasClass('lg-screen') === true && $(this).find('>ul').hasClass('flexnav-show') === true && settings.hover === true) { - if (settings.transitionOpacity === true) { - return $(this).find('>ul').removeClass('flexnav-show').stop(true, true).animate({ - height: ["toggle", "swing"], - opacity: "toggle" - }, settings.animationSpeed); - } else { - return $(this).find('>ul').removeClass('flexnav-show').stop(true, true).animate({ - height: ["toggle", "swing"] - }, settings.animationSpeed); - } - } - }; - resizer = function () { - var selector; - if ($(window).width() <= breakpoint) { - $nav.removeClass("lg-screen").addClass("sm-screen"); - if (settings.calcItemWidths === true) { - $top_nav_items.css('width', '100%'); - } - selector = settings['buttonSelector'] + ', ' + settings['buttonSelector'] + ' .touch-button'; - $(selector).removeClass('active'); - return $('.one-page li a').on('click', function () { - return $nav.removeClass('flexnav-show'); - }); - } else if ($(window).width() > breakpoint) { - $nav.removeClass("sm-screen").addClass("lg-screen"); - if (settings.calcItemWidths === true) { - $top_nav_items.css('width', nav_percent); - } - $nav.removeClass('flexnav-show').find('.item-with-ul').on(); - $('.item-with-ul').find('ul').removeClass('flexnav-show'); - resetMenu(); - if (settings.hoverIntent === true) { - return $('.item-with-ul').hoverIntent({ - over: showMenu, - out: resetMenu, - timeout: settings.hoverIntentTimeout - }); - } else if (settings.hoverIntent === false) { - $('.item-with-ul').unbind('mouseenter').unbind('mouseleave'); - return $('.item-with-ul').on('mouseenter', showMenu).on('mouseleave', resetMenu); - } - } - }; - $(settings['buttonSelector']).data('navEl', $nav); - touch_selector = '.item-with-ul, ' + settings['buttonSelector']; - $(touch_selector).append(''); - toggle_selector = settings['buttonSelector'] + ', ' + settings['buttonSelector'] + ' .touch-button'; - $(toggle_selector).on('click', function (e) { - var $btnParent, $thisNav, bs; - $(toggle_selector).toggleClass('active'); - e.preventDefault(); - e.stopPropagation(); - bs = settings['buttonSelector']; - $btnParent = $(this).is(bs) ? $(this) : $(this).parent(bs); - $thisNav = $btnParent.data('navEl'); - return $thisNav.toggleClass('flexnav-show'); - }); - $('.touch-button').on('click', function (e) { - var $sub, $touchButton; - $sub = $(this).parent('.item-with-ul').find('>ul'); - $touchButton = $(this).parent('.item-with-ul').find('>span.touch-button'); - if ($nav.hasClass('lg-screen') === true) { - $(this).parent('.item-with-ul').siblings().find('ul.flexnav-show').removeClass('flexnav-show').hide(); - } - if ($sub.hasClass('flexnav-show') === true) { - $sub.removeClass('flexnav-show').slideUp(settings.animationSpeed); - return $touchButton.removeClass('active'); - } else if ($sub.hasClass('flexnav-show') === false) { - $sub.addClass('flexnav-show').slideDown(settings.animationSpeed); - return $touchButton.addClass('active'); - } - }); - $nav.find('.item-with-ul *').focus(function () { - $(this).parent('.item-with-ul').parent().find(".open").not(this).removeClass("open").hide(); - return $(this).parent('.item-with-ul').find('>ul').addClass("open").show(); + } + }; + resizer = function() { + var selector; + if ($(window).width() <= breakpoint) { + $nav.removeClass("lg-screen").addClass("sm-screen"); + if (settings.calcItemWidths === true) { + $top_nav_items.css('width', '100%'); + } + selector = settings['buttonSelector'] + ', ' + settings['buttonSelector'] + ' .touch-button'; + $(selector).removeClass('active'); + return $('.one-page li a').on('click', function() { + return $nav.removeClass('flexnav-show'); }); - resizer(); - return $(window).on('resize', resizer); + } else if ($(window).width() > breakpoint) { + $nav.removeClass("sm-screen").addClass("lg-screen"); + if (settings.calcItemWidths === true) { + $top_nav_items.css('width', nav_percent); + } + $nav.removeClass('flexnav-show').find('.item-with-ul').on(); + $('.item-with-ul').find('ul').removeClass('flexnav-show'); + resetMenu(); + if (settings.hoverIntent === true) { + return $('.item-with-ul').hoverIntent({ + over: showMenu, + out: resetMenu, + timeout: settings.hoverIntentTimeout + }); + } else if (settings.hoverIntent === false) { + return $('.item-with-ul').on('mouseenter', showMenu).on('mouseleave', resetMenu); + } + } }; - + $(settings['buttonSelector']).data('navEl', $nav); + touch_selector = '.item-with-ul, ' + settings['buttonSelector']; + $(touch_selector).append(''); + toggle_selector = settings['buttonSelector'] + ', ' + settings['buttonSelector'] + ' .touch-button'; + $(toggle_selector).on('click', function(e) { + var $btnParent, $thisNav, bs; + $(toggle_selector).toggleClass('active'); + e.preventDefault(); + e.stopPropagation(); + bs = settings['buttonSelector']; + $btnParent = $(this).is(bs) ? $(this) : $(this).parent(bs); + $thisNav = $btnParent.data('navEl'); + return $thisNav.toggleClass('flexnav-show'); + }); + $('.touch-button').on('click', function(e) { + var $sub, $touchButton; + $sub = $(this).parent('.item-with-ul').find('>ul'); + $touchButton = $(this).parent('.item-with-ul').find('>span.touch-button'); + if ($nav.hasClass('lg-screen') === true) { + $(this).parent('.item-with-ul').siblings().find('ul.flexnav-show').removeClass('flexnav-show').hide(); + } + if ($sub.hasClass('flexnav-show') === true) { + $sub.removeClass('flexnav-show').slideUp(settings.animationSpeed); + return $touchButton.removeClass('active'); + } else if ($sub.hasClass('flexnav-show') === false) { + $sub.addClass('flexnav-show').slideDown(settings.animationSpeed); + return $touchButton.addClass('active'); + } + }); + $nav.find('.item-with-ul *').focus(function() { + $(this).parent('.item-with-ul').parent().find(".open").not(this).removeClass("open").hide(); + return $(this).parent('.item-with-ul').find('>ul').addClass("open").show(); + }); + resizer(); + return $(window).on('resize', resizer); + }; }).call(this); From 9aa53d811f6292820f2b491f27004223024bef44 Mon Sep 17 00:00:00 2001 From: daemonhunt Date: Mon, 17 Mar 2014 19:09:27 +1300 Subject: [PATCH 3/3] Update flexnav.css --- css/flexnav.css | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/css/flexnav.css b/css/flexnav.css index 4c94c70..ae12b40 100644 --- a/css/flexnav.css +++ b/css/flexnav.css @@ -98,6 +98,16 @@ position: relative; top: 1em; color: #666; } + +/* edge detect fix */ +.flexnav li ul li.edge > ul { + left: auto; + right: 97%; } + +.flexnav li.edge > ul { + left: auto; + right: 0; } +/* end edge detect */ @media all and (min-width: 800px) { body.one-page {