jQuery Arbitrarily-prioritized Responsive Navigation - Priority Navigation
File Size: | 42.7 KB |
---|---|
Views Total: | 1059 |
Last Update: | |
Publish Date: | |
Official Website: | Go to website |
License: | MIT |
A responsive & space-saving jQuery navigation menu plugin that allows for prioritization ordering independent from menu ordering. The goal is to hide the less important items behind a “more” link if there's no enough space to hold the whole navigation menu. The less important items are revealed when the user clicks the “more” link.
How to use it:
1. Create a list of menu items for the navigation and use the data-priority
attribute to specify the priority for each item.
<nav> <ul> <li data-priority="0"> <a href="#">Priority-Navigation Demo</a> </li> <li data-priority="8"> <a href="#">Link 1</a> </li> <li data-priority="1"> <a href="#">Link 2</a> </li> <li data-priority="4"> <a href="#">Link 3</a> </li> <li data-priority="2"> <a href="#">Link 4</a> </li> <li data-priority="3"> <a href="#">Link 5</a> </li> <li data-priority="5"> <a href="#">Link 6</a> </li> <li data-priority="7"> <a href="#">Link 7</a> </li> <li data-priority="6"> <a href="#">Link 8</a> </li> </ul> </nav>
2. Include jQuery library and the jQuery Priority Navigation plugin at the bottom of the webpage.
<script src="jquery.min.js"></script> <script src="src/priority-navigation.js"></script>
3. Initialize the plugin by calling the function on the menu list.
$("nav ul").prioritize({ // Shown in the last position when the menu has been truncated more: "More", // Shown in the last position when the menu has been opened less: "Less", // Shown when the menu has been truncated to a single item menu: "Menu" });
4. The sample CSS to style the navigation menu.
body > nav { width: 100%; } body > nav ul { font-size: 0; padding: 0; white-space: nowrap; list-style-type: none; } body > nav ul > li { font-size: 1rem; display: inline-block; white-space: nowrap; text-align: center; list-style-type: none; vertical-align: middle; } body > nav ul > li a { display: block; text-decoration: none; padding: .75em; position: relative; line-height: 1em; } body > nav ul > li a:focus, body > nav ul > li a:hover { text-decoration: underline; } html body > nav ul.prioritized li[data-priority="more"], html body > nav ul.prioritized.opened li[data-priority="more"], html body > nav ul.prioritized:not(.opened) > li[data-priority="less"] { display: none; } html body > nav ul.prioritized.truncated > li[data-priority="more"] { display: inline-block; } html body > nav ul:not(.opened) > li[data-priority="0"], html body > nav ul.prioritized:not(.opened) > li.demoted, html body > nav ul.prioritized:not(.opened) > li[data-priority="less"] { position: absolute; overflow: hidden; clip: rect(0 0 0 0); height: 1px; width: 1px; margin: -1px; padding: 0; border: 0; } body > nav ul.prioritized.opened, body > nav ul:not(.prioritized) { white-space: normal; } body > nav ul.prioritized.opened li, body > nav ul:not(.prioritized) li { white-space: normal; } body > nav ul.prioritized.opened > li, body > nav ul.prioritized.opened > li.demoted, body > nav ul:not(.prioritized) > li { width: 50%; height: auto; position: static; } body > nav ul.prioritized.opened > li[data-priority="more"] { position: absolute; display: none !important; } body > nav { margin-top: 1.75rem; overflow: hidden; border-radius: .4rem; border: solid 1px #dddddd; width: calc(100% - 2px); } body > nav ul { overflow: hidden; } body > nav ul.prioritized:not(.opened) { width: 100%; display: table; padding: 0; margin-left: -2px; height: 2.5rem; height: calc(2.5rem - 2px); } body > nav > ul > li { font-family: sans-serif; text-transform: uppercase; font-size: .7rem; font-weight: bold; letter-spacing: .1em; overflow: visible; } body > nav ul.prioritized:not(.opened) li, html body > nav ul.prioritized.truncated > li[data-priority="more"] { display: table-cell; position: relative; vertical-align: middle; } body > nav ul.prioritized:not(.opened) li:not(.menu) a:before { content: ""; position: absolute; height: 2em; margin-top: -1em; top: 50%; width: 1px; background: #eeeeee; left: 0; } body > nav ul.prioritized.opened, body > nav ul.prioritized.opened li, body > nav ul:not(.prioritized), body > nav ul:not(.prioritized) li { margin: 0; } body > nav ul.prioritized.opened, body > nav ul:not(.prioritized) { position: relative } body > nav ul.prioritized.opened li, body > nav ul:not(.prioritized) li { vertical-align: top; margin-top: -1px; } body > nav ul.prioritized.opened li:before, body > nav ul:not(.prioritized) li:before { content: ""; position: absolute; height: 1px; width: 94%; background: #eeeeee; left: 3%; } body > nav ul.prioritized.opened li:nth-child(odd):not([data-priority="more"]):not([data-priority="less"]) a:before, body > nav ul:not(.prioritized) li:nth-child(odd):not([data-priority="more"]):not([data-priority="less"]) a:before { content: ""; position: absolute; height: 2em; width: 1px; background: #eeeeee; right: 0; top: 50%; margin-top: -1em; } body > nav ul > li a { padding: .75rem 1.25rem; color: #bbbbbb; transition: color.33s; overflow: visible; overflow: visible; } body > nav ul.prioritized> li[data-priority="more"] a:after, body > nav ul.prioritized> li[data-priority="less"] a:after { content: ""; display: inline-block; width: 0; height: 0; border-left: .9ex solid transparent; border-right: .9ex solid transparent; vertical-align: middle; margin: 0 0 .2em .25em; transition: border-color.33s } body > nav ul.prioritized> li[data-priority="more"] a::after { border-top: 1ex solid #bbbbbb; } body > nav ul.prioritized> li[data-priority="less"] a::after { border-bottom: 1ex solid #bbbbbb; } body > nav ul > li a:hover, body > nav ul > li a:focus { text-decoration: none; color: #666666; } body > nav ul.prioritized> li[data-priority="more"] a:hover::after, body > nav ul.prioritized> li[data-priority="more"] a:focus::after, body > nav ul.prioritized> li[data-priority="less"] a:hover::after, body > nav ul.prioritized> li[data-priority="less"] a:focus::after { border-top-color: #666666; border-bottom-color: #666666; } @media only screen and (max-width: 40em) { body > header > nav { margin-top: 0 } } @media only screen and (max-width: 30em) { body > nav ul.prioritized.opened > li, body > nav ul.prioritized.opened > li.demoted, body > nav ul:not(.prioritized) > li { width: 100%; } body > nav ul.opened li:nth-child(odd) a:before { display: none; } }
Change log:
2015-06-25
- fixed firefox with outerWidth() and removed the redundant
This awesome jQuery plugin is developed by matthornsby. For more Advanced Usages, please check the demo page or visit the official website.