Jun 2

Sexy Drop Down Menu w/ jQuery & CSS

Studies show that top navigations tend to get the most visual attention when a user first visits a site. Having organized and intuitive navigation is key — and while most drop down menus may look aesthetically pleasing, developing them to degrade gracefully is also essential. In this tutorial I would like to go over how to create a sexy drop down menu that can also degrade gracefully.


View Demo of Sexy Drop Down Menu

Image1 in Sexy Drop Down Menu w/ jQuery & CSS

Step1. HTML

First create an unordered list for your base top navigation. Then simply nest another unordered list for your sub navigation.

<ul class="topnav">
    <li><a href="#">Home</a></li>
    <li>
        <a href="#">Tutorials</a>
        <ul class="subnav">
            <li><a href="#">Sub Nav Link</a></li>
            <li><a href="#">Sub Nav Link</a></li>
        </ul>
    </li>
    <li>
        <a href="#">Resources</a>
        <ul class="subnav">
            <li><a href="#">Sub Nav Link</a></li>
            <li><a href="#">Sub Nav Link</a></li>
        </ul>
    </li>
    <li><a href="#">About Us</a></li>
    <li><a href="#">Advertise</a></li>
    <li><a href="#">Submit</a></li>
    <li><a href="#">Contact Us</a></li>
</ul>

Step2. CSS

Next, it’s time to style the navigation wireframe with CSS.

ul.topnav {
	list-style: none;
	padding: 0 20px;
	margin: 0;
	float: left;
	width: 920px;
	background: #222;
	font-size: 1.2em;
	background: url(topnav_bg.gif) repeat-x;
}
ul.topnav li {
	float: left;
	margin: 0;
	padding: 0 15px 0 0;
	position: relative; /*--Declare X and Y axis base for sub navigation--*/
}
ul.topnav li a{
	padding: 10px 5px;
	color: #fff;
	display: block;
	text-decoration: none;
	float: left;
}
ul.topnav li a:hover{
	background: url(topnav_hover.gif) no-repeat center top;
}
ul.topnav li span { /*--Drop down trigger styles--*/
	width: 17px;
	height: 35px;
	float: left;
	background: url(subnav_btn.gif) no-repeat center top;
}
ul.topnav li span.subhover {background-position: center bottom; cursor: pointer;} /*--Hover effect for trigger--*/
ul.topnav li ul.subnav {
	list-style: none;
	position: absolute; /*--Important - Keeps subnav from affecting main navigation flow--*/
	left: 0; top: 35px;
	background: #333;
	margin: 0; padding: 0;
	display: none;
	float: left;
	width: 170px;
	border: 1px solid #111;
}
ul.topnav li ul.subnav li{
	margin: 0; padding: 0;
	border-top: 1px solid #252525; /*--Create bevel effect--*/
	border-bottom: 1px solid #444; /*--Create bevel effect--*/
	clear: both;
	width: 170px;
}
html ul.topnav li ul.subnav li a {
	float: left;
	width: 145px;
	background: #333 url(dropdown_linkbg.gif) no-repeat 10px center;
	padding-left: 20px;
}
html ul.topnav li ul.subnav li a:hover { /*--Hover effect for subnav links--*/
	background: #222 url(dropdown_linkbg.gif) no-repeat 10px center;
}

Step3. jQuery

For those who are new to jQuery, you can learn about it here.

The following script contains comments explaining which jQuery actions are being performed.

$(document).ready(function(){

	$("ul.subnav").parent().append("<span></span>"); //Only shows drop down trigger when js is enabled (Adds empty span tag after ul.subnav*)

	$("ul.topnav li span").click(function() { //When trigger is clicked...

		//Following events are applied to the subnav itself (moving subnav up and down)
		$(this).parent().find("ul.subnav").slideDown('fast').show(); //Drop down the subnav on click

		$(this).parent().hover(function() {
		}, function(){
			$(this).parent().find("ul.subnav").slideUp('slow'); //When the mouse hovers out of the subnav, move it back up
		});

		//Following events are applied to the trigger (Hover events for the trigger)
		}).hover(function() {
			$(this).addClass("subhover"); //On hover over, add class "subhover"
		}, function(){	//On Hover Out
			$(this).removeClass("subhover"); //On hover out, remove class "subhover"
	});

});

*To degrade gracefully, we only show the drop down menu trigger to those who have javascript enabled.

Degrade Gracefully Demo in Sexy Drop Down Menu w/ jQuery & CSS

This is what it looks like when javascript is disabled:

Javascript Disabled in Sexy Drop Down Menu w/ jQuery & CSS

View Demo of Sexy Drop Down Menu

Conclusion

Note: I went ahead and added the rounded corners to the demo (CSS3 – Only supported in Firefox, Safar, & Chrome). If you would like to give it a try, check out this tutorial.

Experiment and customize this to fit your needs! If you have any questions, concerns, suggestions, or comments, please do not hesitate to let me know.

Author: Soh Tanaka

Soh Tanaka is a Los Angeles based Web Designer and blogger, who recently launched a CSS Web Gallery called Design Bombs. For more front-end web development tutorials, check out his web design blog or you can follow him on twitter @SohTanaka

Write for Us! We are looking for exciting and creative articles, if you want to contribute, just send us an email.

Tags: ,

359 Responses, Add Comment +

  1. Peter Kahuria 27 January 2010

    Thank you very much for this tutorial. I tried creating a drop down menu myself and I got stuck using the mouseover/mouse out event. You have used a great trick!

    • Ralf S. 30 January 2010

      Hi, Thank for the great menu. Just one question. Is it possible to drop down menu only by mouse over the main nav with out click on the arrow?
      Ralf

      • Shivanand 2 February 2010

        Hover Didn’t work for me too

  2. P-L Gendreau 28 January 2010

    Very sleek menu, nice work! I didn’t really like the clicking part so I slightly modified your code to work with .hoverIntent (which bypasses most of the issues associated with .hover)

    $(document).ready(function(){
    var config = {
    sensitivity: 7, // number = sensitivity threshold (must be 1 or higher)
    interval: 100, // number = milliseconds for onMouseOver polling interval
    over: makeTall, // function = onMouseOver callback (REQUIRED)
    timeout: 400, // number = milliseconds delay before onMouseOut
    out: makeShort // function = onMouseOut callback (REQUIRED)
    };
    $(”ul.topnav li”).hoverIntent(config).hover(function() {
    $(this).addClass(”subhover”); //On hover over, add class “subhover”
    }, function(){ //On Hover Out
    $(this).removeClass(”subhover”); //On hover out, remove class “subhover”
    });
    });
    function makeTall() { $(this).find(”ul.subnav”).slideDown(’normal’).show();}
    function makeShort(){ $(this).find(”ul.subnav”).slideUp(’normal’);}

    • Stephen 1 February 2010

      P-L Gendreau,

      I tried making your changes to the dropdown.js and it seems to have broken the functionality. Am I supposed to add your code into a new (seperate) JS file? Is there a way that you can include your JS file for us to see in it’s entirety?

      • Matt 2 February 2010

        I too tried this as i would prefer my navigation to not require a click, however, i was unsuccessful in making it work?

        • eka 2 February 2010

          TRY THIS IT worked for me

          $(document).ready(function(){

          $(”ul.subnav”).parent().append(”"); //Only shows drop down trigger when js is enabled – Adds empty span tag after ul.subnav

          $(”ul.topnav li span”).hover(function() { //When trigger is clicked…

          //Following events are applied to the subnav itself (moving subnav up and down)
          $(this).parent().find(”ul.subnav”).slideDown(’fast’).show(); //Drop down the subnav on click

          $(this).parent().hover(function() {
          }, function(){
          $(this).parent().find(”ul.subnav”).slideUp(’slow’); //When the mouse hovers out of the subnav, move it back up
          });

          //Following events are applied to the trigger (Hover events for the trigger)
          }).hover(function() {
          $(this).addClass(”subhover”); //On hover over, add class “subhover”
          }, function(){ //On Hover Out
          $(this).removeClass(”subhover”); //On hover out, remove class “subhover”
          });

          });

          • Matt 2 February 2010

            Not too sure? The code seemed a little different for me with the ” and my ”
            It didn’t work

          • Shivanand 2 February 2010

            No,the script is not working.

          • HERO 16 February 2010

            This script doesn’t work because of the wrong quotes at the end of line 2. Switch the empty pair of “” and you’re set.

        • P-L Gendreau 21 February 2010

          As I said, “I slightly modified your code to work with .hoverIntent”, the keyword being hoverIntent. Google is your friend ;)

  3. Basti 6 February 2010

    A very nice Tutorial but the script isn’t working ?!
    Please help :)
    tunetek @gmx.de

  4. Aboubaker Nour 8 February 2010

    Thank you for the tutorial,
    Can I make it just when the mouse hover it the drown menu works ?

  5. Peter 10 February 2010

    Hi, Thank for the great menu.

    Does this support jQuery UI?

  6. Michael giles 10 February 2010

    Here is an example of your sexy menu in production! I got the hover over to work instead of having to click on the arrow.

    uinsureme.com/

    Thx,
    Michael Giles.

    • Tony 2 March 2010

      Hi Michael, I can’t get my dropdown menu to display in IE6 or IE7 no matter how high I set the z-index. I see you had no such trouble. Did you have to do anything special?

      thanks in advance

      Tony

      • Michael Giles 4 March 2010

        Can you send a link to the page you are developing? I’ll try to see what the problem is.

    • Evan 5 March 2010

      Thanks for pointing us to your solution, your JS worked fine for me.

      And thanks for this post in general – I hate drop-down stuff, this saved me loads of time!

  7. Far0n0 11 February 2010

    thanks. I’ll use this menu

  8. matt 11 February 2010

    I was able to get the hove working by adding this as my script

    http://codeviewer.org/view/code:bf9

  9. Virgil 14 February 2010

    looks nice… i’ll give it a try thanks.

    • Kyle 14 February 2010

      Eka’s code did work if you want it to drop down when just hovering over the text. Make sure you put a span around the link and then put in this code (I have changed out all the quotes in the code and switched them to apostrophes):

      $(document).ready(function(){

      $(’ul.subnav’).parent().append(”"); //Only shows drop down trigger when js is enabled – Adds empty span tag after ul.subnav

      $(’ul.topnav li span’).hover(function() { //When trigger is clicked…

      //Following events are applied to the subnav itself (moving subnav up and down)
      $(this).parent().find(’ul.subnav’).slideDown(’fast’).show(); //Drop down the subnav on click

      $(this).parent().hover(function() {
      }, function(){
      $(this).parent().find(’ul.subnav’).slideUp(’slow’); //When the mouse hovers out of the subnav, move it back up
      });

      //Following events are applied to the trigger (Hover events for the trigger)
      }).hover(function() {
      $(this).addClass(’subhover’); //On hover over, add class “subhover”
      }, function(){ //On Hover Out
      $(this).removeClass(’subhover’); //On hover out, remove class “subhover”
      });

      });

      • rafs 8 March 2010

        you also forgot the between the quotes in line two.

        • rafs 8 March 2010

          i meant {span} and {/span} (replace { with greater and less than signs)

  10. felipe saavedra 16 February 2010

    muchas gracias.

  11. Gold 17 February 2010

    Thanks for the tutorial – I will give this a bash and see how it looks.

  12. Vidit Kothari 17 February 2010

    It’s a very easy to understand tut.

    Thank You so much!!! :)

    • Tony 2 March 2010

      Great menu script, my only problem is I need it to work with older browser versions, i.e. IE6 & IE7. I can’t get the submenu dropdown to display no matter how high I set the z-index property

      Any ideas?

      Thanks in advance

  13. laxman kafle 19 February 2010

    can we use this in blogger

  14. Design Dazzling 22 February 2010

    Thanks so much for this menu

  15. Vladimir 27 February 2010

    I have client with a knife on my neck to hurry up and finish it, and I didn’t even start because I don’t have a clue where to begining. he said sliding equivalent jQuery form and I said yes, yes i did it many times – but this block my mind and can’t figure it out – PLEASE HELP!At vps.net/vps-signup as you’ll all see there is power icon as handle to move sliding horizontal bar to get/mange your own price/pacage.How come that noupeis publishing wedding cards – but not something like this…sorry but I’m reading you every single day – probably up-to 300 days a year and u r my favourite and still i can get one – only one thing when I ask. please answer with help or tutorial or please direct/redirect me somewhere and tell me what to look for if you hav legal issues of posting this advanced techniques from jQuery Advocates. But I really desperatelly need this. Please answer

  16. Jens Kelch 28 February 2010

    Thanks for this great Tutorial!

  17. Ifeanyi 1 March 2010

    Thks for the info. but what about the image you used for the bkg.

  18. tech money 1 March 2010

    Just bookmark the article on Del and copy the useful code. Great helps!

  19. Carl 3 March 2010

    Hi,

    Excellent menu, easy to style, I just have one request. Is there a way to have add level 3 menu options as well. I have tried it, but the level 3 menu appears behind the level 2 menu dropdown.

    Thanks in advance.

  20. Eric 4 March 2010

    Love this. How would one modify this to pop up instead of down. I want to create a footer menu…. something like facebook has for contacts. Thanks! :)

  21. Chicago Web Design 8 March 2010

    Awesome, Im also curious as to what mods you need to make to get this to run up instead of down?

  22. TheShadow 9 March 2010

    Hi,Nice tutorial.i have added to my website but i don’t see drop down icon.and regarding java script what should be the file name for it?

  23. Kingsofweb 9 March 2010

    Thank you for this, i have tried also but could not do it, this helps alot!

    Thnak you

    Jon

  24. buycanoneosrebelt2i 11 March 2010

    Thanks so much for this tutorial.

Trackbacks

Leave a Reply

Comments are moderated – and rel="nofollow" is in use. Please no link dropping, no keywords or domains as names; do not spam, and do not advertise!