Auto hide/show navigation or toolbar on scroll is a popular feature especially when it comes to small screens. In angularJS 1.x this can be done with directive. So in order to show - hide toolbar on page scroll down or up we can do this:
In this case we are using material design built in toolbar and directive named hideShowToolbar is assigned to id:
In this case we are using material design built in toolbar and directive named hideShowToolbar is assigned to id:
<md-content layout="column" layout-fill id="main-content"> <md-toolbar hide-show-toolbar layout="row" layout-wrap toolbar="main" class="md-theme-indigo"> <!--... some toolbar elements--> </md-toolbar> </md-content>
The directive for auto hide toolbar on element scroll will look like this:
app.directive('hideShowToolbar',['$rootScope','$window',function($rootScope,$window){ return { restrict:'AE', link:function(scope, element, attr){ // get element which will be scrolled var scrollParent = angular.element(document.querySelector('md-content[md-scroll-y]')); // set var for last scroll and ofset var lastScroll = 0; var offset = 15; // get toolbar height var toolbarHeight = element[0].clientHeight; // move content from top for toolbar height scrollParent[0].style.paddingTop = toolbarHeight+'px'; // add class with css styles to tollbar element.addClass("hideShowToolbar"); // on parent scroll call fn to show/hide toolbar scrollParent.on('scroll', function(){ setTimeout(function() { showHideToolbar(); }, 250); }); function showHideToolbar(){ // get scroll pos var scrollNum = Math.round(scrollParent[0].scrollTop); //exit if it is less than ofset (delay) if(Math.abs(lastScroll - scrollNum) <= offset){ return; } // add remove class for scrolling if (scrollNum > lastScroll && scrollNum > toolbarHeight){ if(!element.hasClass("hideToolbar")){ element.removeClass("showToolbar"); element.addClass("hideToolbar"); } }else{ if(!element.hasClass("showToolbar")){ element.removeClass("hideToolbar"); element.addClass("showToolbar"); } } // set lastScroll to last scroll number lastScroll = scrollNum; } } } }]);
In case you are using window scroll try this directive:
app.directive('hideShowToolbar',['$rootScope','$window','$timeout',function($rootScope,$window,$timeout){ return { restrict:'AE', link:function(scope, element, attr){ $timeout(function(){ // get element which will be scrolled var contentEl = angular.element(document.querySelector('.wrapper-element')); // set var for last scroll and ofset var lastScroll = 0; var offset = 15; // get toolbar height var toolbarHeight = element[0].clientHeight; // move content from top for toolbar height //contentEl[0].style.paddingTop = toolbarHeight+'px'; document.getElementById("main-content").style.paddingTop = toolbarHeight+'px'; // add class with css styles to tollbar element.addClass("hideShowToolbar"); // on windows scroll window.onscroll = function() { showHideToolbar(); }; function showHideToolbar(){ // get scroll pos var scrollNum = window.scrollY; //exit if it is less than ofset (delay) if(Math.abs(lastScroll - scrollNum) <= offset){ return; } // add remove class for scrolling if (scrollNum > lastScroll && scrollNum > toolbarHeight){ if(!element.hasClass("hideToolbar")){ element.removeClass("showToolbar"); element.addClass("hideToolbar"); } }else{ if(!element.hasClass("showToolbar")){ element.removeClass("hideToolbar"); element.addClass("showToolbar"); } } // set lastScroll to last scroll number lastScroll = scrollNum; } }); } } }]);
And css will be used only to use animation for moving down/up navigation bar:
.hideShowToolbar{ -webkit-transition: all .5s ease-in-out !important; -moz-transition: all .5s ease-in-out !important; -o-transition: all .5s ease-in-out !important; transition: all .5s ease-in-out !important; position: fixed; top:0px; } .hideToolbar { -webkit-transform: translateY(-100%); -ms-transform: translateY(-100%); -o-transform: translateY(-100%); transform: translateY(-100%); } .showToolbar{ -webkit-transform: translateY(0%); -ms-transform: translateY(0%); -o-transform: translateY(0%); transform: translateY(0%); }