Menú adaptable de varios niveles en Vanilla JavaScript-última navegación

Tiempo de ejecución: 30 minutos. Empezar

Autor: Michal Niewitala
Views Total: 1,054
Sitio oficial: Ir a la web
Actualizado: November 11, 2017
Licencia: MIT

Vista prévia

Menú adaptable de varios niveles en Vanilla JavaScript-última navegación

Descripción

Toastinette es un plugin de notificación JavaScript muy pequeño para mostrar los mensajes del brindis inspirados en material Design en la Página Web.

Funcionamiento

Toastinette es un plugin de notificación JavaScript muy pequeño para mostrar los mensajes del brindis inspirados en material Design en la Página Web.

<header id="header">

<nav class="nav container" id="nav">


<ul class="menu">



<li class="menu-item"><a href="">Home</a>



</li>



<li class="menu-item"><a href="">Templates</a>




<ul class="sub-menu">





<li><a href="">Gallery</a>






<ul class="sub-menu">







<li><a href="">One</a></li>







<li><a href="">Wwo</a></li>






</ul>





</li>





<li><a href="">Post</a>





</li>




</ul>



</li>



<li class="menu-item"><a href="">About</a>



</li>



<li class="menu-item"><a href="">Portfolio</a>




<ul class="sub-menu">





<li><a href="">Best_project</a>





</li>





<li><a href="">Second</a>





</li>





<li><a href="">Last</a>






<ul class="sub-menu">







<li><a href="">Showcase</a></li>






</ul>





</li>




</ul>



</li>



<li class="menu-item"><a href="">Contact</a>



</li>


</ul>

</nav>
</header>

Toastinette es un plugin de notificación JavaScript muy pequeño para mostrar los mensajes del brindis inspirados en material Design en la Página Web.

(function() {

var block, i, j, len, len1, ref, ref1, responsiveMenu, slideToggler, trigger,


bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },


indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };


slideToggler = (function() {


function slideToggler(el1) {



this.el = el1;



this.toggle = bind(this.toggle, this);



this.getHeight = bind(this.getHeight, this);



if (!this.el) {




return;



}



window.addEventListener('resize', this.getHeight);


}



slideToggler.prototype.getHeight = function() {



var clone;



clone = this.el.cloneNode(true);



clone.style.cssText = 'visibility: hidden; display: block; margin: -999px 0';



this.height = (this.el.parentNode.appendChild(clone)).clientHeight;



this.el.parentNode.removeChild(clone);



return this.height;


};



slideToggler.prototype.toggle = function(time) {



var currHeight, disp, el, end, init, ref, repeat, start;



this.getHeight();



time || (time = this.height / 3 + 150);



currHeight = this.el.clientHeight * (getComputedStyle(this.el).display !== 'none');



ref = currHeight > this.height / 2 ? [this.height, 0] : [0, this.height], start = ref[0], end = ref[1];



disp = end - start;



el = this.el;



this.el.classList[end === 0 ? 'remove' : 'add']('open');



this.el.style.cssText = "overflow: hidden; display: block;";



init = (new Date).getTime();



repeat = function() {




var i, instance, ref1, repeatLoop, results, step;




instance = (new Date).getTime() - init;




step = start + disp * instance / time;




if (instance <= time) {





el.style.height = step + 'px';




} else {





el.style.cssText = "display: " + (end === 0 ? 'none' : 'block');




}




repeatLoop = requestAnimationFrame(repeat);




if (ref1 = Math.floor(step), indexOf.call((function() {





results = [];





for (var i = start; start <= end ? i <= end : i >= end; start <= end ? i++ : i--){ results.push(i); }





return results;




}).apply(this), ref1) < 0) {





return cancelAnimationFrame(repeatLoop);




}



};



return repeat();


};



return slideToggler;


})();


ref = document.querySelectorAll('.block');

for (i = 0, len = ref.length; i < len; i++) {


block = ref[i];


block.toggler = new slideToggler(block);

}


ref1 = document.querySelectorAll('button');

for (j = 0, len1 = ref1.length; j < len1; j++) {


trigger = ref1[j];


trigger.addEventListener('click', function() {



var ref2;



return (ref2 = this.parentNode.querySelector('.block').toggler) != null ? ref2.toggle() : void 0;


});

}


responsiveMenu = (function() {


function responsiveMenu(nav, opt) {



var base, k, l, len2, len3, len4, m, menu, menuToggle, ref2, ref3, ref4, sub, subMenu, subMenuToggle;



this.opt = opt;



this.breaking = bind(this.breaking, this);



this.createToggle = bind(this.createToggle, this);



(base = this.opt).breaking || (base.breaking = '640px');



this.opt.maxBreaking = parseInt(this.opt.maxBreaking) || 1040;



menu = nav.querySelector('.menu');



if (!slideToggler) {




slideToggler = (function() {





function slideToggler(el1) {






this.el = el1;






this.toggle = bind(this.toggle, this);






if (!this.el) {







return;






}





}






slideToggler.prototype.toggle = function() {






this.el.classList.toggle('open');






return this.el.style.cssText = "display: " + (this.el.classList.contains('open') ? 'block' : 'none');





};






return slideToggler;





})();



}



ref2 = menu.querySelectorAll('ul');



for (k = 0, len2 = ref2.length; k < len2; k++) {




sub = ref2[k];




sub.toggler = new slideToggler(sub);



}



menuToggle = this.createToggle(nav, 'menu-toggle', 'Menu');



menuToggle.addEventListener('click', function() {




document.documentElement.classList.toggle('nav-open');




return menuToggle.menu.classList.toggle('open', document.documentElement.classList.contains('nav-open'));



});



ref3 = menu.querySelectorAll('ul');



for (l = 0, len3 = ref3.length; l < len3; l++) {




subMenu = ref3[l];




subMenu.parentNode.classList.add('has-children');




subMenuToggle = this.createToggle(subMenu, 'sub-menu-toggle', '+');




subMenuToggle.addEventListener('click', function() {





var len4, m, open, ref4, results;





this.menu.toggler.toggle();





ref4 = this.parentNode.parentNode.querySelectorAll('ul.open');





results = [];





for (m = 0, len4 = ref4.length; m < len4; m++) {






open = ref4[m];






if (open !== this.menu) {







results.push(open.toggler.toggle());






} else {







results.push(void 0);






}





}





return results;




});



}



ref4 = menu.querySelectorAll('.has-children[class*=current] > ul');



for (m = 0, len4 = ref4.length; m < len4; m++) {




sub = ref4[m];




sub.classList.add('open');



}



document.addEventListener('DOMContentLoaded', this.breaking);



window.addEventListener('resize', this.breaking);



setTimeout(this.breaking, 3000);


}



responsiveMenu.prototype.createToggle = function(menu, klass, label) {



var toggle;



toggle = menu.parentNode.querySelector("." + klass) || document.createElement("button");



toggle.classList.add(klass);



toggle.appendChild(document.createTextNode(label));



toggle.menu = menu.nodeName === 'UL' ? menu : menu.querySelector('.menu');



return menu.parentNode.insertBefore(toggle, menu.nextSibling);


};



responsiveMenu.prototype.breaking = function() {



var div, el, isMobile, k, len2, ref2, windowWidth;



document.body.classList.remove('menu-mobile');



document.body.classList.add('menu-desktop');



div = document.createElement('div');



div.style.cssText = "position: absolute; width: " + this.opt.breaking;



document.body.appendChild(div);



this.menuBreak = div.clientWidth || 0;



document.body.removeChild(div);



ref2 = document.querySelectorAll("" + this.opt.breaking);



for (k = 0, len2 = ref2.length; k < len2; k++) {




el = ref2[k];




this.menuBreak += this.getWidth(el);



}



isMobile = (windowWidth = document.body.clientWidth) <= Math.min(this.menuBreak, this.opt.maxBreaking);



document.body.classList.toggle('menu-mobile', isMobile);



document.body.classList.toggle('menu-desktop', !isMobile);



if (!isMobile) {




return document.documentElement.classList.remove('nav-open');



}


};



responsiveMenu.prototype.getWidth = function(el) {



var clone, width;



if (el.clientWidth > 0) {




return el.clientWidth;



}



clone = el.cloneNode(true);



clone.style.cssText = 'position: absolute; visibility: hidden; display: block;';



el.parentNode.appendChild(clone);



width = clone.clientWidth;



el.parentNode.removeChild(clone);



return width;


};



return responsiveMenu;


})();


new responsiveMenu(document.querySelector('#nav'), {


breaking: '.logo, .tagline, .menu'

});

}).call(this);

Te puede interesar: