/ Published in: CSS
Ruthsarian Menus - A CSS-based dropdown menu system
Expand |
Embed | Plain Text
@charset "iso-8859-1"; /******************************************************************************* * rMenu.css : 2006.10.17 : [email protected] * ------------------------------------------------------------------------------ * Ruthsarian Menus - A CSS-based dropdown menu system * * <insert long, boring ramble here> * * KNOWN BUGS * - Opera 7.23 and earlier have problems with absolutely positioned * elements positioned relative to a parent element. this causes a * problem with right-aligned horizontal menus. stay away from those * types of menus if you've got any reason to care about Opera 7.23 or * earlier versions. * * DEV NOTES * - setting position: relative; to ul.rMenu triggers a bug in Netscape 7 * and earlier that makes content jump as menus pop * - need to remember that when assigning multiple classes to an element * to list them left-to-right from most-specific to least-specific. * Otherwise IE/Mac flips out * - IE/Mac needs whitespace before <UL> and </UL> tags in the markup * otherwise very odd things can happen * - hasLayout should not be triggered on LI elements under IE7 * - IE/Mac has a selector bug where rMenu-v* and rMenu-h* rules * are applied to rMenu-v and rMenu-h elements. ie rMenu-vRight rules * get applied to rMenu-v elements. This is incorrect. * - if any parent element of the menu is a float it (or the parent of * the menu) needs to be relatively positioned. Otherwise the menu * is not rendered on the page. * * EXAMPLE HTML * <ul class="rMenu-hor rMenu" * ><li * ><a href="">Menu Item</a * > <ul class="rMenu-ver" * ><li * ><a href="">Menu Item</a * ></li * ><li * ><a href="">Menu Item</a * ></li * > </ul * ></li * ><li * ><a href="">Menu Item</a * ></li * > </ul> * * ------------------------------------------------------------------------------ * This stylesheet is released into the public domain. *******************************************************************************/ /******************************************************************************* * General Menu Mechanics * * Below is a set of rules which is applicable to any list used within * this dropdown menu system. You could apply just these rules and get * a basic dropdown menu system working just fine in FireFox, Opera, * Safari, and most other modern browsers. */ ul.rMenu, ul.rMenu ul, ul.rMenu li, ul.rMenu a { display: block; /* make these objects blocks so they're easier to deal with */ margin: 0; padding: 0; /* get rid of padding/margin values that these elements may have by default */ } ul.rMenu, ul.rMenu li, ul.rMenu ul { list-style: none; /* proper browsers don't require this because block elements (see previous rule set) cannot take any list-style property. meaning existing list-style properties are removed when they are set to display: block. IE7 seems to ignore this fact under certain situations so we explicitly set it here even though it's, technically, incorrect CSS (but it will validate). */ } ul.rMenu ul { display: none; /* hide the sub-menus until needed */ position: absolute; /* remove the sub-menus from the flow of the layout so when they pop they don't cause any disfiguration of the layout */ } ul.rMenu li { position: relative; /* so sub-menus position relative to their parent LI element */ } ul.rMenu li:hover { z-index: 999; /* make sure this and any sub-menus that pop appear above everything else on the page */ } ul.rMenu li:hover > ul { display: block; /* show the sub-menu */ } /******************************************************************************* * Extended Menu Mechanics * * These rules exist only for specific menu types, such as horizontal or * vertical menus, right or left aligned menus. */ ul.rMenu-hor li { float: left; width: auto; } ul.rMenu-hRight li { float: right; /* horizontal, right menus need their LI elements floated to get them over there */ } ul.rMenu-ver li { float: none; /* clear this so vertical sub-menus that are children of horizontal menus won't have their LI widths set to auto. */ } ul.rMenu-ver, ul.rMenu-ver ul { width: 10em; /* sub-menus need a defined width, especially vertical sub-menus. salt to taste. */ } ul.rMenu-wide { width: auto; /* apply this rule if you want the top-level menu to go as wide as possible. this is something you might want if your top-level is a vertical menu that spans the width of a column which has its width pre-defined. */ } ul.rMenu-vRight { float: right; /* use this to float a vertical menu right. */ } ul.rMenu-lFloat { float: left; /* use this to float a vertical menu left. */ } ul.rMenu-noFloat { float: none; /* this is to cover those cases where a menu is floated by default and you have a reason to not float it. such as a menu on the right side of the screen that you want to have drops going left but not floated. to be honest, i don't think this rule is needed. the clearfix hack will resolve renering issues associated with a floated menu anyways. */ } /******************************************************************************* * DROP POSITIONS * * This handles where sub-menus drops relative to the parent element. The same * attributes should be set in all rule sets in this section so that cascading * rules don't create problems. */ ul.rMenu-hor ul { top: auto; /* a value of 100% creates a problem in IE 5.0 and Opera 7.23 */ right: auto; left: auto; /* typically want a value of 0 here but set to auto for same reasons detailed above */ margin-top: -1px; /* so the top border of the dropdown menu overlaps the bottom border of its parent horizontal menu. */ } ul.rMenu-ver ul { left: 60%; right: auto; top: auto; margin-top: -0.5em; /* i prefer top: 80% but this creates a problem in iCab so negative top margin must be used. salt to taste. */ } ul.rMenu-vRight ul, ul.rMenu-hRight ul.rMenu-ver ul { left: -60%; right: auto; top: auto; margin-top: -0.5em; /* i prefer top: 80% but this creates a problem in iCab so negative top margin must be used. salt to taste. */ } ul.rMenu-hRight ul { left: auto; right: 0; /* this doesn't work in Opera 7.23 but 7.5 and beyond work fine. this means right-aligned horizontal menus break in Opera 7.23 and earlier. no workaround has been found. */ top: auto; margin-top: -1px; /* so the top border of the dropdown menu overlaps the bottom border of its parent horizontal menu. */ } /******************************************************************************* * PRESENTATION : General * * This is where the visual presentation of the menu is handled. If you try to * alter the borders width or location of placement pay close attention to the * notes provided with the existing CSS rules in this section. There are key * reasons behind borders and negative margins being placed where they are. */ ul.rMenu li a { border: solid 1px #99f /* border around all anchor tags */ } ul.rMenu-hor li { margin-bottom: 0; /* remove any negative bottom margin if the horizontal menu is child of a vertical menu */ margin-left: -1px; /* negative borders on LIs to make borders on child A elements overlap. they go here and not on the A element for compatibility reasons (IE6 and earlier) */ } ul.rMenu-h { padding-left: 1px ; /* compensate for the 1px left jog created by the above negative margin. */ } ul.rMenu-ver li { margin-left: 0; margin-top: -1px; /* same thing above except for vertical menus */ } ul.rMenu-ver { border-top: solid 1px #fff; /* ditto */ } ul.rMenu li a { padding: 2px 5px 3px; /* 2px top, 3px bottom always seems to provide the most visually balanced padding */ } ul.rMenu li a:link, ul.rMenu li a:hover, ul.rMenu li a:visited, ul.rMenu li a:active { text-decoration: none; } ul.rMenu li.sfhover a:active, ul.rMenu li:hover a:active { color: #fff; background-color: #c00; } ul.rMenu li { background-color: #ddf; /* default background color of menu items */ } ul.rMenu li:hover, ul.rMenu li.sfhover { background-color: #eda; /* background color for parent menu items of the current sub-menu. includes the sfhover class which is used in the suckerfish hack detailed later in this stylesheet. */ } ul.rMenu li a:hover { background-color: #ffc; } /******************************************************************************* * PRESENTATION : Expand * * the bits below implement a graphic to appear on those anchor elements which * have the rMenu-expand class assigned. this is something you have to do * manually on any LI element containing a UL element that is to be a dropdown * menu. there is no mechanism to do this automatically. * * the seemingly redundant CSS is done for reasons similar to the suckerfish * css. it's to deal with all sorts of nested menu issues. it'll work as far * as three levels deep, after that all bets off. */ ul.rMenu li.rMenu-expand a, ul.rMenu li.rMenu-expand li.rMenu-expand a, ul.rMenu li.rMenu-expand li.rMenu-expand li.rMenu-expand a { padding-right: 25px; background-image: url("expand-right.gif"); background-repeat: no-repeat; background-position: 100% 50%; } ul.rMenu-vRight li.rMenu-expand a, ul.rMenu-vRight li.rMenu-expand li.rMenu-expand a, ul.rMenu-vRight li.rMenu-expand li.rMenu-expand li.rMenu-expand a, ul.rMenu-hRight li.rMenu-expand a, ul.rMenu-hRight li.rMenu-expand li.rMenu-expand a, ul.rMenu-hRight li.rMenu-expand li.rMenu-expand li.rMenu-expand a { padding-right: 5px; padding-left: 20px; background-image: url("expand-left.gif"); background-repeat: no-repeat; background-position: -5px 50%; } ul.rMenu-hor li.rMenu-expand a { padding-left: 5px; /* reset padding */ padding-right: 15px; background-image: url("expand-down.gif"); background-position: 100% 50%; } ul.rMenu li.rMenu-expand li a, ul.rMenu li.rMenu-expand li.rMenu-expand li a, ul.rMenu li.rMenu-expand li.rMenu-expand li.rMenu-expand li a { background-image: none; padding-right: 5px; /* reset padding */ padding-left: 5px; /* reset padding */ } /******************************************************************************* * HACKS : General * * These are rules specifically targeted to resolve bugs/quirks that some * browser exhibit. */ * html ul.rMenu { display: inline-block; /* this is for IE/Mac. it forces IE/Mac to expand the element's dimensions to contain its floating child elements without a clearing element. */ /* \*/ display: block; /* override above rule for every other browser using IE/Mac backslash hack */ position: relative; /* IE 5.0/Mac needs this or it may clip the dropdown menus */ /* \*/ position: static;/* reset position attribute for IE/Win as it causes z-index problems */ } * html ul.rMenu ul { float: left; /* IE/Mac 5.0 needs this and IE/Win 6 and earlier don't show any problems with applying this rule. */ } ul.rMenu ul { background-color: #fff; /* IE/Win (includeing 7) needs this on an object that hasLayout so that it doesn't "look through" the menu and let any object (text) below the menu to gain focus, causing the menu to disappear. application of this rule does not cause any rendering problems with other browsers as the background color his covered by the menu itself. */ } * html ul.rMenu-ver li, * html ul.rMenu-hor li ul.rMenu-ver li { /* the second selector in this rule is there because of problems IE/Mac has with inheritance and what rules should take precedence. and to serve as a reminder on how to work around the issue if it's encountered again down the road. */ width: 100%; float: left; clear: left; /* IE6 (and earlier?) stick space below any LI in :hover state with a sub-menu. floating the LIs seems to work around this issue. But note that this also triggers hasLayout because we need a width of 100% on floats. But hasLayout on LIs breaks the menu in IE7. So we really need to be careful not to let floats get into anything other than IE6 and earlier. IE Mac seems to need this too for some other reason. */ } ul.rMenu-ver li a { min-width: 0; /* trigger hasLayout for IE7 on anchor elements. without hasLayout on anchors they would not expand the full width of the menu. this rule may not trigger hasLayour in later versions of IE and if you find this system broken in new versions of IE, this is probably the source. */ } * html ul.rMenu-ver li a { height: auto; /* triggers hasLayout for IE/Mac */ /* \*/ height: 100%; /* trigger hasLayout for IE6 and earlier. does not work for IE7 */ } * html ul.rMenu-h { /* hide from IE Mac \*/ padding-left: 2px; /* IE6 and earlier double the negative margins on the LI elements of horizontal menus. this is because the LIs float but the parent isn't floating. this can be fixed by floating rMenu-hor but I'd rather not float it so I just double up the padding used to compensate. */ } * html ul.rMenu-hor li { width: 6em; /* IE Mac doesn't do auto widths so specify a width for the sake of IE/Mac. Salt to taste. */ /* \*/ width: auto; /* now undo previous rule for non Macs by using the IE Mac backslash comment hack */ } /******************************************************************************* * HACKS : Suckerfish * * IE6 and earlier do not support the :hover pseudoclass and so javascript is * used to add the "sfhover" class of any LI element that the mouse is currently * over. This method is called suckerfish and you can read up on it at: * http://www.htmldog.com/articles/suckerfish/dropdowns/ * * NOTE: this allows for support of dropdown menus up to 3 levels deep. if you * want to support greather menu depth you need to alter these selectors. * read the above mentioned website for more info on how to do that. */ * html ul.rMenu li.sfhover { z-index: 999; } * html ul.rMenu li.sfhover ul ul, * html ul.rMenu li.sfhover ul ul ul { display: none; /* IE/Suckerfish alternative for browsers that don't support :hover state on LI elements */ } * html ul.rMenu li.sfhover ul, * html ul.rMenu li li.sfhover ul, * html ul.rMenu li li li.sfhover ul { display: block; /* ^ ditto ^ */ } /******************************************************************************* * HACKS : Clearfix * * Clearfix provides a means to for an element to contain all it's floated * children even if it's not normally tall enough to do so. For more information * on clearfix please see: * http://www.positioniseverything.net/easyclearing.html */ .clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } .clearfix { min-width: 0; /* trigger hasLayout for IE7 */ display: inline-block; /* \*/ display: block; /* Hide from IE Mac */ } * html .clearfix { /* \*/ height: 1%; /* Hide from IE Mac */ } /******************************************************************************/
You need to login to post a comment.
