Previously I wrote a tutorial on how to make a mobile navigation for responsive design, now I've discovered a new technique to produce a responsive menu without having to use Javascript. It uses clean and semantic HTML5 markup. The menu can be aligned left, center or right. Unlike the previous tutorial where it is clicked to toggle, this menu toggles on hover which is more user friendly. It also has an indicator to show the active/current menu item. It works on all mobile and desktop browsers including Internet Explorer!
The Purpose
The purpose of this tutorial is to show you how turn a regular list menu into a dropdown menu on smaller display.
This trick is more useful on navigation with a lot of links like the screenshot below. You can condense all the buttons into an elegant dropdown.
Nav HTML Markup
Here is the markup for the navigation. The <nav> tag is required to create the dropdown with the css property absolute position. I will explain this later in the tutorial. The .current class indicates the active/current menu link.
<nav class="nav">
<ul>
<li class="current"><a href="#">Portfolio</a></li>
<li><a href="#">Illustration</a></li>
<li><a href="#">Web Design</a></li>
<li><a href="#">Print Media</a></li>
<li><a href="#">Graphic Design</a></li>
</ul>
</nav>
CSS
The CSS for the navigation (desktop view) is pretty straight forward, so I'm not going to get into the details. Note that I specified display:inline-block instead of float:left for the nav <li> element. This allows the menu buttons to be able to align left, center or right by specifying text-align on the <ul> element.
/* nav */
.nav {
position: relative;
margin: 20px 0;
}
.nav ul {
margin: 0;
padding: 0;
}
.nav li {
margin: 0 5px 10px 0;
padding: 0;
list-style: none;
display: inline-block;
}
.nav a {
padding: 3px 12px;
text-decoration: none;
color: #999;
line-height: 100%;
}
.nav a:hover {
color: #000;
}
.nav .current a {
background: #999;
color: #fff;
border-radius: 5px;
}
Center and Right Alignment
As mentioned above, you can change the alignment of the buttons by using text-align property.
/* right nav */
.nav.right ul {
text-align: right;
}
/* center nav */
.nav.center ul {
text-align: center;
}
Internet Explorer Support
HTML5 <nav> tag and media query is not supported by Internet Explorer 8 or older. Include css3-mediaqueries.js (or respond.js) and html5shim.js to provide fallback support. If you don't want to add html5shim.js, replace the <nav> tag with a <div> tag.
<!--[if lt IE 9]>
<script src="http://css3-mediaqueries-js.googlecode.com/files/css3-mediaqueries.js"></script>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
Responsive
Now here comes the fun part - making the menu responsive with media query! Read my previous articles on responsive design and media query if you are not familar with responsive design.
On 600px breakpoint, I set the nav element to relative position so I can place the <ul> menu list on top with absolute position. I hide all <li> elements by specifying display:none, but keep the .current <li> displaying as block. Then on the nav hover, I set all <li> back to display:block (this will produce the dropdown list result). I added a check icon graphic on the .current element to indicate it is the active item. For the center and right alignment menu, use left and right property to position the <ul> list. View the demo to see the final result.
@media screen and (max-width: 600px) {
.nav {
position: relative;
min-height: 40px;
}
.nav ul {
width: 180px;
padding: 5px 0;
position: absolute;
top: 0;
left: 0;
border: solid 1px #aaa;
background: #fff url(images/icon-menu.png) no-repeat 10px 11px;
border-radius: 5px;
box-shadow: 0 1px 2px rgba(0,0,0,.3);
}
.nav li {
display: none; /* hide all <li> items */
margin: 0;
}
.nav .current {
display: block; /* show only current <li> item */
}
.nav a {
display: block;
padding: 5px 5px 5px 32px;
text-align: left;
}
.nav .current a {
background: none;
color: #666;
}
/* on nav hover */
.nav ul:hover {
background-image: none;
}
.nav ul:hover li {
display: block;
margin: 0 0 5px;
}
.nav ul:hover .current {
background: url(images/icon-check.png) no-repeat 10px 7px;
}
/* right nav */
.nav.right ul {
left: auto;
right: 0;
}
/* center nav */
.nav.center ul {
left: 50%;
margin-left: -90px;
}
}
great post! got everything to work perfectly except the menu wont close on a mobile device once it is clicked.. i saw other people had this same problem and wanted to see if there’s a fix?
thanx,
kb
here’s what i have active on a test server:
http://kbcreativetest.com/cybercopy960/v1
Yeah i’ve got the same problem. any fix yet?
cheers
So cool, thanks for share.
Thank you for this, I will try it out in my next design
nice design. .thanks a lot. .
I used this on my website http://www.oldsaltfishingcharters.com. I’ve been looking for responsive navigation buttons and I thank you for this. It works on the Android. I don’t know anyone with Iphone to try it out. Thanks again.
Looks like a cool method!
Is there a point in having the menu expand on hover when the devices that will most likely see it will be touch-based?
Thank you. It appears so simple.
I wish I found it before. I have just finalised one website and spent a lot of time on something you exaplained above. Thank you for sharing, it is very cool tutorial.
thanks man.
will check that soon in my new website!
awesome, will try this. thanks for sharing
cool.. thank you for sharing..
I really like we have bookmarked your internet blog for brand new things to check out email on the highway. Logo Design Review
good .. thank you for sharing..
Nice script! do you have an example of having 2nd level dropdown? thanks!
This is a really good read for me, Thanks for posting this informative article.
Thanks for sharing ideas of creative techniques.
I’ve designed my site to be as responsive as possible, but this would definitely take it to a new level if I had a menu (the site in my signature doesn’t have one). I’d try this out on my other sites if this solution didn’t require Javascript for older IE support ) :
Excellent post. I think is i will try this CSS navigation bar :)
thanks
Thanks for sharing, actually Im relaunching my site and sure use your tutorial to fit with mobile devices.
Thanks for sharing, this sounds like something that would work well with some of my sites.