Wootheme 'Function' mobile select box nav breaks desktop dropdown nav - javascript
I'm using the Wootheme called Function, which has mobile styling and navigation built in. There is a select box for mobile screen widths that is added in place of the top navigation, but I'm having issues with it.
First, the select box is added to div#top at 781px screen width rather than the standard switch to mobile at widths less than 768px.
Second, and the main issue, is that the initiation of the select box adds inline styling of overflow: hidden; to the original nav ul, breaking the drop-down functionality of that menu once the screen width is increased again.
Ideally, I'd like the select box to not show up until less than 768px screen width and to remove the inline styling that breaks the original navigation drop-down. I've found references to the mobile menu in general.js and third-party.js files. Nothing looks incorrect, but the mobile menu plugin is minified, making it difficult to tell what's going on.
Edit: originally included link to problem site, but now it's fixed. It's seems like it was a problem with the plugin included below.
I'm not sure how helpful this is, but the minified javascript plugin is below:
(function(a){a.uniform={options:{selectClass:"selector",radioClass:"radio",checkboxClass:"checker",fileClass:"uploader",filenameClass:"filename",fileBtnClass:"action",fileDefaultText:"No file selected",fileBtnText:"Choose File",checkedClass:"checked",focusClass:"focus",disabledClass:"disabled",buttonClass:"button",activeClass:"active",hoverClass:"hover",useID:true,idPrefix:"uniform",resetSelector:false,autoHide:true},elements:[]};if(a.browser.msie&&a.browser.version<7){a.support.selectOpacity=false}else{a.support.selectOpacity=true}a.fn.uniform=function(k){k=a.extend(a.uniform.options,k);var d=this;if(k.resetSelector!=false){a(k.resetSelector).mouseup(function(){function l(){a.uniform.update(d)}setTimeout(l,10)})}function j(l){$el=a(l);$el.addClass($el.attr("type"));b(l)}function g(l){a(l).addClass("uniform");b(l)}function i(o){var m=a(o);var p=a("<div>"),l=a("<span>");p.addClass(k.buttonClass);if(k.useID&&m.attr("id")!=""){p.attr("id",k.idPrefix+"-"+m.attr("id"))}var n;if(m.is("a")||m.is("button")){n=m.text()}else{if(m.is(":submit")||m.is(":reset")||m.is("input[type=button]")){n=m.attr("value")}}n=n==""?m.is(":reset")?"Reset":"Submit":n;l.html(n);m.css("opacity",0);m.wrap(p);m.wrap(l);p=m.closest("div");l=m.closest("span");if(m.is(":disabled")){p.addClass(k.disabledClass)}p.bind({"mouseenter.uniform":function(){p.addClass(k.hoverClass)},"mouseleave.uniform":function(){p.removeClass(k.hoverClass);p.removeClass(k.activeClass)},"mousedown.uniform touchbegin.uniform":function(){p.addClass(k.activeClass)},"mouseup.uniform touchend.uniform":function(){p.removeClass(k.activeClass)},"click.uniform touchend.uniform":function(r){if(a(r.target).is("span")||a(r.target).is("div")){if(o[0].dispatchEvent){var q=document.createEvent("MouseEvents");q.initEvent("click",true,true);o[0].dispatchEvent(q)}else{o[0].click()}}}});o.bind({"focus.uniform":function(){p.addClass(k.focusClass)},"blur.uniform":function(){p.removeClass(k.focusClass)}});a.uniform.noSelect(p);b(o)}function e(o){var m=a(o);var p=a("<div />"),l=a("<span />");if(!m.css("display")=="none"&&k.autoHide){p.hide()}p.addClass(k.selectClass);if(k.useID&&o.attr("id")!=""){p.attr("id",k.idPrefix+"-"+o.attr("id"))}var n=o.find(":selected:first");if(n.length==0){n=o.find("option:first")}l.html(n.html());o.css("opacity",0);o.wrap(p);o.before(l);p=o.parent("div");l=o.siblings("span");o.bind({"change.uniform":function(){l.text(o.find(":selected").text());p.removeClass(k.activeClass)},"focus.uniform":function(){p.addClass(k.focusClass)},"blur.uniform":function(){p.removeClass(k.focusClass);p.removeClass(k.activeClass)},"mousedown.uniform touchbegin.uniform":function(){p.addClass(k.activeClass)},"mouseup.uniform touchend.uniform":function(){p.removeClass(k.activeClass)},"click.uniform touchend.uniform":function(){p.removeClass(k.activeClass)},"mouseenter.uniform":function(){p.addClass(k.hoverClass)},"mouseleave.uniform":function(){p.removeClass(k.hoverClass);p.removeClass(k.activeClass)},"keyup.uniform":function(){l.text(o.find(":selected").html())}});if(a(o).attr("disabled")){p.addClass(k.disabledClass)}a.uniform.noSelect(l);b(o)}function f(n){var m=a(n);var o=a("<div />"),l=a("<span />");if(!m.css("display")=="none"&&k.autoHide){o.hide()}o.addClass(k.checkboxClass);if(k.useID&&n.attr("id")!=""){o.attr("id",k.idPrefix+"-"+n.attr("id"))}a(n).wrap(o);a(n).wrap(l);l=n.parent();o=l.parent();a(n).css("opacity",0).bind({"focus.uniform":function(){o.addClass(k.focusClass)},"blur.uniform":function(){o.removeClass(k.focusClass)},"click.uniform touchend.uniform":function(){if(!a(n).attr("checked")){l.removeClass(k.checkedClass)}else{l.addClass(k.checkedClass)}},"mousedown.uniform touchbegin.uniform":function(){o.addClass(k.activeClass)},"mouseup.uniform touchend.uniform":function(){o.removeClass(k.activeClass)},"mouseenter.uniform":function(){o.addClass(k.hoverClass)},"mouseleave.uniform":function(){o.removeClass(k.hoverClass);o.removeClass(k.activeClass)}});if(a(n).attr("checked")){l.addClass(k.checkedClass)}if(a(n).attr("disabled")){o.addClass(k.disabledClass)}b(n)}function c(n){var m=a(n);var o=a("<div />"),l=a("<span />");if(!m.css("display")=="none"&&k.autoHide){o.hide()}o.addClass(k.radioClass);if(k.useID&&n.attr("id")!=""){o.attr("id",k.idPrefix+"-"+n.attr("id"))}a(n).wrap(o);a(n).wrap(l);l=n.parent();o=l.parent();a(n).css("opacity",0).bind({"focus.uniform":function(){o.addClass(k.focusClass)},"blur.uniform":function(){o.removeClass(k.focusClass)},"click.uniform touchend.uniform":function(){if(!a(n).attr("checked")){l.removeClass(k.checkedClass)}else{var p=k.radioClass.split(" ")[0];a("."+p+" span."+k.checkedClass+":has([name='"+a(n).attr("name")+"'])").removeClass(k.checkedClass);l.addClass(k.checkedClass)}},"mousedown.uniform touchend.uniform":function(){if(!a(n).is(":disabled")){o.addClass(k.activeClass)}},"mouseup.uniform touchbegin.uniform":function(){o.removeClass(k.activeClass)},"mouseenter.uniform touchend.uniform":function(){o.addClass(k.hoverClass)},"mouseleave.uniform":function(){o.removeClass(k.hoverClass);o.removeClass(k.activeClass)}});if(a(n).attr("checked")){l.addClass(k.checkedClass)}if(a(n).attr("disabled")){o.addClass(k.disabledClass)}b(n)}function h(q){var o=a(q);var r=a("<div />"),p=a("<span>"+k.fileDefaultText+"</span>"),m=a("<span>"+k.fileBtnText+"</span>");if(!o.css("display")=="none"&&k.autoHide){r.hide()}r.addClass(k.fileClass);p.addClass(k.filenameClass);m.addClass(k.fileBtnClass);if(k.useID&&o.attr("id")!=""){r.attr("id",k.idPrefix+"-"+o.attr("id"))}o.wrap(r);o.after(m);o.after(p);r=o.closest("div");p=o.siblings("."+k.filenameClass);m=o.siblings("."+k.fileBtnClass);if(!o.attr("size")){var l=r.width();o.attr("size",l/10)}var n=function(){var s=o.val();if(s===""){s=k.fileDefaultText}else{s=s.split(/[\/\\]+/);s=s[(s.length-1)]}p.text(s)};n();o.css("opacity",0).bind({"focus.uniform":function(){r.addClass(k.focusClass)},"blur.uniform":function(){r.removeClass(k.focusClass)},"mousedown.uniform":function(){if(!a(q).is(":disabled")){r.addClass(k.activeClass)}},"mouseup.uniform":function(){r.removeClass(k.activeClass)},"mouseenter.uniform":function(){r.addClass(k.hoverClass)},"mouseleave.uniform":function(){r.removeClass(k.hoverClass);r.removeClass(k.activeClass)}});if(a.browser.msie){o.bind("click.uniform.ie7",function(){setTimeout(n,0)})}else{o.bind("change.uniform",n)}if(o.attr("disabled")){r.addClass(k.disabledClass)}a.uniform.noSelect(p);a.uniform.noSelect(m);b(q)}a.uniform.restore=function(l){if(l==undefined){l=a(a.uniform.elements)}a(l).each(function(){if(a(this).is(":checkbox")){a(this).unwrap().unwrap()}else{if(a(this).is("select")){a(this).siblings("span").remove();a(this).unwrap()}else{if(a(this).is(":radio")){a(this).unwrap().unwrap()}else{if(a(this).is(":file")){a(this).siblings("span").remove();a(this).unwrap()}else{if(a(this).is("button, :submit, :reset, a, input[type='button']")){a(this).unwrap().unwrap()}}}}}a(this).unbind(".uniform");a(this).css("opacity","1");var m=a.inArray(a(l),a.uniform.elements);a.uniform.elements.splice(m,1)})};function b(l){l=a(l).get();if(l.length>1){a.each(l,function(m,n){a.uniform.elements.push(n)})}else{a.uniform.elements.push(l)}}a.uniform.noSelect=function(l){function m(){return false}a(l).each(function(){this.onselectstart=this.ondragstart=m;a(this).mousedown(m).css({MozUserSelect:"none"})})};a.uniform.update=function(l){if(l==undefined){l=a(a.uniform.elements)}l=a(l);l.each(function(){var n=a(this);if(n.is("select")){var m=n.siblings("span");var p=n.parent("div");p.removeClass(k.hoverClass+" "+k.focusClass+" "+k.activeClass);m.html(n.find(":selected").html());if(n.is(":disabled")){p.addClass(k.disabledClass)}else{p.removeClass(k.disabledClass)}}else{if(n.is(":checkbox")){var m=n.closest("span");var p=n.closest("div");p.removeClass(k.hoverClass+" "+k.focusClass+" "+k.activeClass);m.removeClass(k.checkedClass);if(n.is(":checked")){m.addClass(k.checkedClass)}if(n.is(":disabled")){p.addClass(k.disabledClass)}else{p.removeClass(k.disabledClass)}}else{if(n.is(":radio")){var m=n.closest("span");var p=n.closest("div");p.removeClass(k.hoverClass+" "+k.focusClass+" "+k.activeClass);m.removeClass(k.checkedClass);if(n.is(":checked")){m.addClass(k.checkedClass)}if(n.is(":disabled")){p.addClass(k.disabledClass)}else{p.removeClass(k.disabledClass)}}else{if(n.is(":file")){var p=n.parent("div");var o=n.siblings(k.filenameClass);btnTag=n.siblings(k.fileBtnClass);p.removeClass(k.hoverClass+" "+k.focusClass+" "+k.activeClass);o.text(n.val());if(n.is(":disabled")){p.addClass(k.disabledClass)}else{p.removeClass(k.disabledClass)}}else{if(n.is(":submit")||n.is(":reset")||n.is("button")||n.is("a")||l.is("input[type=button]")){var p=n.closest("div");p.removeClass(k.hoverClass+" "+k.focusClass+" "+k.activeClass);if(n.is(":disabled")){p.addClass(k.disabledClass)}else{p.removeClass(k.disabledClass)}}}}}}})};return this.each(function(){if(a.support.selectOpacity){var l=a(this);if(l.is("select")){if(l.attr("multiple")!=true){if(l.attr("size")==undefined||l.attr("size")<=1){e(l)}}}else{if(l.is(":checkbox")){f(l)}else{if(l.is(":radio")){c(l)}else{if(l.is(":file")){h(l)}else{if(l.is(":text, :password, input[type='email']")){j(l)}else{if(l.is("textarea")){g(l)}else{if(l.is("a")||l.is(":submit")||l.is(":reset")||l.is("button")||l.is("input[type=button]")){i(l)}}}}}}}}})}})(jQuery);
There is a demo of the theme - Woothemes Function Demo - though it doesn't have a drop-down top menu.
Does anyone familiar with Woothemes have any ideas about where the inline styling is added to the original navigation and the screen width set for the mobile select menu?
Had to replace the jQuery mobile menu plugin that was included with the theme and this fixed the issue with the drop-down on the original nav ul. The problematic plugin is located in the theme directory includes/js/third-party.js, at the top of the file.
To add the select menu at 767px instead of 781px, in includes/js/general.js in the call to the mobileMenu plugin around line 26, the switchWidth had to be changed to 750 to account for the way the javascript was getting the screen width. This part is a little buggy still, so I'm not sure exactly what the best fix is for it.
Related
Rendering a Kendo Menu from an Ext JS Panel
I'm combining ExtJS and Kendo UI - I realise this I'm off the reservation here ;) I'm rendering a Kendo Menu onto an Ext JS (4.2.1) generated Ext.form.Panel Fiddle: http://jsfiddle.net/blackfrancis75/5e6Lgtaj/1/ The problem is that the drop-down items (on hover) get drawn only within the bounds of the Ext JS Panel. Is there a way to have the drop down items show 'in front' of everything (I tried changing some of the classes z-order)?
This is not z-index issue. It is parent overflow: hidden issue. If you have relatve container with overflow: hidden CSS property it will always work like that. Simple solution for kendo menu right now is to set all menu relative parents overflow to visible: .x-panel, .x-panel-body { overflow: visible; } Like here: http://jsfiddle.net/5e6Lgtaj/2/ But you must be beware that if you want to use it as scrollbars in them or actually hide overflow it will be a problem. Other option would be append menu to body element, but you will face more problem then: like loose styling (cause it is moved from initial container with important classes), javascript functions to keep it in correct position and it will be more problems then it is worth. This is first step how it could looks like: http://jsfiddle.net/5e6Lgtaj/3/
Get Bootstrap navbar collapse to trigger javascript instead?
I've got a standard Twitter Bootstrap 3 navbar with some buttons on it (as per here: http://getbootstrap.com/components/#navbar-default ). I want to change the collapse behaviour (where it becomes a dropdown menu below a certain screen width) so that my custom Javascript function is run, instead of the drop down menu being created. This is because I'm making more extensive changes to the interface for smaller screens, than just CSS would allow (e.g. I'm moving UI elements around in the DOM etc). Should I just switch off the collapse behaviour of the navbar, and if so how? And then I'm thinking on both page load and page resize (using JQuery's resize() event) I check new window width and trigger the mobile UI (via my function) if width is below the collapse point? Or is there a better way of doing this? Any thoughts appreciated! Thanks
This is doable, and I applaud your effort to go beyond BS styling in extending the platform to something unique. Using less open the BS Navbar.less file. Look for the section within the .navbar-collapse { class definition. This is the default styling (remember mobile first is set) and will break to the horizontal styling at the default (if not overridden) of 768px. You can place your styling in here and it will default. You can place the horizontal styles within this section, and remove any #media (min-width: #grid-float-breakpoint) { sections that would flip to the horizontal (as it would be set by default. Next step is to handle a breakpoint. I like enquire.js as it allows for identical registration of breakpoints between CSS and the JS listener. http://wicky.nillia.ms/enquire.js/ enquire.register("screen and (max-width: 767px)", { match : function() { //Do something }, unmatch : function() { //undo something } }); Without enquire.js: $(window).resize(function() { if($(window).width() < 768){ //do it } });
JS toggle event trigger not working correctly
I have setup a responsive menu that on 480px or less the menu will collapse and show a button to click on and cause the menu to drop down. The problem I am having is, the menu will toggle down and immediately toggle back up. It won't stay open. I added a css to the js handler class called .nav-expanded to run after the toggle to allow the full menu to be displayed when opening up the screen to a larger dimension that 480px. If I remove the css from my stylesheet, or the code from the js, when I shrink the page to 480px or less, the new menu shows correctly, I can toggle open then close. However once I toggle close and widen my browser the menu remain hidden unless I refresh the browser. The page is here http://skeeterz71.com/gothic/ My js code: jQuery(document).ready(function(){ jQuery(".menu-trigger").click(function(){ jQuery("#first-nav").slideToggle(400, function(){ jQuery(this).toggleClass("nav-expanded").css('display', ''); }); }); }); CSS in the stylesheet media query .nav-expanded{ display:block; }
You can add this css in your jQuery code: jQuery(this).toggleClass("nav-expanded").css('display', 'block');
CSS for .nav-expanded is not getting applied since #first-nav styles are overriding it. To give .nav-expanded the higher specificity add the following #first-nav.nav-expanded { display: block; }
how include multiple divs in one javascript toggle?
I am trying to implement a javascript toggle effect for my "small" or mobile sized version of a responsive site. I am using my own custom WordPress theme. I'm trying to use the script from this article: http://webdesignerwall.com/tutorials/mobile-navigation-design-tutorial/comment-page-1 The tricky part is that I'm trying to include several divs, not just a single nav. If you look at the site now (which is still under construction), at: http://66.147.244.81/~assureva/ and reduce your browser window to narrower than 540px, you'll see that I've managed to get my top navbar (smallnav), 2 "login" links, and facebook and LinkedIn icons, all to disappear, and re-appear when pressing the "main menu" button that now appears at the top, to the right of the logo. But I can't seem to add in the last part, which is the 4 links that comprise the main "nav". I've wrapped the entire area in a div (mobimenubg), but the main navbar acts like it isn't in that div, but the "smallnav", "logins" and "socialcons" divs all combine as desired in the "mobimenubg" div. If I go ahead and set the "navbar" div to "display:none" it will disappear but it won't re-appear when I click the "main menu" button. So I think the answer to ask the javascript to include the "mobimenubg" div AND the "navbar" div (the "navbar div is a container that includes the actual "nav") but I don't know how to write it properly. Here's the javascript: <script type="text/javascript"> jQuery(document).ready(function($) {/* prepend menu icon */ $('#mobimenuwrap').prepend('<div id="menu-icon">Main Menu</div>'); /* toggle nav */ $("#menu-icon").on("click", function(){ $("#mobimenubg").slideToggle(); $(this).toggleClass("active"); }); }); </script> Can someone tell me how add the navbar div? Do I add another line after: $("#mobimenubg").slideToggle(); or can I include it in the parens: $("#mobimenubg" IN HERE?).slideToggle(); I don't know the conventions - Help greatly appreciated!!
I've wrapped the entire area in a div (mobimenubg), but the main navbar acts like it isn't in that div, You actually have the right code, but your HTML structure is off. The navbar div is not contained within the mobimenubg div, and that is the problem. Just make sure to nest navbar there, or otherwise I think you can also call the function on the navbar like: $("#navbar").slideToggle();
CSS / jQuery Menus not working in IE7
I'm sure there's a million questions along this line but I can't find one that relates to my specific issue. After wrestling with IE7 for countless hours I finally have the text showing above the video content (classic IE7 z-index bug - squashed now). You'll need to have a look at this site in either Firefox / Chrome / Safari first: http://valeriaentertainment.com.s66112.gridserver.com/ Hovering over "Gallery" or "About" in the navigation will reveal an animated jQuery slideUp() / slideDown() dropdown menu. For some reason, now that the CSS is fixed the background for the dropdowns is not visible in IE7. Any debug suggestions / IE7 hacks? ;) EDIT: I should note that I think this is a javscript issue because the animation does not seem to be happening as expected (view site in a good browser)... Here is the relevant JS code the js-enabled class is to allow the menus to work via CSS only in case javascript is disabled: //jQuery slideDown for menu dropdowns $('.menu').addClass('js-enabled'); $('.js-enabled li').hoverIntent(function () { $(this).find(".sub-menu").stop(true,true).slideDown(400); }, function () { $(this).find(".sub-menu").stop(true,true).slideUp(400); });
I'm poking around a bit and IE doesn't seem to register the CSS property for the background image. What happens if you add quotes into your background:url property: .sub-menu li{ background: url('images/sub-menu_middle.jpg') top left repeat-y; ... } Edit As you said, the older IE is picky about it's spaces. Added a space between ) and top in the CSS