Ruthsarian Menus - A CSS-based dropdown menu system
@charset "iso-8859-1";
/*******************************************************************************
* rMenu.css : 2006.10.17 : [email protected]
* ------------------------------------------------------------------------------
* Ruthsarian Menus - A CSS-based dropdown menu system
*
*
*
* 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 Itema
* > /a
* >li
* >Menu Item</a
* >li
* > </ul
* >li
* >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 */
}
/******************************************************************************/