2017-08-18 1 views
0

Bonjour,Navbar sensible avec Sub Navbar

Pardonnez-moi car mon vocabulaire de navigation n'est pas le meilleur. Si cette question prête à confusion, je m'en excuse.

Je travaille sur une barre de navigation qui doit être centrée sur la page à 768 pixels et plus. Les éléments de la navigation ouvrent (ou basculent peut-être) un sous-marin qui vit directement en dessous. Ces nav doivent également apparaître centrés sur la page.

J'ai été en mesure de travailler à travers la partie responsive de la barre de navigation, en alignant les éléments principaux verticalement et le menu sous-nav de chaque élément déployé ci-dessous, et je leur ai donné un retrait. Cela fonctionne bien.

Cependant, mon problème n'est pas le côté sensible, mais le comportement à une largeur supérieure à 768px. Qu'est-ce qui se passe est que basculer sous la navigation d'un menu pousse les autres éléments principaux en bas de la page ci-dessous le sous-nav.

Voici mon code:

$(document).ready(function() { 
 

 
    //stick in the fixed 100% height behind the navbar but don't wrap it 
 
    $('#slide-nav.navbar-inverse').after($('<div class="inverse" id="navbar-height-col"></div>')); 
 
    
 
    $('#slide-nav.navbar-default').after($('<div id="navbar-height-col"></div>')); 
 

 
    // Enter your ids or classes 
 
    var toggler = '.navbar-toggle'; 
 
    var pagewrapper = '#page-content'; 
 
    var navigationwrapper = '.navbar-header'; 
 
    var menuwidth = '100%'; // the menu inside the slide menu itself 
 
    var slidewidth = '80%'; 
 
    var menuneg = '-100%'; 
 
    var slideneg = '-80%'; 
 

 

 
    $("#slide-nav").on("click", toggler, function (e) { 
 

 
     var selected = $(this).hasClass('slide-active'); 
 

 
     $('#slidemenu').stop().animate({ 
 
      left: selected ? menuneg : '0px' 
 
     }); 
 

 
     $('#navbar-height-col').stop().animate({ 
 
      left: selected ? slideneg : '0px' 
 
     }); 
 

 
     $(pagewrapper).stop().animate({ 
 
      left: selected ? '0px' : slidewidth 
 
     }); 
 

 
     $(navigationwrapper).stop().animate({ 
 
      left: selected ? '0px' : slidewidth 
 
     }); 
 

 

 
     $(this).toggleClass('slide-active', !selected); 
 
     $('#slidemenu').toggleClass('slide-active'); 
 

 

 
     $('#page-content, .navbar, body, .navbar-header').toggleClass('slide-active'); 
 

 

 
    }); 
 

 

 
    var selected = '#slidemenu, #page-content, body, .navbar, .navbar-header'; 
 

 

 
    $(window).on("resize", function() { 
 

 
     if ($(window).width() > 767 && $('.navbar-toggle').is(':hidden')) { 
 
      $(selected).removeClass('slide-active'); 
 
     } 
 

 

 
    }); 
 

 
});
\t .containerFluid { 
 
\t width: 1280px; 
 
\t margin: 0 auto; 
 
\t } 
 
\t 
 
\t @media (max-width:767px) { 
 
\t .subMenuDiv { 
 
\t  position: realtive; 
 
\t } 
 
\t } 
 
\t 
 
\t body.slide-active { 
 
\t overflow-x: hidden 
 
\t } 
 
\t /*first child of #page-content so it doesn't shift around*/ 
 
\t 
 
\t .no-margin-top { 
 
\t margin-top: 0px!important 
 
\t } 
 
\t 
 
\t #slide-nav .navbar-toggle .icon-bar { 
 
\t background: white; 
 
\t } 
 
\t /*wrap the entire page content but not nav inside this div if not a fixed top, don't add any top padding */ 
 
\t 
 
\t #page-content { 
 
\t position: relative; 
 
\t padding-top: 70px; 
 
\t left: 0; 
 
\t } 
 
\t 
 
\t #page-content.slide-active { 
 
\t padding-top: 0 
 
\t } 
 
\t /* put toggle bars on the left :: not using button */ 
 
\t 
 
\t #slide-nav .navbar-toggle { 
 
\t cursor: pointer; 
 
\t position: relative; 
 
\t line-height: 0; 
 
\t float: left; 
 
\t margin: 0; 
 
\t width: 30px; 
 
\t height: 40px; 
 
\t padding: 10px 0 0 0; 
 
\t border: 0; 
 
\t background: transparent; 
 
\t } 
 
\t /* icon bar prettyup - optional */ 
 
\t 
 
\t #slide-nav .navbar-toggle > .icon-bar { 
 
\t width: 100%; 
 
\t display: block; 
 
\t height: 3px; 
 
\t margin: 5px 0 0 0; 
 
\t } 
 
\t 
 
\t #slide-nav .navbar-toggle.slide-active .icon-bar { 
 
\t background: orange 
 
\t } 
 
\t 
 
\t .navbar-header { 
 
\t position: relative 
 
\t } 
 
\t 
 
\t #page-content { 
 
\t width: 1280px; 
 
\t margin: 0 auto; 
 
\t } 
 
\t /* un fix the navbar when active so that all the menu items are accessible */ 
 
\t 
 
\t .navbar.navbar-fixed-top.slide-active { 
 
\t position: relative 
 
\t } 
 
\t 
 
\t @media (max-width:767px) { 
 
\t #slide-nav .container { 
 
\t  margin: 0!important; 
 
\t  padding: 0!important; 
 
\t  height: 100%; 
 
\t } 
 
\t #slide-nav .navbar-header { 
 
\t  margin: 0 auto; 
 
\t  padding: 0 15px; 
 
\t } 
 
\t #slide-nav .navbar.slide-active { 
 
\t  position: absolute; 
 
\t  width: 80%; 
 
\t  top: -1px; 
 
\t  z-index: 1000; 
 
\t } 
 
\t #slide-nav #slidemenu { 
 
\t  background: #f7f7f7; 
 
\t  left: -100%; 
 
\t  width: 80%; 
 
\t  min-width: 0; 
 
\t  position: absolute; 
 
\t  padding-left: 0; 
 
\t  z-index: 2; 
 
\t  top: -8px; 
 
\t  margin: 0; 
 
\t } 
 
\t #slide-nav #slidemenu .navbar-nav { 
 
\t  min-width: 0; 
 
\t  width: 100%; 
 
\t  margin: 0; 
 
\t } 
 
\t #slide-nav #slidemenu .navbar-nav .dropdown-menu li a { 
 
\t  min-width: 0; 
 
\t  width: 80%; 
 
\t  white-space: normal; 
 
\t } 
 
\t #slide-nav { 
 
\t  border-top: 0 
 
\t } 
 
\t #slide-nav.navbar-inverse #slidemenu { 
 
\t  background: #333 
 
\t } 
 
\t /* this is behind the navigation but the navigation is not inside it so that the navigation is accessible and scrolls*/ 
 
\t #navbar-height-col { 
 
\t  position: fixed; 
 
\t  top: 0; 
 
\t  height: 100%; 
 
\t  bottom: 0; 
 
\t  width: 80%; 
 
\t  left: -80%; 
 
\t  background: #f7f7f7; 
 
\t } 
 
\t #navbar-height-col.inverse { 
 
\t  background: #333; 
 
\t  z-index: 1; 
 
\t  border: 0; 
 
\t } 
 
\t #slide-nav .navbar-form { 
 
\t  width: 100%; 
 
\t  margin: 8px 0; 
 
\t  text-align: center; 
 
\t  overflow: hidden; 
 
\t  /*fast clearfixer*/ 
 
\t } 
 
\t #slide-nav .navbar-form .form-control { 
 
\t  text-align: center 
 
\t } 
 
\t #slide-nav .navbar-form .btn { 
 
\t  width: 100% 
 
\t } 
 
\t } 
 
\t 
 
\t @media (min-width:768px) { 
 
\t #page-content { 
 
\t  left: 0!important 
 
\t } 
 
\t .navbar.navbar-fixed-top.slide-active { 
 
\t  position: fixed 
 
\t } 
 
\t .navbar-header { 
 
\t  left: 0!important 
 
\t } 
 
\t }
<div class="navbar navbar-inverse navbar-fixed-top" role="navigation" id="slide-nav"> 
 
    <div class="containerFluid"> 
 
     <div class="navbar-header"> 
 
     <a class="navbar-toggle"> 
 
      <span class="sr-only">Toggle navigation</span> 
 
      <span class="icon-bar"></span> 
 
      <span class="icon-bar"></span> 
 
      <span class="icon-bar"></span> 
 
     </a> 
 
     </div> 
 
     <div id="slidemenu"> 
 
     <ul class="nav navbar-nav"> 
 
      <li><a href="#" data-toggle="collapse" data-target="#sec1">Section 1</a> 
 
      <div class="subMenuDiv"> 
 
       <ul class="nav nav-justified collapse" id="sec1"> 
 
       <li><a href="#" class="nav-item" id=""><span class="nav-item-name">Sub-Section 1 1</span></a></li> 
 
       <li><a href="#" class="nav-item" id=""><span class="nav-item-name">Sub-Section 1 2</span></a></li> 
 
       <li><a href="#" class="nav-item" id=""><span class="nav-item-name">Sub-Section 1 3</span></a></li> 
 
       <li><a href="#" class="nav-item" id=""><span class="nav-item-name">Sub-Section 1 4</span></a></li> 
 
       </ul> 
 
      </div> 
 
      </li> 
 
      <li><a href="#" data-toggle="collapse" data-target="#sec2">Section 2</a> 
 
      <div class="subMenuDiv"> 
 
       <ul class="nav nav-justified collapse" id="sec2"> 
 
       <li><a href="#" class="nav-item" id=""><span class="nav-item-name">Sub-Section 2 1</span></a></li> 
 
       <li><a href="#" class="nav-item" id=""><span class="nav-item-name">Sub-Section 2 2</span></a></li> 
 
       <li><a href="#" class="nav-item" id=""><span class="nav-item-name">Sub-Section 2 3</span></a></li> 
 
       <li><a href="#" class="nav-item" id=""><span class="nav-item-name">Sub-Section 2 3</span></a></li> 
 
       </ul> 
 
      </div> 
 
      </li> 
 
      <li><a href="#" data-toggle="collapse" data-target="#xbprom">Section 3</a> 
 
      <div class="subMenuDiv"> 
 
       <ul class="nav nav-justified collapse" id="xbprom"> 
 
       <li><a href="#" class="xbnav-item" id=""><span class="xbnav-item-name">Sub-Section 3 1</span></a></li> 
 
       <li><a href="#" class="xbnav-item" id=""><span class="xbnav-item-name">Sub-Section 3 2</span></a></li> 
 
       <li><a href="#" class="xbnav-item" id=""><span class="xbnav-item-name">Sub-Section 3 3</span></a></li> 
 
       </ul> 
 
      </div> 
 
      </li> 
 
     </ul>

Voici un https://jsfiddle.net/8j600vmd/4/ Fiddle Certains éléments de style manquent par souci de concision.

Répondre

1

Voici une méthode pour le faire: Déplacez le subMenuDiv hors des <li>, puis placez les sous-menus dans ce div. De cette façon, ils apparaissent sous le menu, sans que vous ayez à utiliser la position: absolue. Xnay certains des flotteurs et le texte aligner au centre, et l'alto! Je n'ai pas ajouté dans le js pour rendre les autres proches.

https://jsfiddle.net/meinkep2/8j600vmd/6/

+0

Je aime cette méthode, mais quand il est replié, les sous-menus sont requises pour figurer sous leur parent respectif ... – RPM

+0

donc pas pleine largeur ou en ligne, comme un menu déroulant normal? –

+0

Oui ... si vous condensez mon violon d'origine, vous verrez le comportement désiré, quoique stylisé de sorte que les sous-sections soient alignées à gauche et indentées. – RPM