Infinite dropdown menu courtesy of Harry Roberts @csswizardry http://jsfiddle.net/csswizardry/Zj4eb/
A Pen by design8383 on CodePen.
<ul class="nav site-nav"> | |
<li><a href=#>Lorem</a></li><!-- | |
--><li><a href=#>Ipsum</a></li><!-- | |
--><li class=flyout> | |
<a href=#>Dolor</a> | |
<!-- Flyout --> | |
<ul class="flyout-content nav stacked"> | |
<li><a href=#>Foo Bar</a></li> | |
<li><a href=#>Bar Baz</a></li> | |
<li class="flyout-alt"> | |
<a href=#>Baz Foo</a> | |
<!-- Flyout --> | |
<ul class="flyout-content nav stacked"> | |
<li><a href=#>Foo Bar</a></li> | |
<li><a href=#>Bar Baz</a></li> | |
<li class="flyout-alt"> | |
<a href=#>Baz Foo</a> | |
<!-- Flyout --> | |
<ul class="flyout-content nav stacked"> | |
<li class="flyout-alt"> | |
<a href=#>Foo Bar</a> | |
<!-- Flyout --> | |
<ul class="flyout-content nav stacked"> | |
<li><a href=#>Bar Baz</a></li> | |
<li class="flyout-alt"> | |
<a href=#>Baz Foo</a> | |
<!-- Flyout --> | |
<ul class="flyout-content nav stacked"> | |
<li><a href=#>Bar Baz</a></li> | |
<li><a href=#>Baz Foo</a></li> | |
<li><a href=#>Foo Bar</a></li> | |
</ul> | |
</li> | |
<li><a href=#>Foo Bar</a></li> | |
</ul> | |
</li> | |
<li><a href=#>Bar Baz</a></li> | |
<li class="flyout-alt"> | |
<a href=#>Baz Foo</a> | |
<!-- Flyout --> | |
<ul class="flyout-content nav stacked"> | |
<li><a href=#>Bar Baz</a></li> | |
<li><a href=#>Baz Foo</a></li> | |
<li><a href=#>Foo Bar</a></li> | |
</ul> | |
</li> | |
</ul> | |
</li> | |
</ul> | |
</li> | |
</ul> | |
</li><!-- | |
--><li><a href=#>Sit</a></li><!-- | |
--><li><a href=#>Amet</a></li> | |
</ul> |
Infinite dropdown menu courtesy of Harry Roberts @csswizardry http://jsfiddle.net/csswizardry/Zj4eb/
A Pen by design8383 on CodePen.
/*------------------------------------*\ | |
$HOUSEKEEPING | |
\*------------------------------------*/ | |
*{ margin:0; padding:0; } | |
html{ | |
padding:5%; | |
font:1em/1.5 Georgia, serif; | |
overflow-y:scroll; | |
} | |
ul{ | |
margin-bottom:1.5em; | |
margin-left:1.5em; | |
} | |
a{ | |
text-decoration:none; | |
} | |
/*------------------------------------*\ | |
$NAV | |
\*------------------------------------*/ | |
/** | |
* Throw any `ul` or `ol` into horizontal mode, as per csswizardry.com/2011/09/the-nav-abstraction. | |
<ul class=nav> | |
<li><a href=/>Home</a></li> | |
<li><a href=/about>About</a></li> | |
<li><a href=/portfolio>Portfolio</a></li> | |
<li><a href=/contact>Contact</a></li> | |
</ul> | |
*/ | |
.nav{ | |
list-style:none; | |
margin-left:0; | |
} | |
.nav > li, | |
.nav > li > a{ | |
display:inline-block; | |
*display:inline; | |
zoom:1; | |
} | |
/** | |
* Create a vertically stacked nav by extending `.nav` with `.stacked`. | |
<ul class="nav stacked"> | |
<li><a href=/>Home</a></li> | |
<li><a href=/about>About</a></li> | |
<li><a href=/portfolio>Portfolio</a></li> | |
<li><a href=/contact>Contact</a></li> | |
</ul> | |
*/ | |
.stacked > li{ | |
display:list-item; | |
} | |
.stacked > li > a{ | |
display:block; | |
} | |
/*------------------------------------*\ | |
$FLYOUT | |
\*------------------------------------*/ | |
/** | |
* Flyouts are pieces of content that fly out of a parent when said parent is hovered. | |
* They typically appear bottom-left of the parent. | |
<div class=flyout> | |
Foo | |
<div class=flyout-content> | |
<h1>Lorem</h1> | |
<p>Ipsum</p> | |
</div> | |
</div> | |
*/ | |
.flyout, | |
.flyout-alt{ | |
position:relative; | |
} | |
.flyout-content{ | |
/* Position the flyouts off-screen. This is typically better than `display:none;`. */ | |
position:absolute; | |
top:100%; | |
left:-99999px; | |
/** | |
* Even though they are out of document flow, lots of nested flyouts can | |
* eventually force scroll bars to appear as they become taller than the viewport. | |
* We can undo this effect by giving them zero height. | |
*/ | |
height:0; | |
overflow:hidden; | |
} | |
/** | |
* Bring the flyouts into view when you hover their parents. | |
* Two different types of flyout; ‘regular’ (`.flyout`) and ‘alternative’ (`.flyout-alt`). | |
*/ | |
/* Regular flyouts sit all the way from the top, flush left. */ | |
.flyout:hover > .flyout-content{ | |
left:0; | |
} | |
/* Alternative flyouts sit all the way from the left, flush top. */ | |
.flyout-alt:hover > .flyout-content{ | |
top:0; | |
left:100%; | |
} | |
.flyout:hover > .flyout-content, | |
.flyout-alt:hover > .flyout-content{ | |
/* Give the flyouts their height back once they come into view. */ | |
height:auto; | |
overflow:visible; | |
} | |
/*------------------------------------*\ | |
$SITE-NAV | |
\*------------------------------------*/ | |
/** | |
* Site nav specific styling. | |
* Extends `.nav{}` | |
*/ | |
.site-nav{ | |
font-size:0.75em; | |
font-family:sans-serif; | |
} | |
.site-nav a{ | |
line-height:1; | |
padding:1em; | |
background-color:#09f; | |
color:#fff; | |
white-space:nowrap; | |
} | |
/*--- SITE-NAV FLYOUTS ---*/ | |
/** | |
* Site nav specific flyouts, extension of `.flyout`. | |
* Set up some styles to apply and persist when we hover things in the site nav. | |
* This allows us to keep parents highlighted as we hover their contained flyouts [1]. | |
*/ | |
.site-nav .flyout:hover > a /* [1] */, | |
.site-nav .flyout-alt:hover > a /* [1] */, | |
.site-nav a:hover{ | |
color:#435704; | |
background-color:#BADA55; | |
} | |
/** | |
* Add an indicator to any flyout parents in the site nav to show there’s a flyout. | |
*/ | |
.site-nav .flyout-alt > a:after{ | |
content:" »"; | |
} | |
/** | |
* Here we set up a load of shared borders on the site-nav specific flyouts. | |
* The code looks a little scattered but it allows us to cleverly share declarations: | |
* We set up a non-existent [1] solid [2] border on all sides of the relevant elements. | |
* We can now also change the style [2] and colour [3] of all borders in one go. | |
* Now we have set up border colours and styles, we need to just turn the desired borders ‘on’ [4]. | |
*/ | |
.site-nav a, | |
.site-nav .flyout-content{ | |
border:0 /* [1] */ | |
solid /* [2] */ | |
#fff /* [3] */; | |
} | |
.site-nav > li > a{ | |
border-left-width:1px; /* [4] */ | |
} | |
/* The first link in the site-nav doesn’t require a border at all. */ | |
.site-nav > li:first-child > a{ | |
border:none; | |
} | |
.site-nav .flyout-content{ | |
border-width:1px 0 0 1px; /* [4] */ | |
} | |
.site-nav .flyout-content a{ | |
border-bottom-width:1px; /* [4] */ | |
} | |
.site-nav .flyout-alt:hover > .flyout-content{ | |
/** | |
* To account for the 1px top border on the flyout containers, we need to | |
* bring the flyouts back up by 1px in this special instance. | |
*/ | |
top:-1px; | |
} |