Table of Contents

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 */