Steve Gibson 写了一个关于如何做 css 菜单的例子。他使用无序列表。
GRC 的无脚本纯 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 */