A pure CSS flyout menu is another feature that is always present in every developer's wish list. In this tutorial I'm going to show you how to create a simple but effective CSS flyout menu by following a step-by-step approach. If you're ready, we can get started.
Step 1: The markup
We'll use unordered lists to mark up both the main and the sub-menu. The active list item will have a CSS class on it:
<ul id="navigation"> <li><a href="#">Home</a></li> <li class="sub"> <a href="#">About</a> <ul> <li><a href="#">Us</a></li> <li><a href="#">Our projects</a></li> <li><a href="#">Our mission</a></li> </ul> </li> <li><a href="#">Contacts</a></li> </ul>
Step 2: Styling the main menu
We need to select only the very direct children of our navigation
element, so we'll use the child selector here:
#navigation { width: 15em; margin: 0; padding: 0; list-style: none; background: #000; color: #fff; font: 100% Arial, sans-serif; } #navigation > li { display: block; width: 100%; } #navigation > li > a { display: block; height: 100%; padding: 1em; font-weight: bold; text-transform: uppercase; color: orange; text-decoration: none; } #navigation > li > a:hover { background: #c60; color: #fff; }
As you can see, we've created a simple vertical navigation menu here.
Step 3: Styling the sub-menu
Our sub-menu needs to be hidden before a user hovers the active item with the mouse. For that reason, we'll use negative absolute positioning here. Further, since we want that our sub-menu be positioned relatively to the active item, we need to create a contextual positioning on that item by using position: relative
:
#navigation > li.sub { position: relative; } #navigation > li.sub ul { margin: 0; padding: 0; width: 15em; list-style: none; font: 100% Arial, sans-serif; background: #c60; color: #fff; position: absolute; left: -1000em; } #navigation > li.sub ul li { display: block; width: 100%; } #navigation > li.sub ul li a { height: 100%; display: block; color: #fff; font-size: 1.2em; font-weight: bold; text-decoration: none; padding: 1em; } #navigation > li.sub ul li a:hover { background: #a40; }
Now our sub-menu is styled but hidden. We need to show it.
Step 4: Showing the sub-menu
To show the sub-menu, we have only to set the left
property to the overall width of our main menu, that is, 15em:
#navigation > li.sub:hover ul { top: 0; left: 15em; }
You can see the demo below.
I was about to say it didn't work for me and I didn't know why. Then I realized I hadn't closed my style tag. Oops.
Great guide.
Same here, sometimes. :-)