Priority or Greedy navigation is a really nice way to show long navigation items on small screens. The idea is that navigation element is moved to drop-down selection menu when there is not enough space on the screen.
In this example we will create directive and we will use Angular Material Design Google library to achieve it and putting everything in nice Priority nav directive.
In this example we will create directive and we will use Angular Material Design Google library to achieve it and putting everything in nice Priority nav directive.
Tutorial Greedy navigation using Angular 7 and Material Design you can find here: https://www.coditty.com/code/greedy-navigation-using-angular-7-and-material-design
So let's first create HTML element
<nav flex="70" prionav hide-all-width="250" id="matang-top-navigation"> <div layout="row" class="prionav"> <md-button ng-repeat="menuItem in matang_menu_header" id="matang-header-nav-{{menuItem.ID}}" data-mid="{{menuItem.ID}}" href="{{menuItem.slug}}">{{menuItem.title}}</md-button> </div> </nav>
- hide-all-width is width in pixels where all element will be moved to drop down element (for small screens)
- prionav is directive name
OK, let's set up needed CSS:
#matang-top-navigation{ overflow: hidden; border: 0px solid white; position: relative; } .prionav{ width: 1000px; }
and now finally let's create directive:
app.directive('prionav',['$rootScope',function($rootScope){ return { restrict:"A,E", link:function(scope,element,attrs){ $rootScope.showPrioNavDrop = false; var recalcItemElementPosition= function(element,atts){ var movedObjects = []; // loop over all elements for (var i = 0; i < element[0].children[0].children.length; i++) { // if element is out of nav block or element width is less than added in atribute hide-all-width if( element[0].children[0].children[i].offsetLeft + element[0].children[0].children[i].offsetWidth > element[0].offsetWidth || element[0].offsetWidth < atts.hideAllWidth ){ document.getElementById(element[0].children[0].children[i].id).style.visibility = 'hidden'; $rootScope.showPrioNavDrop = true; // loop top menu root items for (var iel = 0; iel < appInfo.matang_menu_header.length; iel++) { // select matching element by id if(element[0].children[0].children[i].dataset.mid == appInfo.matang_menu_header[iel].ID){ movedObjects.push(appInfo.matang_menu_header[iel]); } } }else{ document.getElementById(element[0].children[0].children[i].id).style.visibility = 'visible'; } } scope.$apply(function(){ scope.prionavElements = movedObjects; }); if(movedObjects.length < 1){ $rootScope.showPrioNavDrop = false; } } setTimeout(function() { // call func on load recalcItemElementPosition(element,attrs); }, 0); window.onresize = function(event) { // call func on resize recalcItemElementPosition(element,attrs); } } }; }]);
and then finally we will create drop down button which could be placed next to prionav element
<div flex layout="row" layout-align="end center"> <md-menu> <md-button ng-show="showPrioNavDrop" aria-label="Open menu with custom trigger" class="md-icon-button" ng-click="$mdMenu.open()"><!-- ng-mouseenter="$mdMenu.open()" --> <md-icon md-menu-origin md-svg-icon="arrow-down-drop-circle-outline"></md-icon> </md-button> <md-menu-content ><!-- ng-mouseleave="$mdMenu.close()" --> <md-menu-item ng-repeat="item in prionavElements"> <md-button href="{{item.slug}}">{{item.title}}</md-button> </md-menu-item> </md-menu-content> </md-menu> </div>
and that is it :)