I want to know if i can get the ul class productnav to dissappear until the mouse hovers over the product button? Also, I want the productnav ul to go off to the side like a
Steve Gibson wrote up an example on how to do css menus. He uses unordered lists.
GRC's Script-Free Pure-CSS Menuing System
/*==============================================================================
GRC multi-level script-free pure-CSS menuing system stylesheet.
This code is hereby placed into the public domain by its author
Steve Gibson. It may be freely used for any purpose whatsoever.
Computed Geometries: with a default 12px font, 1.0em == 12px and
1px == 0.08333em.
Thus, our 98px wide Freeware & Research buttons are 8.166666em wide.
==============================================================================*/
/*====== GLOBAL OVERRIDES FOR MAJOR ITEMS AND DIFFERING BROWSER DEFAULTS =====*/
body { color:#009; background:#fff; font-family: verdana, tahoma, arial, helvetica, sans-serif, MS Sans Serif; }
body, table, img, button, iframe, ul, li { margin:0; padding:0; border:0; }
table { text-align:left; }
iframe { width:0; height:0 }
ul { margin-left:20px; } /* kill default 50px left padding and set 20px */
li { margin-bottom:1em; } /* set default inter-item vertical spacing */
.tightlist li { margin-bottom:0.25em; } /* tighter list for simple bullets */
/* our default page-width div */
.pagecontainer { width:85%; text-align:left; font-size:10pt;}
/*================= STYLES FOR THE GRC MASTHEAD & CONTROLS ==================*/
.menuminwidth0 { /* for all browsers (non-IE) that obey min-width */
position:relative;
border:0;
margin:0;
padding:0;
width:100%;
height:55px;/* 36px masthead height + 18px button height + 1px lower border*/
min-width:560px;
}
/* suppress our whole menu when not an interactive mode (when printing, etc.) */
@media print, projection { .menuminwidth0 { d\isplay:none; } }
* html .menuminwidth1 { /* this allows IE5/6 to simulate min-width capability */
position:relative; /* we can simulate a minimum width by creating a large */
float:left; /* border in this first div, then placing our content */
height: 1px; /* into a second nested div (see 2nd nested div next */
border-left:560px solid #fff; /* CSS box-model borders are a fixed size */
}
* html .menuminwidth2 { /* used to simulate min-width capability for IE5/6 */
position:relative;
margin-left:-560px;
height: 1px;
}
#masthead {
position:relative; /* position our child objects relative to this div */
float:left;
vertical-align:top; /* protect from super-large user text sizing */
border:0;
margin:0;
padding:0;
width:100%; /* grey-fill the entire width */
height:36px; /* set the overall height above the menu-bar */
background:#F3F3F3; /* a very light shade of grey */
}
#mastheadlogo {
float:left;
vertical-align:top;
border:0;
padding:0;
margin:6px 0 0 7px;
}
#focus { /* GRC's focus label */
position:absolute;
border:0;
margin:0;
padding:0;
top:15px;
left:301px;
width:121px;
height:13px;
}
#search { /* search button */
position:absolute;
border:0;
margin:0;
padding:0;
top:7px;
right:6px;
width:60px;
height:19px;
}
#text { /* search text field */
position:absolute;
border:1px solid #404040;
margin:0;
padding:0 0 0 2px;
top:7px;
right:65px;
width:12em;
/* height:1.215em; we'll define this at the bottom of our style sheet */
font-size:14px !important;
background:#fefefe;
}
#yah { /* the "You are here" label graphic */
position:absolute;
top:5px;
right:99px;
width:87px;
height:9px;
}
/*========================= TOP OF THE MENU CASCADE =========================*/
.menu {
position:relative; /* establish a menu-relative positioning context */
float:left; /* play nicely with others */
margin:0;
padding:0;
border:0;
height:18px; /* the menu's overall height */
width:100%; /* we always want our menu to fill the available space */
background:#f3f3f3;
font-family: Verdana, Arial, Helvetica, sans-serif;
font-size:12px; /* this (and also below) sets the menu's font size */
border-bottom:1px solid black; /* give us a black border underneath */
}
.menu img {
vertical-align: top; /* prevent images from being pushed down by text */
}
.menu ul {
padding:0;
margin:0;
border:0;
list-style-type:none; /* we don't want to view the list as a list */
line-height:1.5em; /* globally set the menu's item spacing. note */
} /* this must be 1.0 or 1.5 or 2.0 for Mozilla */
.menu li {
float:left; /* this creates the side-by-side array of top-level buttons */
position:relative; /* create local positioning contexts for each button */
margin:0;
}
.menu ul li table {
margin:-1px 0; /* IE5 needs -1px top and bottom table margins */
m\argin:0; /* re-zero the table margins for everyone but IE5 */
border-collapse:collapse; /* IE5 needs this for the sub-menus to work */
font-size:12px; /* this sets the base font size for our entire menu */
}
.drop {
display:block;
padding:0px 0.33em; /* this sets the l/r margins for our menu item */
margin:0;
text-align:right; /* this right alignment goes with the float:left below */
cursor:pointer; /* IE tries to switch back to an I-beam, don't let it */
cursor:hand; /* IE5 only knows about "hand", so set it both ways */
}
.drop span { /* this simultaneously left and right aligns the text and */
float:left; /* the >> in the drop-down menus which link to sub-menus */
}
.rightmenu {
position:relative; /* establish a local positioning context for YAH label */
float:right; /* and right-align it at the top of our page */
}
#research { /* this rightmost "Research" button must be positioned */
position:absolute; /* absolutely so that the YAH (you are here) text */
top:0px; /* label will slide underneath it under Opera v8.54 */
left:364px; /* which has a z-order sequencing bug with abs-pos elements */
}
/*======================== TOP LEVEL MENU DEFINITIONS ========================*/
.menu ul li ul {
display:none; /* initially hide the entire list hierarchy */
padding:1px; /* this is our box border width */
}
.menu ul li a,
.menu ul li a:visited { /* unselected top-level menu items */
display:block;
float:left;
text-decoration:none;
height:18px;
}
.menu ul li:hover a,
.menu ul li a:hover { /* selected top-level menu items */
border-top:1px solid #000; /* these 2 lines create the push-in illusion */
height:16px;
}
/*======================== 2ND LEVEL MENU DEFINITIONS ========================*/
.menu ul li:hover ul,
.menu ul li a:hover ul { /* 2nd level drop-down box */
display:block;
position:absolute;
margin:0;
top:18px; /* place us just up underneath the top-level images */
left:-1px; /* left-align our drop-down to the previous button border */
height:auto; /* the drop-down height will be determiend by line count */
width:13.5em;
color:black; /* this sets the unselected-text color */
background:black; /* this sets our menu's effective "border" color */
}
.menu ul li:hover ul.leftbutton,
.menu ul li a:hover ul.leftbutton {/* our first dropdown should not be skewed */
left:0px;
}
.menu ul li:hover ul.skinny,
.menu ul li a:hover ul.skinny { /* 2nd level skinny drop-down box */
width:8.08333em; /* with a 12px default font, this is 97px width (97/12) */
}
.menu ul.rightmenu li:hover ul,
.menu ul.rightmenu li a:hover ul { /* 2nd level neighborhood drop-down box */
left:auto;
right:0; /* nudge the right menu right to line up under the border */
}
* html .menu ul.rightmenu li a:hover ul { /* IE5/6 needs a tweak here */
right:-1px;
}
.menu ul li:hover ul li a,
.menu ul li a:hover ul li a { /* 2nd level unselected items */
border:0;
margin:0;
padding:0;
height:auto;
color:#000; /* this sets the unselected drop-down text color */
background:#d8d8d8; /* this sets the drop-down menu background color */
width:13.5em;
}
.menu ul li:hover ul li:hover a,
.menu ul li a:hover ul li a:hover { /* 2nd level selected item */
color:black;
background:white;
}
.menu ul li:hover ul.skinny li a,
.menu ul li a:hover ul.skinny li a,
.menu ul li:hover ul.skinny li a:hover,
.menu ul li a:hover ul.skinny li a:hover { /* 2nd level un+selected items */
width:8.08333em;
}
/*======================== 3RD LEVEL MENU DEFINITIONS ========================*/
.menu ul li:hover ul li ul,
.menu ul li a:hover ul li a ul { /* hide inactive 3rd-level menus */
visibility:hidden;
}
.menu ul li:hover ul li:hover ul,
.menu ul li a:hover ul li a:hover ul { /* 3rd level drop-down box */
visibility:visible;
position:absolute;
margin-top:-1px; /* bring the top edge of the 3rd level menu up one */
top:0;
left:8.08333em;
width:14em;
}
.menu ul li:hover ul li:hover ul li a,
.menu ul li a:hover ul li a:hover ul li a { /* 3rd level unselected items */
width:14em;
background:#d8d8d8;
}
.menu ul li:hover ul li:hover ul li a:hover,
.menu ul li a:hover ul li a:hover ul li a:hover { /* level3 selected items */
width:14em;
background:white;
}
#text { /* the Mac's standard Safari browser will not see this code */
height:1.215em;# /* ... but every other browser will and should */
} /* Safari barfs on the illegal pound sign (#) after the rule's property val */
<ul class="nav">
<li>
<a href="#">Menu 1</a>
<ul>
<li><a href="#">Sub Menu Item</a></li>
<li><a href="#">Sub Menu Item</a></li>
<li><a href="#">Sub Menu Item</a></li>
</ul>
</li>
<li>
<a href="#">Menu 2</a>
<ul>
<li><a href="#">Sub Menu Item</a></li>
<li><a href="#">Sub Menu Item</a></li>
<li><a href="#">Sub Menu Item</a></li>
</ul>
</li>
<li>
<a href="#">Menu 3</a>
<ul>
<li><a href="#">Sub Menu Item</a></li>
<li><a href="#">Sub Menu Item</a></li>
<li><a href="#">Sub Menu Item</a></li>
</ul>
</li>
</ul>
* {font-family: "Segoe UI", Tahoma;}
ul.nav {border-bottom: 1px solid #999;}
ul.nav li a {display: block; text-decoration: none; color: #333; padding: 5px; border: 1px solid #fff;}
ul.nav > li:hover {border: 1px solid #666; border-bottom: 1px solid #fff;}
ul.nav li a:hover {background: #ccc; border: 1px solid #999;}
ul.nav > li {display: inline-block; position: relative; border: 1px solid #fff;}
ul.nav > li ul {display: none; position: absolute; left: -1px; width: 150px; border: 1px solid #666; border-top-color: #fff; margin-top: 1px;}
ul.nav > li:hover ul {display: block;}
ul.nav > li ul li {display: block;} /* Vertical Menu */
ul.nav > li ul li {display: inline-block;} /* Horizontal Menu */
With ul.menu being the parent of all the others, but differing from your html approach in this : the submenus (ul
tags) are inside a parent's menu item (li
tag), which is more consistent with html requirements (a w3 recommendation, a question, or just test it in the validator).
So your example would become the following :
<div class="sidebar1" align="center">
<ul class="nav">
<li><a href="index.html">Home</a></li>
<li><a href="#">Products</a>
<ul class="productnav">
<li><a href="#">Products Overview</a></li>
<li><a href="#">Unibook Enterprise</a></li>
<li><a href="#">Unibook Standard</a></li>
<li><a href="#">Univoice 2.0</a></li>
<li><a href="#">Univoice lite</a></li>
<li><a href="#">Pricing</a></li>
<li><a href="#">Demo</a></li>
</ul>
</li>
<li><a href="#">Solutions</a></li>
<li><a href="#">Markets</a></li>
<li><a href="#">About UDI</a></li>
<li><a href="#">Contact Us</a></li>
</ul>
And the css I would use (even though you could strip the sizes, as long as they're all the same, I think) :
.nav li
{
position:relative;
float:left;
width:180px;
height:30px;
padding:0;
margin:0;
list-style: none;
}
.nav ul
{
display:none;
position:absolute;
padding:0;
margin:5px 0 0 0;
}
.nav ul li ul
{
left:100%;
top:0;
margin:0px;
}
/* hiding or showing on second generations */
.nav li:hover ul ul, .nav li:hover ul ul ul
{
display: none;
}
.nav li:hover ul, .nav ul li:hover ul, .nav ul ul li:hover ul
{
display: block;
}
This works on up to three recursive levels of ul
s in your ul.nav
, but you could expand it as much as you'd want by modifying the selectors of the two last css blocks.
But I still think that replacing the :hover
with a .over
class that appears on hover with hover events in javascript gives a better feeling, because you can set a timeout to keep the menu shown for a short moment after having hovered it. Allows for more natural moves with your pointer when navigating to a sub-menu, with the css approach you have to stay inside the li
tags.