File size: 3.41Kb
/* Helper functions */
function _hasClass(elem, className) {
return new RegExp(' ' + className + ' ').test(' ' + elem.className + ' ');
}
function _toggleClass(elem, className) {
var newClass = ' ' + elem.className.replace(/[\t\r\n]/g, ' ') + ' ';
if ( _hasClass(elem, className) ) {
while (newClass.indexOf(' ' + className + ' ') >= 0) {
newClass = newClass.replace(' ' + className + ' ', ' ');
}
elem.className = newClass.replace(/^\s+|\s+$/g, '');
} else {
elem.className += ' ' + className;
}
}
/* ResponsiveMenu Class constructor */
function ResponsiveMenu(settings) {
if(!settings) return;
this.nav = document.getElementsByClassName(settings.navClass)[0];
this.mobile = settings.mobileClass;
this.toggle = document.getElementsByClassName(settings.toggleClass)[0];
this.innerToggle = settings.innerToggle ? document.getElementsByClassName(settings.innerToggle) : false;
this.navOpen = settings.navOpen || 'nav-mobile-open';
this.toggleActive = settings.toggleActive || 'nav-active';
this.innerToggleActive = settings.innerToggleActive || 'nav-active-inner';
this.jQuery = (window.jQuery) ? jQuery : false;
this.init();
}
ResponsiveMenu.prototype.createMenu = function() {
this.mobileElem = document.createElement('div');
this.mobileElem.className = this.mobile;
this.nav.appendChild(this.mobileElem);
};
ResponsiveMenu.prototype.bindHandlers = function() {
var _self = this;
var piece = void 0;
this.mobileElem.addEventListener('click', function() {
if(_self.jQuery) {
_self.jQuery(_self.toggle).slideToggle(function() {
_self.jQuery(this).attr('style', '');
_toggleClass(this, _self.navOpen);
_toggleClass(_self.toggle, _self.toggleActive);
});
}
else {
_toggleClass(this, _self.navOpen);
_toggleClass(_self.toggle, _self.toggleActive);
}
});
if( this.innerToggle && !this.jQuery ) {
for( piece in this.innerToggle ) {
if( !isNaN( parseInt(piece) ) ) {
this.innerToggle[piece].addEventListener('click', function() {
_toggleClass(this, _self.innerToggleActive);
});
}
}
}
if( this.jQuery ) {
this.jQuery( this.innerToggle ).on({
click: function() {
var trigger = this;
var menu = jQuery(this).find('ul');
menu.slideToggle(function() {
_toggleClass(trigger, _self.innerToggleActive);
});
}
});
}
};
ResponsiveMenu.prototype.init = function() {
this.createMenu();
this.bindHandlers();
};
(function () {
var r_menu = new ResponsiveMenu({
navClass: 'nav', // Main navigation container => CSS Selector
mobileClass: 'nav-mobile', // Class for the mobile navigation trigger to create and append => not a Selector
toggleClass: 'nav-list', // Class of the navigation list (the <ul> for example) => CSS Selector
innerToggle: 'has-inner', // Class of inner toggle elements => CSS Selector, parents of sub elements
innerToggleClass: 'nav-inner', // Class for inner navigation => CSS Selector
/* Open State */
navOpen: 'nav-mobile-open',
toggleActive: 'nav-active',
innerToggleActive: 'nav-active-inner'
});
})();