An experimental push menu with multi-level functionality that allows endless nesting of navigation elements.
For sure you are familiar with the off-canvas navigation on mobile apps and the implementations for responsive websites like the one by David Bushell.
We tried to explore the possibility of creating a nested multi-level
menu, something that could be quite useful for menus with lots of
content (like navigations of online stores). The result is a “push” menu
that can (theoretically) contain infinite nested sub-menus. When
opening a sub-level, the whole navigation pushes the content more,
allowing a slice of the parent menu to be visible. Optionally, this
slice can be visible or not, in which case the sub-menu will simply
cover its parent.
Working with nested structures is quite tricky because when we, for
example, move the parent then all children will of course move as well.
So we are using a couple of tricks that will maintain the right 3D
translates for the sub-menus and their children. The main idea is to
increment the value for the translate so that we guarantee that the
sub-levels are not shown once we push everything a bit more for showing
the slices of the parents. This is of course not necessary in the case
where the sub-menu is covering the parent menu.Please note that we are using 3D Transforms which only work in modern browsers. You will find a fallback example for non-supporting browsers in the end of the component.css file where we simply show the first level menu. The same we do for the no JS case.
We are using the following nested structure for the menu:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| <!-- mp-menu --> < nav id = "mp-menu" class = "mp-menu" > < div class = "mp-level" > < h2 class = "icon icon-world" >All Categories</ h2 > < ul > < li class = "icon icon-arrow-left" > < a class = "icon icon-display" href = "#" >Devices</ a > < div class = "mp-level" > < h2 class = "icon icon-display" >Devices</ h2 > < ul > < li class = "icon icon-arrow-left" > < a class = "icon icon-phone" href = "#" >Mobile Phones</ a > < div class = "mp-level" > < h2 >Mobile Phones</ h2 > < ul > < li >< a href = "#" >Super Smart Phone</ a ></ li > < li >< a href = "#" >Thin Magic Mobile</ a ></ li > < li >< a href = "#" >Performance Crusher</ a ></ li > < li >< a href = "#" >Futuristic Experience</ a ></ li > </ ul > </ div > </ li > < li class = "icon icon-arrow-left" > <!-- ... --> </ li > < li class = "icon icon-arrow-left" > <!-- ... --> </ li > </ ul > </ div > </ li > < li > <!-- ... --> </ li > <!-- ... --> </ ul > </ div > </ nav > <!-- /mp-menu --> |
Normally, we would have used fixed positioning for a menu of this kind but since there is quite an peculiar “problem” with that (transforms will make it behave like an absolute positioned element), we’ll have to use absolute positioning which will leave us with some unwanted behavior of the site (scrolling of menu and dependence of document height). So we’ve used a little trick to avoid the menu being scrollable or to be cut off if the site’s content is too short by using the following page structure:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| < div class = "container" > <!-- Push Wrapper --> < div class = "mp-pusher" id = "mp-pusher" > <!-- mp-menu --> < nav id = "mp-menu" class = "mp-menu" > <!-- ... --> </ nav > <!-- /mp-menu --> < div class = "scroller" > <!-- this is for emulating position fixed of the nav --> < div class = "scroller-inner" > <!-- site content goes here --> </ div > </ div > <!-- /scroller-inner --> </ div > <!-- /scroller --> </ div > <!-- /pusher --> </ div > <!-- /container --> |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| html, body, .container, .scroller { height : 100% ; } .scroller { overflow-y: scroll ; } .scroller, .scroller-inner { position : relative ; } .container { position : relative ; overflow : hidden ; background : #34495e ; } |
This is how the plugin can be called:
1
| new mlPushMenu( document.getElementById( 'mp-menu' ), document.getElementById( 'trigger' ) ); |
1
2
3
4
| Or, if the submenus should cover the previous levels: new mlPushMenu( document.getElementById( 'mp-menu' ), document.getElementById( 'trigger' ), { type : 'cover' } ); |
We hope you enjoy this menu and find it useful.
by: Mary Lou (Manoela Ilic)
source: http://tympanus.net/codrops/2013/08/13/multi-level-push-menu/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+tympanus+%28Codrops%29
0 komentar:
Post a Comment