jQuery floating menu
A simple navigation menu that “follows” page scrolling and expands on mouse over, made with css and jquery.
download Get all files related to post
The code
The css
body{margin:0px; padding:0px;}
#fl_menu{position:absolute; top:50px; left:0px; z-index:9999; width:150px; height:50px;}
#fl_menu .label{padding-left:20px; line-height:50px; font-family:"Arial Black", Arial, Helvetica, sans-serif; font-size:14px; font-weight:bold; background:#000; color:#fff; letter-spacing:7px;}
#fl_menu .menu{display:none;}
#fl_menu .menu .menu_item{display:block; background:#000; color:#bbb; border-top:1px solid #333; padding:10px 20px; font-family:Arial, Helvetica, sans-serif; font-size:12px; text-decoration:none;}
#fl_menu .menu a.menu_item:hover{background:#333; color:#fff;}
The jQuery library and plugins inside head tag
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js" type="text/javascript"></script> <script src="jquery.easing.1.3.js" type="text/javascript"></script>
The floating menu markup
<div id="fl_menu">
<div class="label">MENU</div>
<div class="menu">
<a href="#" class="menu_item">An menu item</a>
<a href="#" class="menu_item">A long menu item</a>
<a href="#" class="menu_item">Item 3</a>
<a href="#" class="menu_item">Another one</a>
<a href="#" class="menu_item">A really, really long menu item</a>
<a href="#" class="menu_item">Menu item 6</a>
<a href="#" class="menu_item">And one more</a>
<a href="#" class="menu_item">A tiny</a>
</div>
</div>
The floating menu script is inserted in the end of the document, right before the closing body tag
<script>
//config
$float_speed=1500; //milliseconds
$float_easing="easeOutQuint";
$menu_fade_speed=500; //milliseconds
$closed_menu_opacity=0.75;
//cache vars
$fl_menu=$("#fl_menu");
$fl_menu_menu=$("#fl_menu .menu");
$fl_menu_label=$("#fl_menu .label");
$(window).load(function() {
menuPosition=$('#fl_menu').position().top;
FloatMenu();
$fl_menu.hover(
function(){ //mouse over
$fl_menu_label.fadeTo($menu_fade_speed, 1);
$fl_menu_menu.fadeIn($menu_fade_speed);
},
function(){ //mouse out
$fl_menu_label.fadeTo($menu_fade_speed, $closed_menu_opacity);
$fl_menu_menu.fadeOut($menu_fade_speed);
}
);
});
$(window).scroll(function () {
FloatMenu();
});
function FloatMenu(){
var scrollAmount=$(document).scrollTop();
var newPosition=menuPosition+scrollAmount;
if($(window).height()<$fl_menu.height()+$fl_menu_menu.height()){
$fl_menu.css("top",menuPosition);
} else {
$fl_menu.stop().animate({top: newPosition}, $float_speed, $float_easing);
}
}
</script>
Under //config comment you can set some configuration options for the menu.
Enjoy
License
You are free to use, study, improve and modify this script wherever and however you like.
All works are licensed under GNU General Public License, GNU Lesser General Public License or Creative Commons Attribution 3.0 Unported License.
Donating helps greatly in developing and updating free software and running this blog :)
In the $(window).load() I would add a click handler to show people how to determine what menu item was clicked. For example…
Is it possible to use 2 of these on the same page?
Thanks…
How do I add the jquery plugin and the html mark up to WordPress hosted site?
Great floating menu!
What if one had a menu placeable by a mouse click?
Hi and thanks for this amazing floating menu.
Is it possible to have multiple menus which work independently when you hover and not only a single one?
Hi Malihu,
It’s great menu. Thanks your sharing.
How can I implement to my Blogger page.
Thanks in advance.
Kaan
why are you complicating developers life? the css could be applied programmatically… call me when you’re done, this is not useful, is error prone.
Hi and thanks for the feedback.
Except position:absolute of #fl_menu and display:none/block of #fl_menu .menu, what else should be applied by the script (since most CSS rules are fonts, colors etc.)?
Hi Malihu,
I am getting error in IE all versions.
To See this error you should follow these steps:
* Internet Options ->Advanced Tab -> In “Settings” Panel -> Browsing -> Uncheck the “Disable Script Debugging (Internet Explorer) and (other)”
Now Reload the page by hitting Shift+F5
Error Is:
“Line: 33
Error: ‘menuPosition’ is undefined”
this line is in floatmenu() function. and we are not initializing menuPosition in this function.
Solution:
Re position this line of code “menuPosition=$(‘#fl_menu’).position().top;” from window.load to the outside of all other methods or at the top of the java script file.
hi, looks cool
i have separated files for css and javascript sources and call these in my html code with the tag, but the codes provided above on this website (http://manos.malihu.gr/jquery-floating-menu) for this cool menu do not work:
1. menu box does not scroll with webpage, but stays still/fix (although “position: absolute;” for “#fl_menu” in css file)
2. hover over “MENU” does not expand the submenues
note: i already use “#menu” in my css for an other menu on the same webpage
do you have a solution?
many thx, cheers
bluenames
Hey man,
Thanks for this, but i just can’t do it. I’m busting my ass but it won’t work. Can you help?
Hello,
I am in the process of making a floating scroll menu, however, every single JQuery code I try, it NEVER seems to work. I am so exhausted and stress and I have a deadline I have to meet for this site approaching really soon. Can you please help me? I am currently using the updated version of Firefox, Google Chrome, and IE9. I would really appreciate it if someone knew the answer to my problem.
Hi !
first, thanks for this ! So cool !
For my website, my menu is on the top at 150px. And when i scroll down, i want it at just 20px. It’s possible ?
Thank you !
Hello,
Try changing:
menuPosition=$('#fl_menu').position().top;to
menuPosition=20;Thanks for your comments
Really nice, many thanks
Hi, first of al great work!!! i love it!
My website is getting more content and i want to categorize the items better then how it looks now.
My question is: is it possible to make the floating menu a multilevel dropdown menu?
Groetjes uit Holland!!
is it possible to adapt it for wordpress ?
muy bueno codigo para inspirarse, gracias, un saludo
First of all many thanks to you sharing such a nice module with us..
I hope to add this to my final year project.
Anyway I faced some problem while using this.
I need to change value in
EEE
I want to change href value and tag value “EEE” clicking another link.
(Using java script or other method)
Can you show way to me to do this?
this also huge help for me..Bcz I tried several time to do this but always I failed.
is there a way to change background color aspect by a image.
The purpose is to build a menu with rounded web buttons , which are in
fancy by now .
Thanks
#fl_menu .menu .menu_item{
display:block;
background-image : url(images/mmktlogo.png); >>>> I tried this and has not worked
background:#000;
color:#bbb;
border-top:1px solid #333;
padding:10px 20px;
font-weight:bold;
font-family: Tahoma, Arial, Helvetica, sans-serif;
font-size:12px;
text-decoration:none;
}
We are a group of volunteers and starting a new
scheme in our community. Your website provided us with valuable info to work on.
You have done a formidable job and our whole community will be thankful to you.
I’m trying to create this side scrolling website and I like the menu scrolling down as you scroll. My question is what in the jquery code should you change in order for it to follow sideways when scrolling sideways instead of scrolling downwards? thanks so much!
I have floating div within ajax tabcontainer.. so the above logic is not woring for me.. pls help
Hi Malihu,
First off, I just wanted to say this is VERY nice and very close to what I wanted to achieve. I was hoping I could get your assistance with a small modification that I believe would increase the usability of this menu. Rather than have the menu scroll along with the page (where it moves every time a user scrolls a single line) I would like the menu to shoot down to the next major section once it comes into view in the content region. The navigation item corresponding to the content would then be aligned with the content heading, for example:
Menu:
About
My Work
C.V.
Contact
As the user scrolled past “about” and down to “my work”, the menu would slide down so that “My Work” was now aligned with the heading “My Work.” Also I would be using HTML5 sections for each of these and all of the content would be on a single page (with anchor links linking to each section.)
Secondly (and this would just be more of a “nice to have”) to deal with content that is longer than a single browser window’s height (where the menu would then disappear) I was thinking it default to your normal scrolling, maybe shooting down for every full browser height scrolled. What I’m hoping to do is avoid the constant movement of the navigation which I believe may distract users from the content.
An alternative, and perhaps superior approach to the above suggestion would be to have a sub-navigation, i.e.:
About
My Work
Project 1
Project 2
etc.
C.V.
Contact
And in this case the navigation would continue to follow the content, this time each project sub-heading would align with the sub-navigation item.
Sorry if this is a little wordy, but what do you think about my suggestions? Is it easily done using your code? Do you think it would be an improvement? Do you see any issues?
I’d love to hear from you! I will check back on this site to see if you’ve responded, or you can also email me directly at the address I’ve provided.
Thanks very much for your time! Again, amazing work! I will be sure to follow your other articles
Todd Baylis
Hi all,
Would possible be possible to add a sub submenu ?
MENU
SUB MENU 1
SUB MENU 2
SUB MENU 3
-> -> SUB SUB MENU 3
How to do that ?
Thk you for your support
it’s ok for me.
malihu and friends.
I need something similar, but that the menu only appears on the top, after rolling a number of lines of the page.
Any tips or tutorial about it?
Thank you for your attention.
obrigado thanks
work
I haven’t tested this but where it says “$fl_menu.hover” change .hover to .click or maybe .mouseup.
You can possible parameters on the jquery docs here http://api.jquery.com/category/events/mouse-events/
Cheers
I edited script to activate on click (and close on mouse out) as follows…
$(window).load(function() {
menuPosition=$(‘#fl_menu’).position().top;
FloatMenu();
$fl_menu.click(
function(){ //mouse over
$fl_menu_label.fadeTo($menu_fade_speed, 1);
$fl_menu_menu.fadeIn($menu_fade_speed);
},
$fl_menu.mouseleave(
function(){ //mouse out
$fl_menu_menu.fadeTo($closed_menu_opacity);
$fl_menu_menu.fadeOut($closed_menu_opacity);
}
));
});
This menu would be ideal if the submenu was click-to-open rather than hover-to-open, so that it would work on touchscreens. Is there any way to make that happen? Thanks. -matt
If you want the Menu to float/animate/slide horizontally instead of vertically for side scrolling websites. Replace the script in the footer with this:
//config $float_speed=1500; //milliseconds $float_easing="easeOutQuint"; $menu_fade_speed=500; //milliseconds $closed_menu_opacity=0.75; //cache vars $fl_menu=$("#fl_menu"); $fl_menu_menu=$("#fl_menu .menu"); $(window).load(function() { menuPosition=$('#fl_menu').position().left; FloatMenu(); }); $(window).scroll(function () { FloatMenu(); }); function FloatMenu(){ var scrollAmount=$(document).scrollLeft(); var newPosition=menuPosition+scrollAmount; if($(window).width()<$fl_menu.width()+$fl_menu_menu.width()){ $fl_menu.css("left",menuPosition); } else { $fl_menu.stop().animate({left: newPosition}, $float_speed, $float_easing); } }The code above just replaces height with width and top with left! Easy!
I tried applying your suggestion to the downloadable demo menu that opens horizontally . It did not work for me. I am in the process of creating a horizontal scrolling website and am in need of a menu that floats horizontal. For me, the code above results in a stationary menu, with no menu hover function.
Hello my friend,
How can I insert sub menus in your floating menu ???????
You are the best …thank you so much for this amaizing tutorial again
I’m having trouble with this menu on my unfinished website: http://neighbourhood1.chemicalrain.net – it seems to not like something in my coding.
Any ideas? Thank you for the great script!
When changing from Absolute to fixed positioning the menuPosition is miscalculating the amount of scroll down relative to the CSS top position.
This means the nav is twice as far down as it should.
Any ideas to fix?
The script works with position absolute. May I ask, why would you wanna make it fixed?
Thank you for sharing.
Really nice bit of code. I hope you don’t mind if I mod it slightly.
Thanks again.
I don’t mind at all
How do you set a top and bottom limit? For example, I want my div to stop right below the header and right above the footer.
Thanks,
Zach
Hi,
Thank you so much for this! Just what I was looking for..
Is there any way the menu can be visible when hovering the “menu_item”?
hi, i am using this but i have issue in IE, it doesnt work, it works fine in ff and chrome, i did renamed your f1_menu….. can help me?
I’ve checked the script and demo in ie8 and ie9 and works well. What version of IE you tested on? And did you test the demo or another implementation?
check out my plugin that does the same, only with more control:
http://plugins.jquery.com/project/stickyfloat
Is it possible to make this menu float horizontally to go with a side scrolling website? Thanks in advance!
Hi Malihu,
First off, thanks for this sleek floating menu!
Bug submission:
When I’m on my 22″ monitor (1920×1200), it works 100% as expected.
But when I’m on my 14″ laptop monitor (1366×768), the menu:
a. Doesn’t scroll down together with the page.
b. Clicking on a menu item, the page scrolls down (using anchor HTML tags) but the menu doesn’t move down.
Please advice further. Thanks.
Cancel my “a. Doesn’t scroll down together with the page.”. The menu works fine when I scroll down. It only doesn’t work when I jump down a page by clicking on a menu item (aka my 2nd point b.).
In addition, the menu also doesn’t work when I click on a menu item to go UP.
Hi there,
I see that the menu, when loading the page, starts without being opaque (or minimized). Surely, there is an easy way to alter this. Could you provide me a hint?
Thanks a lot for your great work!
I believe you’re referring to the horizontal version of the menu, correct?
If yes, just set $page_load_fade_delay variable value to 0 (default is 2000 milliseconds).
thanks a bunch!
I appreciate your work on this script – it will surely see some action on my pages. Elegant and functional!!!! It was nice of you to add the horizontal expansion upon request
Thank you.
TheAngel.com
how do u add sub menus
thanks for everything, I love your work
Hi,
is possible to implement your script for a horizontal floating togheter vertical floating?
I have a variable windows width (from 2000 to 6000 px).
thx
I’ll check it and let you know
I fixed it. I had to wrap the menu html portion in another div (fl_menuWrap) which is set to float right and then set #fl_menu to relative.
MENU
<a href=”#” rel=”nofollow”>An menu item</a>
<a href=”#” rel=”nofollow”>A long menu item</a>
<a href=”#” rel=”nofollow”>Item 3</a>
<a href=”#” rel=”nofollow”>Another one</a>
<a href=”#” rel=”nofollow”>A really, really long menu item</a>
<a href=”#” rel=”nofollow”>Menu item 6</a>
<a href=”#” rel=”nofollow”>And one more</a>
<a href=”#” rel=”nofollow”>A tiny</a>
<!– END fl_menu –>
#fl_menuWrap{float:right; margin:0; width:40px;}
#fl_menu{position:relative; margin:0; width:40px; z-index:9999; width:150px; height:50px;}
Great to see you fixed it
Hi
The page is behind a password. Can you send me your email address so I can send you the files. I am trying to have the menu remain floating but stick to its parent element in a fluid layout so it slides across the screen when the window is resized. When I change the CSS #fl_menu to float:right; it will stick but it disables the floating aspect of the menu. I have done this with another floating jQuery menu and it works so there might be something in your implementation. However I really like the menu aspect of your design.
Thank You
Hi
Thanks for the fast response. Here are the three changes I made:
#fl_menu{position:fixed; top:50px; left:0px; z-index:9999; width:150px; height:50px;}
menuPosition=$(‘#fl_menu’).position().top;
//FloatMenu();
$fl_menu.hover(
$(window).scroll(function () {
//FloatMenu();
});
That did not work. Should I do something else?
Thank you
That’s correct, it should work. Maybe I haven’t understand correctly what you need. Can you provide a link?
Hi malihu
Can this menu be made sticky so that it moves in a floating layout to remain constant in its placement relative to its surrounding content. Thanks again and really great work.
Hi Lee,
It’s very easy to make it sticky by editing a couple of lines:
a) Change its css position from absolute to fixed (position:fixed).
b) Inside the script, comment or remove both FloatMenu(); function calls located in $(window).load and $(window).scroll.
Omg, this is fantastic, this is exactly what I wanted to do and I wasn’t figuring it out on my own; glad someone else asked and you so quickly responded. Thanks for sharing!!
Very nice menu.
Can this be centered within a fixed width?
How exactly? Can you explain more?
Amazing! Thank you so much!
However i still have one little question (if thats okay): would it be possible to fold the menu horizontal instead of vertical? So, not dropping down, but dropping..err.. horizontal.
Like so: {menu (hover)} –> home –> link –> link –> link etc..
Does that make sense or am i pushing it too far?
Hi Sam,
I have optimized the code and made an additional script that expands the menu horizontally (check the second demo). Post, demos and download files are updated
@myowncomment
Woops, got it to work! Apparently the error only shows on my local testing area, very strange…
Thanks!
Cool
Hi, thanks for your reply. I use IE8, included all plugins. My guess is that it conflicts with a jquery image gallery thats on the same page. By the way: i just tried using Firefox and that works fine. Any guesses why it doesnt work properly with IE8 (since people are still using IE, it has to work with that browser also).
Hi, great job. Im trying to implement this into a website but i get a javascrip error in IE: “this property or method is not supported by this object”. Should i update jquery (using 1.3.1) or is there another method to get rid of this error?
What version of IE you get the error? Works fine on version 8.0.6001. Have you included the jquery.easing.1.3.js plugin?
Thanks a lot for this easy to use technique of floating menu.
You are doing a wonderful job here. Very useful, Thank you!
Will this work using jQuery 1.3.2 as well?
Definitely