2017-04-14 3 views
-1

Ich möchte jquery aus meiner Bootstrap-Vorlage entfernen, da ich keine JS-Komponenten verwende. Also habe ich es entfernt und Fallback-Code für navbar-toggle in reinem JS hinzugefügt (überprüfen Sie Attached JSFiddle). Jetzt möchte ich die Navigationsleiste umschalten (mit CSS oder reinem JS).Animiere Navbar-Kollaps mit reinem JS & CSS

Ich versuchte Übergangseigenschaft mit Max-Höhe. Aber ich kenne die endgültige Höhe nicht, da es ein Drop-Down-Fenster gibt. Wenn ich also eine große Höhe verwende, ist der Zusammenbruch verzögert.

Ich habe eine JSFiddle anhand eines Beispiels Vorlage aus getBootstrap erstellt: https://jsfiddle.net/c5f82stw/

// Navbar and dropdowns 
 
var toggle = document.getElementsByClassName('navbar-toggle')[0], 
 
    collapse = document.getElementsByClassName('navbar-collapse')[0], 
 
    dropdowns = document.getElementsByClassName('dropdown');; 
 

 
// Toggle if navbar menu is open or closed 
 
function toggleMenu() { 
 
    collapse.classList.toggle('collapse'); 
 
    collapse.classList.toggle('in'); 
 
} 
 

 
// Close all dropdown menus 
 
function closeMenus() { 
 
    for (var j = 0; j < dropdowns.length; j++) { 
 
    dropdowns[j].getElementsByClassName('dropdown-toggle')[0].classList.remove('dropdown-open'); 
 
    dropdowns[j].classList.remove('open'); 
 
    } 
 
} 
 

 
// Add click handling to dropdowns 
 
for (var i = 0; i < dropdowns.length; i++) { 
 
    dropdowns[i].addEventListener('click', function() { 
 
    if (document.body.clientWidth < 768) { 
 
     var open = this.classList.contains('open'); 
 
     closeMenus(); 
 
     if (!open) { 
 
     this.getElementsByClassName('dropdown-toggle')[0].classList.toggle('dropdown-open'); 
 
     this.classList.toggle('open'); 
 
     } 
 
    } 
 
    }); 
 
} 
 

 
// Close dropdowns when screen becomes big enough to switch to open by hover 
 
function closeMenusOnResize() { 
 
    if (document.body.clientWidth >= 768) { 
 
    closeMenus(); 
 
    collapse.classList.add('collapse'); 
 
    collapse.classList.remove('in'); 
 
    } 
 
} 
 

 
// Event listeners 
 
window.addEventListener('resize', closeMenusOnResize, false); 
 
toggle.addEventListener('click', toggleMenu, false);
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" /> 
 
<div class="container"> 
 

 
    <!-- Static navbar --> 
 
    <nav class="navbar navbar-default"> 
 
    <div class="container-fluid"> 
 
     <div class="navbar-header"> 
 
     <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"> 
 
       <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="#">Project name</a> 
 
     </div> 
 
     <div id="navbar" class="navbar-collapse collapse"> 
 
     <ul class="nav navbar-nav"> 
 
      <li class="active"><a href="#">Home</a></li> 
 
      <li><a href="#">About</a></li> 
 
      <li><a href="#">Contact</a></li> 
 
      <li class="dropdown"> 
 
      <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></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 role="separator" class="divider"></li> 
 
       <li class="dropdown-header">Nav header</li> 
 
       <li><a href="#">Separated link</a></li> 
 
       <li><a href="#">One more separated link</a></li> 
 
      </ul> 
 
      </li> 
 
     </ul> 
 
     <ul class="nav navbar-nav navbar-right"> 
 
      <li class="active"><a href="./">Default <span class="sr-only">(current)</span></a></li> 
 
      <li><a href="../navbar-static-top/">Static top</a></li> 
 
      <li><a href="../navbar-fixed-top/">Fixed top</a></li> 
 
     </ul> 
 
     </div> 
 
     <!--/.nav-collapse --> 
 
    </div> 
 
    <!--/.container-fluid --> 
 
    </nav> 
 

 
    <!-- Main component for a primary marketing message or call to action --> 
 
    <div class="jumbotron"> 
 
    <h1>Navbar example</h1> 
 
    <p>This example is a quick exercise to illustrate how the default, static navbar and fixed to top navbar work. It includes the responsive CSS and HTML, so it also adapts to your viewport and device.</p> 
 
    <p> 
 
     <a class="btn btn-lg btn-primary" href="../../components/#navbar" role="button">View navbar docs &raquo;</a> 
 
    </p> 
 
    </div> 
 

 
</div> 
 
<!-- /container -->

Antwort

0

Ich weiß, das ist nicht möchte ich wollte. Ich war auf der Suche nach etwas JS.

Fine Tune maximale Höhe für Ihre Bedürfnisse. Und das Dropdown würde zusätzliche Höhe benötigen, um zu arbeiten. Merk dir das.

.navbar-collapse.in 

    max-height: 65em; 

JSFiddle: https://jsfiddle.net/g3hwf2yo/2/

.navbar-collapse{ 
    max-height: 0px; 
transition: max-height 0.5s cubic-bezier(0, 1, 0, 1); 
background: #d5d5d5; 
overflow: hidden; 
display: block; 
    margin-top: 0.5em; 
} 
.navbar-collapse.in { 

    max-height: 65em; 
    transition: max-height 1s ease-in-out; 
} 

Dies verwendet kubischen Bezier zur Feinabstimmung der Animation.

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" /> 
<div class="container"> 

    <!-- Static navbar --> 
    <nav class="navbar navbar-default"> 
    <div class="container-fluid"> 
     <div class="navbar-header"> 
     <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"> 
       <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="#">Project name</a> 
     </div> 
     <div id="navbar" class="navbar-collapse collapse"> 
     <ul class="nav navbar-nav"> 
      <li class="active"><a href="#">Home</a></li> 
      <li><a href="#">About</a></li> 
      <li><a href="#">Contact</a></li> 
      <li class="dropdown"> 
      <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></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 role="separator" class="divider"></li> 
       <li class="dropdown-header">Nav header</li> 
       <li><a href="#">Separated link</a></li> 
       <li><a href="#">One more separated link</a></li> 
      </ul> 
      </li> 
     </ul> 
     <ul class="nav navbar-nav navbar-right"> 
      <li class="active"><a href="./">Default <span class="sr-only">(current)</span></a></li> 
      <li><a href="../navbar-static-top/">Static top</a></li> 
      <li><a href="../navbar-fixed-top/">Fixed top</a></li> 
     </ul> 
     </div> 
     <!--/.nav-collapse --> 
    </div> 
    <!--/.container-fluid --> 
    </nav> 

    <!-- Main component for a primary marketing message or call to action --> 
    <div class="jumbotron"> 
    <h1>Navbar example</h1> 
    <p>This example is a quick exercise to illustrate how the default, static navbar and fixed to top navbar work. It includes the responsive CSS and HTML, so it also adapts to your viewport and device.</p> 
    <p> 
     <a class="btn btn-lg btn-primary" href="../../components/#navbar" role="button">View navbar docs &raquo;</a> 
    </p> 
    </div> 

</div> 
<!-- /container --> 

Haben JS

// Navbar and dropdowns 
var toggle = document.getElementsByClassName('navbar-toggle')[0], 
    collapse = document.getElementsByClassName('navbar-collapse')[0], 
    dropdowns = document.getElementsByClassName('dropdown');; 

// Toggle if navbar menu is open or closed 
function toggleMenu() { 
    collapse.classList.toggle('collapse'); 
    collapse.classList.toggle('in'); 
} 

// Close all dropdown menus 
function closeMenus() { 
    for (var j = 0; j < dropdowns.length; j++) { 
    dropdowns[j].getElementsByClassName('dropdown-toggle')[0].classList.remove('dropdown-open'); 
    dropdowns[j].classList.remove('open'); 
    } 
} 

// Add click handling to dropdowns 
for (var i = 0; i < dropdowns.length; i++) { 
    dropdowns[i].addEventListener('click', function() { 
    if (document.body.clientWidth < 768) { 
     var open = this.classList.contains('open'); 
     closeMenus(); 
     if (!open) { 
     this.getElementsByClassName('dropdown-toggle')[0].classList.toggle('dropdown-open'); 
     this.classList.toggle('open'); 
     } 
    } 
    }); 
} 

// Close dropdowns when screen becomes big enough to switch to open by hover 
function closeMenusOnResize() { 
    if (document.body.clientWidth >= 768) { 
    closeMenus(); 
    collapse.classList.add('collapse'); 
    collapse.classList.remove('in'); 
    } 
} 

// Event listeners 
window.addEventListener('resize', closeMenusOnResize, false); 
toggle.addEventListener('click', toggleMenu, false); 

Endlich ein schöner Tag!