Hover Intent Menu

Allows for a gap in the menu on hover using hoverintent plugin.

by Paul Leech

HTML

<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
<script src="http://cherne.net/brian/resources/jquery.hoverIntent.minified.js"></script>
<nav class="navbar navbar-default" role="navigation">
  <div class="container-fluid">
    <!-- Brand and toggle get grouped for better mobile display -->
    <div class="navbar-header">
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
        <span class="sr-only">Toggle navigation</span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <a class="navbar-brand" href="#">Brand</a>
    </div>

    <!-- Collect the nav links, forms, and other content for toggling -->
    <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
      <ul class="nav navbar-nav">
        <li class="active"><a href="#">Link</a></li>
        <li class="dropdown">
            <a href="http://google.com" class="dropdown-toggle" data-toggle="dropdown">Dropdown 1<b class="caret"></b></a>
          <ul class="dropdown-menu">
              <li><a href="http://google.com/">Action</a></li>
            <li><a href="#">Another action</a></li>
            <li><a href="#">Something else here</a></li>
            <li class="divider"></li>
            <li><a href="#">Separated link</a></li>
            <li class="divider"></li>
            <li><a href="#">One more separated link</a></li>
          </ul>
        </li>
<li class="dropdown">
          <a href="#" class="dropdown-toggle" data-toggle="dropdown">Dropdown 2<b class="caret"></b></a>
          <ul class="dropdown-menu">
            <li><a href="#">Action</a></li>
            <li><a href="#">Another action</a></li>
            <li><a href="#">Something else here</a></li>
            <li class="divider"></li>
...

CSS

/* Just to Show the capability of having a 'gap' between the link and the dropdown-menu */
.dropdown-menu {
    top: 100px;
}
/* Very important for small devices */
.open > .dropdown-menu{
  display: block !important;
}

JavaScript

// jQuery hoverIntent is used. 
// You can use jquery-hover-delay.js instead if u wish.


var config = {
    timeout: 400,
    over: showMenu,
    out: hideMenu
};
$(' .dropdown').hoverIntent(config);

// mouseenter
function showMenu(){
    if($('.navbar-toggle').css('display') == 'none') {
        $(this).siblings().children('.dropdown-menu').hide();
        var dropdownMenu = $(this).find('.dropdown-menu');
        dropdownMenu.fadeIn(300);
    }
}
// mouseleave
function hideMenu() {
    if($('.navbar-toggle').css('display') == 'none') {
        var dropdownMenu = $(this).find('.dropdown-menu');
        dropdownMenu.fadeOut(300);
    }
}

// Optional: Make the first link a working link! 
// - expected behaviour on hover menus.
$('.dropdown').on('show.bs.dropdown', function () {
    if($('.navbar-toggle').css('display') == 'none') {
        var location = $(this).attr('href');
        window.location.href = location;
        return false;    
    }
})