GRC CSS Menu System
This was created by Steve Gibson, with the help of numerous volunteers in newsgroups. The goal was to create a navigational menu system, without using any javascript. Steve regularly preaches that “scripting is bad” and that it should be disabled by default in all browsers. He couldn't implement a menu system on his site and use javascript for this reason.
His result is listed below, and it is freely available for the public to use.
cssmenu.css
/*============================================================================== 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 */
External Links
- http://www.grc.com/menu2/invitro.htm (you can see it in action here)