2

I'm trying to create a navigation bar using AngularJS. I need to show and hide the submenu 'div.farm-links' on mouseover and mouseleave respectively on 'div.menu-links'.

I'm supposed to delay the mouseover on 'menu-links' by 0.5 sec, and similarily on mouseleave, the effect should happen after 0.5 sec. But somehow, this doesn't seem to work.

Could you please help me correct this? Also, is that possible to achieve using CSS only?

angular.module('topNavApp', ['ngAnimate']).controller('navCtrl', ['$scope', '$timeout', function($scope, $timeout){
  $scope.pageData = {  
    "allChildList":[  
      {  
         "pageExist":true,
         "pageTitle":"About Abc",
         "pagePath":"http://www.yahoo.com",
         "openNewTab":true,
         "hideInTabletNav":true,
         "hideInMobileNav":true,
         "secondLevelChildList":[  
            {  
               "pageExist":true,
               "pageTitle":"News",
               "pagePath":"/content/myloc/about-Abc/news.html",
               "openNewTab":false,
               "thirdLevelChildList":[  

               ],
               "multiple":true,
               "thirdLevelPageExist":true
            },
            {  
               "pageExist":true,
               "pageTitle":"Company",
               "pagePath":"/content/myloc/about-Abc/company.html",
               "openNewTab":false,
               "thirdLevelChildList":[  
                  {  
                     "pageExist":true,
                     "pageTitle":"Strategy",
                     "pagePath":"/content/myloc/about-Abc/company/strategy.html",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"Mission Vision Values",
                     "pagePath":"/content/myloc/about-Abc/company/missionvisionvalues.html",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"Leadership",
                     "pagePath":"/content/myloc/about-Abc/company/leadership.html",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"Org Chart",
                     "pagePath":"http://mysite/pages/OrgChart.aspx",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"Corporate Responsibility",
                     "pagePath":"http://myloc2/who/global-impact",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"History",
                     "pagePath":"https://usa.Abc.com/about-Abc/our_business/history-of-Abc.html",
                     "openNewTab":true
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"Products",
                     "pagePath":"http://myloc2/who/products",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"Investor Info",
                     "pagePath":"http://investor.Abc.com/",
                     "openNewTab":true
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"View All",
                     "pagePath":"/content/myloc/about-Abc/company/view-more.html",
                     "openNewTab":false
                  }
               ],
               "multiple":true,
               "thirdLevelPageExist":true
            },
            {  
               "pageExist":true,
               "pageTitle":"Community",
               "pagePath":"/content/myloc/about-Abc/community.html",
               "openNewTab":false,
               "thirdLevelChildList":[  
                  {  
                     "pageExist":true,
                     "pageTitle":"Diversity + Inclusion",
                     "pagePath":"/content/myloc/about-Abc/community/diversity-and-inclusion.html",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"Giving Back",
                     "pagePath":"http://myloc2/working/giving-back/Pages/default.aspx",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"Ideas Community",
                     "pagePath":"/content/myloc/about-Abc/initiatives/ideas.html",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"Other Communities",
                     "pagePath":"http://myloc2/working/get-involved/Pages/default.aspx",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"View All",
                     "pagePath":"/content/myloc/about-Abc/community/view-all-community.html",
                     "openNewTab":false,
                     "hideInDesktopNav":true
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"myloc Transformation",
                     "pagePath":"/content/myloc/about-Abc/community/transformation.html",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"Calendar",
                     "pagePath":"/content/myloc/about-Abc/community/Calendar.html",
                     "openNewTab":false
                  }
               ],
               "multiple":true,
               "thirdLevelPageExist":true
            },

         ],
         "columnClass":"0",
         "multiple":true,
         "secondLevelPageExist":true
      },
      {  
         "pageExist":true,
         "pageTitle":"Offices",
         "pagePath":"http://www.yahoo.com",
         "openNewTab":true,
         "hideInDesktopNav":true,
         "hideInTabletNav":true,
         "hideInMobileNav":true,
         "secondLevelChildList":[  
            {  
               "pageExist":true,
               "pageTitle":"Locations",
               "pagePath":"/content/myloc/offices/locations.html",
               "openNewTab":false,
               "thirdLevelChildList":[  
                  {  
                     "pageExist":true,
                     "pageTitle":"Ashburn",
                     "pagePath":"/content/myloc/offices/locations/ashburn.html",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"Austin",
                     "pagePath":"/content/myloc/offices/locations/austin.html",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"Bangalore",
                     "pagePath":"/content/myloc/offices/locations/bangalore.html",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"Denver",
                     "pagePath":"/content/myloc/offices/locations/denver.html",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"Dubai",
                     "pagePath":"/content/myloc/offices/locations/dubai.html",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"Foster City",
                     "pagePath":"/content/myloc/offices/locations/foster-city.html",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"San Francisco",
                     "pagePath":"/content/myloc/offices/locations/san-francisco.html",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"Miami",
                     "pagePath":"/content/myloc/offices/locations/miami.html",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"Singapore - Singpost",
                     "pagePath":"/content/myloc/offices/locations/singapore-singpost.html",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"Singapore - Robinson Road",
                     "pagePath":"/content/myloc/offices/locations/singapore-robinson-road.html",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"View All",
                     "pagePath":"http://myloc.trusted.Abc.com/content/myloc/offices/locations.html",
                     "openNewTab":true
                  }
               ],
               "multiple":true,
               "thirdLevelPageExist":true
            },
            {  
               "pageExist":true,
               "pageTitle":"Quick Links",
               "pagePath":"/content/myloc/offices/quick-links.html",
               "openNewTab":true,
               "hideInDesktopNav":true,
               "hideInMobileNav":true,
               "thirdLevelChildList":[  
                  {  
                     "pageExist":true,
                     "pageTitle":"Copy Centers",
                     "pagePath":"/content/myloc/offices/quick-links/copy-centers.html",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"Floor Maps",
                     "pagePath":"/content/myloc/offices/quick-links/floor-maps.html",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"Food Services",
                     "pagePath":"/content/myloc/offices/quick-links/food-services.html",
                     "openNewTab":false
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"View All",
                     "pagePath":"/content/myloc/offices/quick-links/view-all.html",
                     "openNewTab":false
                  }
               ],
               "multiple":true,
               "thirdLevelPageExist":true
            },
            {  
               "pageExist":true,
               "pageTitle":"Facilities Help",
               "pagePath":"/content/myloc/offices/facilities-help.html",
               "openNewTab":false,
               "thirdLevelChildList":[  
                  {  
                     "pageExist":true,
                     "pageTitle":"Submit Request",
                     "pagePath":"http://servicerequest",
                     "openNewTab":true
                  },
                  {  
                     "pageExist":true,
                     "pageTitle":"View All",
                     "pagePath":"/content/myloc/offices/facilities-help/view-all-facilities-help.html",
                     "openNewTab":false,
                     "hideInDesktopNav":true
                  }
               ],
               "multiple":true,
               "thirdLevelPageExist":true
            },
            {  
               "pageExist":true,
               "pageTitle":"View All",
               "pagePath":"/content/myloc/offices/view-all-offices.html",
               "openNewTab":false,
               "hideInDesktopNav":true,
               "thirdLevelChildList":[  

               ],
               "thirdLevelPageExist":false
            }
         ],
         "columnClass":"3",
         "multiple":true,
         "secondLevelPageExist":true
      },
      {  
         "pageExist":true,
         "pageTitle":"Functions",
         "pagePath":"https://www.google.com",
         "openNewTab":true,
         "hideInDesktopNav":true,
         "hideInTabletNav":true,
         "hideInMobileNav":true,
         "secondLevelChildList":[  

         ],
         "columnClass":"1",
         "multiple":true,
         "secondLevelPageExist":true
      },
      {  
         "pageExist":true,
         "pageTitle":"My HR",
         "pagePath":"/content/myloc/my-hr.html",
         "openNewTab":false,
         "secondLevelChildList":[  

         ],
         "columnClass":"1",
         "multiple":true,
         "secondLevelPageExist":true
      },
      {  
         "pageExist":true,
         "pageTitle":"Tools",
         "pagePath":"/content/myloc/tools.html",
         "openNewTab":true,
         "secondLevelChildList":[  

         ],
         "columnClass":"1",
         "multiple":true,
         "secondLevelPageExist":true
      }
   ]
};
  $scope.showDiv = function(){
 $timeout(function(){
   this.hovering = true;
 }, 500);
  
  };
  $scope.hideDiv = function(){
 $timeout(function(){
   this.hovering = false;
  }, 500);
  };
}]);
.hiding-div{
 display: inline-block;
 padding: 10px;
 margin: 10px;
}

.menu-link{
 text-decoration: none;
}

.menu-link:hover{
 color: #AB09AF;
}

.farm-links{
 position: absolute;
 top: 50px;
 height: 400px;
 width: 700px;
 border: 1px solid lightgrey;
 padding: 5px;
 display: flex;
 word-wrap: flex;
 column-count: 4;
}


.groups-links{
 display: inline-block;
 margin-right: 60px;

}

.group-title{
 color: grey;
 text-decoration: none;
}

.group-links{
 list-style: none;
}

.second-link{
 margin-left: -40px;
}

.second-link > a{
 text-decoration: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
<nav ng-app="topNavApp" ng-controller="navCtrl" class="nav">
  <div class="nav-center">
 <!--<li ng-repeat="obj in pageData.allChildList" ng-model="parentNav" ng-mouseover="parentNav=true" ng-mouseleave="parentNav=false"> -->
 <div ng-repeat="obj in pageData.allChildList" class="hiding-div" ng-mouseover="showDiv()" ng-mouseleave="hideDiv()" > 
   <div>
  <a ng-href="{{obj.pagePath}}" class="main-link multiple menu-link">{{obj.pageTitle}}</a>
  <!--<span class="main-link mobile" aria-labelledby="{{obj.pageTitle}}" aria-expanded="false">{{obj.pageTitle}}</span>-->

  <!--<span ng-repeat="child in obj.secondLevelVoList" class="childNav" ng-show="parentNav">--> 
  <div class="farm-links" ng-show="hovering">
    <!--<a class="prev-link" aria-labelledby="{{obj.pagetitle}}">{{obj.pageTitle}}</a>-->
    <div ng-repeat="child in obj.secondLevelChildList" class="groups-links">
   <a ng-href="{{child.pagePath}}" class="group-title">{{child.pageTitle}}</a>
   <!--<span class="group-title mobile" aria-expanded="false">{{child.pageTitle}}</span>-->
   <ul ng-repeat="subchild in child.thirdLevelChildList" class="group-links">
     <li class="second-link">
    <a ng-href="{{subchild.pagePath}}">{{subchild.pageTitle}}</a>
     </li>
   </ul>
    </div>
  </div>
   </div>
 </div>
  </div>
</nav>
Sunny
  • 902
  • 3
  • 18
  • 41
  • I don't know why I'm getting a script error here. Though the same file, runs perfectly fine in my local setup! – Sunny Aug 08 '17 at 15:53
  • https://docs.angularjs.org/api/ngAnimate -> CSS Staggering Animations? – Brian Aug 08 '17 at 16:01

2 Answers2

2

It's impossible to implement via pure CSS. The issue is in your this.hovering variable, in your case it should be $scope.hovering instead.

$scope.showDiv = function() {
  $timeout(function() {
    $scope.hovering = true;
  }, 500);      
};
$scope.hideDiv = function() {
  $timeout(function() {
    $scope.hovering = false;
  }, 500);
};

UPDATE

'$scope.hovering' shows all the submenus instead of showing up only the corresponding submenu. How do we fix that?

Just update the following rows:

HTML:

<div ng-repeat="obj in pageData.allChildList" class="hiding-div" ng-mouseover="showDiv(obj)" ng-mouseleave="hideDiv(obj)"> 
...
<div class="farm-links" ng-show="obj.hovering">

Controller:

$scope.showDiv = function(obj) {
  $timeout(function() {
    obj.hovering = true;
  }, 500);      
};
$scope.hideDiv = function(obj) {
  $timeout(function() {
    obj.hovering = false;
  }, 500);
};

Here we are passing current obj from ng-repeat to $scope.showDiv and $scope.showDiv functions, and then we set a new object property like this: obj.hovering = true; or obj.hovering = false;. And here ng-show="obj.hovering" we are showing/hiding this element based on new obj.hovering property value.

P.S.
  • 15,970
  • 14
  • 62
  • 86
  • '$scope.hovering' shows all the submenus instead of showing up only the corresponding submenu. How do we fix that? – Sunny Aug 08 '17 at 16:05
  • It doesn't seem to work as well! Throws an error 'obj is not defined'. – Sunny Aug 08 '17 at 16:35
  • Sorry, my bad. It works fine! I missed obj at one place! – Sunny Aug 08 '17 at 16:56
  • @Sunny, nice to hear, that it helps you! If it's really useful, any up votes would be great =) – P.S. Aug 08 '17 at 17:13
  • Thanks a lot! I'd also asked another question. Do you mind looking into it? https://stackoverflow.com/questions/45574360/show-a-link-based-on-a-condition-in-angularjs – Sunny Aug 08 '17 at 17:19
  • @Sunny, i looked through the question, but Brian already gave an answer. Is it OK for you? – P.S. Aug 08 '17 at 17:24
2

You have to define hovering on $scope. You can use an array to show the corresponding rows on ng-repeat

JS:

$scope.hovering=[];
$scope.showDiv = function(index) {
  $timeout(function() {
    $scope.hovering[index] = true;
  }, 500);      
};
$scope.hideDiv = function(index) {
  $timeout(function() {
    $scope.hovering[index] = false;
  }, 500);
};

HTML:

<div ng-repeat="obj in pageData.allChildList" class="hiding-div" ng-mouseover="showDiv($index)" ng-mouseleave="hideDiv($index)" > 
      <div>
Vivz
  • 6,625
  • 2
  • 17
  • 33